QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#328518#1844. CactuslefyWA 167ms63648kbC++142.7kb2024-02-15 20:38:272024-02-15 20:38:28

Judging History

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

  • [2024-02-15 20:38:28]
  • 评测
  • 测评结果:WA
  • 用时:167ms
  • 内存:63648kb
  • [2024-02-15 20:38:27]
  • 提交

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];
void Tarjan(int x){
    dfn[x]=low[x]=++idd;
    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]){
                dcc++;int y=0;
                b[dcc+n].push_back(x);b[x].push_back(dcc+n);
                while(1){
                    y=st[top--].second;
                    b[y].push_back(dcc+n),b[dcc+n].push_back(y);
                    if(st[top+1]==make_pair(x,v))break;
                }
            }
        }else low[x]=min(low[x],dfn[v]);
    }
}
void dfs(int x,int fa){
    vis[x]=1;
    for(int v:b[x])if(v!=fa)dfs(v,x);
    if(x<=n)return;
    int sz=b[x].size();
    for(int i=1;i<sz;i+=2)if(sz-i==3){
        ans.push_back(b[x][sz-1]),
        ans.push_back(b[x][sz-2]+n),
        ans.push_back(b[x][sz-1]+n),
        ans.push_back(b[x][sz-3]),
        ans.push_back(b[x][sz-3]+n);
        if(i!=1)swap(ans[ans.size()-1],ans[ans.size()-2]);
        break;
    }else{
        // if(b[x][i]==147636||b[x][i+1]==147636)cout<<b[x][i+1]<<" "<<b[x][0]<<"\n";
        // if(i+1>=sz)cout<<hav[x][0]<<" "<<hav[x][1]<<" "<<sz<<" "<<x<< "\n";
        if(i==1)ans.push_back(b[x][i]),ans.push_back(b[x][i+1]+n),ans.push_back(b[x][i+1]),ans.push_back(b[x][i]+n);
        else ans.push_back(b[x][i+1]),ans.push_back(b[x][i]),ans.push_back(b[x][i]+n),ans.push_back(b[x][i+1]+n);
    }
}
void solve2(){
    ans.push_back(-1);int sz=ans.size();
    for(int i=0;i<sz-1;i++)ans.push_back(ans[i]);
    for(int i=1;i<=n;i++)if(!vis[i]&&!dfn[i])Tarjan(i);
    for(int i=1;i<=dcc;i++)if(!vis[n+i]){
        if(n>=1000)cout<<i<<"\n";
        dfs(n+i,0);
        ans.push_back(b[n+i][0]);
    }
}
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());
    int flag=0;
    for(int x:ans){
        if(x==-1)printf("2\n");
        else printf("1 %d\n",x);
    }
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 6ms
memory: 46052kb

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: 10ms
memory: 45980kb

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: 167ms
memory: 63648kb

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:

1
3
5
6
7
9
10
13
14
15
16
18
21
23
29
32
35
42
43
46
48
49
50
51
53
54
55
56
57
58
59
61
62
64
65
66
67
72
76
86
87
90
91
92
93
94
97
101
102
103
106
108
110
111
115
117
118
120
121
130
131
132
133
134
135
137
138
139
143
155
156
158
165
173
176
177
180
183
185
188
196
197
198
206
210
211
213
217
2...

result:

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