QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#328393 | #1844. Cactus | lefy | WA | 121ms | 83448kb | C++14 | 3.3kb | 2024-02-15 19:52:45 | 2024-02-15 19:52:46 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10;
vector<int>e[N];
void add(int u,int v){
e[u].push_back(v);
}
vector<int>ans;
int du[N<<1],n,m,vis[N];
void solve1(){
queue<int>q;
for(int i=1;i<=n;i++)if(du[i]&1)q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
if(vis[x]||du[x]%2==0)continue;
vis[x]=1;du[x]=0;
for(int v:e[x])if(!vis[v]){
du[v]--;
if(du[v]&1)q.push(v);
}
ans.push_back(x);
}
}
int dcc,be[N],dfn[N],low[N],idd,top;
pair<int,int>st[N];
vector<int>b[N<<1],hav[N];
void Tarjan(int x){
dfn[x]=low[x]=++idd;
if(x==968||x==14118||x==7310)cout<<x<<"\n";
for(int v:e[x])if(!vis[v]){
if(!dfn[v]){
st[++top]={x,v};
Tarjan(v);
low[x]=min(low[x],low[v]);
if(low[v]>=dfn[x]){
// cout<<x<<" "<<v<<"*\n";
dcc++;int y=0;
b[dcc+n].push_back(x);b[x].push_back(dcc+n);
du[x]++,du[dcc+n]++;hav[dcc].push_back(x);
while(1){
y=st[top--].second;
hav[dcc].push_back(y);
// cout<<y<<" ";
if(x==968)cout<<y<<"*\n";
b[y].push_back(dcc+n),b[dcc+n].push_back(y);
du[y]++,du[dcc+n]++;
if(st[top+1]==make_pair(x,v))break;
}
// cout<<x<<"\n";
}
}else low[x]=min(low[x],dfn[v]);
}
}
void solve2(){
ans.push_back(-1);int sz=ans.size();
for(int i=0;i<sz-1;i++)ans.push_back(ans[i]);
if(n>1000){
// cout<<du[968]<<" "<<du[14118]<<"\n";
// for(int v:e[968])if(!vis[v])cout<<v<<"\n";
}
memset(du,0,sizeof(du));
for(int i=1;i<=n;i++)if(!vis[i]&&!dfn[i])Tarjan(i);
queue<int>q;for(int i=1;i<=n+dcc;i++)if(du[i]==1)q.push(i);
int tmp=0;
while(!q.empty()){
int x=q.front();q.pop();
for(int v:b[x]){
du[v]--;
if(du[v]==1)q.push(v);
}
if(x<=n)continue;x-=n;
int sz=hav[x].size();
tmp=hav[x][0];
for(int i=1;i<sz;i+=2)if(sz-i==3){
ans.push_back(hav[x][sz-1]);
ans.push_back(hav[x][sz-2]+n);
ans.push_back(hav[x][sz-3]+n);
ans.push_back(hav[x][sz-3]);
if(i==1)ans.push_back(hav[x][sz-2]);
ans.push_back(hav[x][sz-1]+n);
}else{
if(i+1>=sz)cout<<hav[x][0]<<" "<<hav[x][1]<<"\n";
if(i==1)ans.push_back(hav[x][i]),ans.push_back(hav[x][i+1]+n),ans.push_back(hav[x][i+1]),ans.push_back(hav[x][i]+n);
else ans.push_back(hav[x][i+1]),ans.push_back(hav[x][i]),ans.push_back(hav[x][i]+n),ans.push_back(hav[x][i+1]+n);
}
}
ans.push_back(tmp);
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
du[x]++,du[y]++;
}
solve1();
if(ans.size()!=n)solve2();
printf("0 %d\n",(int)ans.size());
for(int x:ans){
if(n<=1000){
if(x==-1)printf("2\n");
else if(x<=2*n)printf("1 %d\n",x);
}else if(x>2*n)cout<<x<<"**\n";
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 4ms
memory: 66488kb
input:
3 3 1 2 1 3 2 3
output:
0 6 2 1 3 1 5 1 2 1 6 1 1
result:
ok You are right!
Test #2:
score: 0
Accepted
time: 8ms
memory: 68528kb
input:
7 7 1 2 1 3 2 3 2 4 2 5 3 6 3 7
output:
0 14 1 4 1 5 1 6 1 7 2 1 4 1 5 1 6 1 7 1 3 1 9 1 2 1 10 1 1
result:
ok You are right!
Test #3:
score: -100
Wrong Answer
time: 121ms
memory: 83448kb
input:
300000 368742 1 143504 1 234282 2 91276 2 296320 3 274816 4 212293 4 258214 5 253489 5 295826 6 96521 6 252745 6 267103 6 269879 7 5293 7 295586 8 44304 8 57067 8 233291 9 190526 10 18682 11 7440 12 24695 12 172561 12 243692 12 280316 13 80152 13 268749 14 146394 14 207280 15 151280 15 226848 16 458...
output:
968 7310 14118 14118* 263834* 7310* 968 14118 6618 15375 11140 18880 117717 38302 25023 216258 42373 170515 49103 64032 30153 234827 21423 284014 36319 43785 27811 83733 12170 219304 14460 264563 62054 203336 25296 171950 48786 79519 147815 81745 55168 73337 27710 85708 24705 104911 30084 291804 694...
result:
wrong answer Integer parameter [name=m'] equals to 968, violates the range [0, 0]