QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#328386#1844. CactuslefyWA 146ms84848kbC++143.3kb2024-02-15 19:50:382024-02-15 19:50:39

Judging History

你现在查看的是最新测评结果

  • [2024-02-15 19:50:39]
  • 评测
  • 测评结果:WA
  • 用时:146ms
  • 内存:84848kb
  • [2024-02-15 19:50:38]
  • 提交

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==89||x==155249||x==71561)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==89)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;
}

详细

Test #1:

score: 100
Accepted
time: 7ms
memory: 66840kb

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: 3ms
memory: 66528kb

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: 146ms
memory: 84848kb

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:

2 2
7310
14118
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
69450 295167
32923 14418...

result:

wrong answer Integer parameter [name=m'] equals to 2, violates the range [0, 0]