QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#791135 | #9551. The Emperor | ucup-team5217# | WA | 0ms | 3612kb | C++23 | 2.7kb | 2024-11-28 17:04:24 | 2024-11-28 17:04:24 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using ll =long long;
#define int long long
int fa[2010];
int siz[2010];
const ll M=998244353;
int get(int x){
if(fa[x]==x) return x;
int t=get(fa[x]);
siz[x]=(siz[x]+siz[fa[x]])%M;
return fa[x]=t;
}
void merge(int u,int f,ll len){
fa[u]=f;siz[u]=len;
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++) {fa[i]=i;siz[i]=0;}
vector<string> s(n+1);
vector<bool> ex(n+1);
for(int i=0;i<=n;i++) getline(cin, s[i]);
vector<array<int,4>> mp(n+1);
auto getf=[&](string & s,int pz)->pair<int,int> {
int ans=0;
while(pz<(int)s.size()){
if(s[pz]<='9'&&s[pz]>='0') ans=ans*10+s[pz++]-'0';
else break;
}
return {ans,pz};
};
for(int i=1;i<=n;i++){
if(s[i].substr(0,4)=="HALT"){
pair<int,int> w1=getf(s[i],11);
pair<int,int> w2=getf(s[i],w1.second+6);
mp[i]={-1,-1,w1.first,w2.first};
}
else{
pair<int,int> w1=getf(s[i],4);
pair<int,int> w2=getf(s[i],w1.second+6);
pair<int,int> w3=getf(s[i],w2.second+7);
pair<int,int> w4=getf(s[i],w3.second+6);
mp[i]={w1.first,w2.first,w3.first,w4.first};
}
// for(int j=0;j<4;j++) cerr<<mp[i][j]<<' ';
// cerr<<'\n';
}
vector<array<int,3>> stk;//num,ope,pz
int pz=1;
vector<bool> flag(n+1);
int pre=-1;
ll ans=1;
int tot=0;
while (1){
// tot++;
// cerr<<"!!!"<<fa[pz]<<' '<<fa[fa[pz]]<<' '<<fa[fa[fa[pz]]]<<'\n';
// cerr<<"___\n";
// cerr<<pz<<' '<<pre<<' '<<' '<<tot<<'\n';
// for(auto [x,y,z]:stk){
// cerr<<x<<' '<<y<<' '<<z<<'\n';
// }
// cerr<<"___\n";
if(pre!=-1) {flag[pre]=0;pre=-1;}
if(!stk.empty()&&mp[pz][0]==stk.back()[0]){
pre=stk.back()[2];ans=(ans+1)%M;
if(get(mp[pz][1])==stk.back()[2]) ex[stk.back()[2]]=1;
else merge(stk.back()[2],mp[pz][1],(ans-stk.back()[1])%M);
stk.pop_back();
pz=mp[pz][1];
continue;
}
int nxt=get(pz);
if(mp[pz][0]==-1||mp[nxt][0]==-1){
if(stk.size()==0){
cout<<(ans%M+M)%M<<'\n';
return ;
}
}
ans=(ans+siz[pz]+1)%M;
if(flag[pz]||flag[nxt]||ex[pz]||ex[nxt]) {cout<<"-1\n";return ;}
pz=nxt;
int num=mp[pz][2];
stk.push_back({num,ans,pz});
flag[pz]=1;
pz=mp[pz][3];
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
int _ =1;
// cin>>_;
while(_--) solve();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3556kb
input:
1 HALT; PUSH 1 GOTO 1
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3556kb
input:
5 POP 1 GOTO 2; PUSH 1 GOTO 2 HALT; PUSH 1 GOTO 3 POP 1 GOTO 4; PUSH 2 GOTO 4 POP 1 GOTO 2; PUSH 2 GOTO 4 HALT; PUSH 99 GOTO 4
output:
5
result:
ok 1 number(s): "5"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3612kb
input:
1 POP 1 GOTO 1; PUSH 1 GOTO 1
output:
-1
result:
ok 1 number(s): "-1"
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 3560kb
input:
61 POP 62 GOTO 61; PUSH 30 GOTO 60 POP 1 GOTO 3; PUSH 62 GOTO 61 POP 2 GOTO 61; PUSH 62 GOTO 61 POP 4 GOTO 7; PUSH 2 GOTO 61 POP 62 GOTO 61; PUSH 3 GOTO 4 POP 62 GOTO 61; PUSH 3 GOTO 5 POP 5 GOTO 10; PUSH 3 GOTO 6 POP 62 GOTO 61; PUSH 4 GOTO 7 POP 62 GOTO 61; PUSH 4 GOTO 8 POP 6 GOTO 12; PUSH 4 GOTO...
output:
-1
result:
wrong answer 1st numbers differ - expected: '150994941', found: '-1'