QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#327600 | #1844. Cactus | Call_me_Eric | RE | 4ms | 20972kb | C++17 | 2.9kb | 2024-02-15 11:16:11 | 2024-02-15 11:16:11 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
bool stmemory;
namespace Call_me_Eric{
inline int read(){
int x = 0, f = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
return x * f;
}
const int maxn = 3e5 + 10;
int n, m;
vector<int> edg[maxn], ans;
bool deg[maxn], dl[maxn];
inline void op(int x){ans.push_back(x);}
inline void del(int x){
op(x);deg[x] = 0;dl[x] = 1;
for(int v : edg[x])if(!dl[v])deg[v] ^= 1;
for(int v : edg[x])if(!dl[v] && deg[v])del(v);
}
int idx, dfn[maxn], low[maxn], cnt;
stack<int> stk;
vector<int> e2[maxn];//建立一颗圆方树方便找答案
void dfs(int u){
dfn[u] = low[u] = ++idx;stk.push(u);
for(int v : edg[u]){
if(!dfn[v]){
dfs(v);
if(low[v] >= dfn[u]){
cnt++;int w = stk.top();
do{
w = stk.top();stk.pop();
e2[w].push_back(cnt);e2[cnt].push_back(w);
}while(w != v);
e2[u].push_back(cnt);e2[cnt].push_back(u);
}
else low[u] = min(low[v],low[u]);
}
else low[u] = min(dfn[v],low[u]);
}
}
bool vis[maxn];
void work(int u,int pre){
vis[u] = 1;
for(int v : e2[u])if(v != pre)work(v, u);
if(u <= n){if(!pre)op(u);return;}//特判一下最后一个环
int pos = 0;//找与其他环相邻的那个点p。
for(int j = 0;j < e2[u].size();j++)if(e2[u][j] == pre)pos = j;
vector<int> a;a.clear();//以p为开始将整个环展开
for(int j = 0;j < e2[u].size();j++){a.push_back(e2[u][(j + pos) % e2[u].size()]);}
int m = a.size() - 1;
for(int j = 1;j <= m;j++)op(a[j] + ((j & 1) == 0) * n);
op(a[m] + (m & 1) * n);op(a[1] + n);
}
void main(){
n = read(); m = read();int u, v;cnt = n;
for(int i = 1;i <= m;i++){
u = read(), v = read();
deg[u] ^= 1;deg[v] ^= 1;
edg[u].push_back(v);edg[v].push_back(u);
}
for(int i = 1;i <= n;i++)if(deg[i])del(i);
for(int i = 1;i <= n;i++)
if(!dl[i]){
vector<int> tmp;tmp.clear();
for(int v : edg[i])if(!dl[v]){tmp.push_back(v);}
edg[i] = tmp;
}
else edg[i].clear();
ans.push_back(0);
for(int i = 1;i <= n;i++)if(!dfn[i])dfs(i);
for(int i = 1;i <= n;i++)if(!vis[i])work(i,0);
printf("0 %d\n",(int)ans.size());
for(int i : ans){
if(i)printf("1 %d\n",i);
else puts("2");
}
return;
}
};
bool edmemory;
signed main(){
auto stclock = clock();
Call_me_Eric::main();
auto edclock = clock();
cerr << (&stmemory - &edmemory) / 1024.0 / 1024.0 << " Mib cost.\n";
cerr << (edclock - stclock) * 1.0 / CLOCKS_PER_SEC << " Sec cost.\n";
return 0;
}
/*
7 7
1 2
1 3
2 3
2 4
2 5
3 6
3 7
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 4ms
memory: 18904kb
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: 0ms
memory: 20972kb
input:
7 7 1 2 1 3 2 3 2 4 2 5 3 6 3 7
output:
0 13 1 4 1 2 1 1 1 6 1 3 2 1 1 1 2 1 3 1 4 1 5 1 6 1 7
result:
ok You are right!
Test #3:
score: -100
Runtime Error
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...