rt,感觉写的没啥问题但是 RE on #31。
求大佬帮调orz。
代码如下:
#include <bits/stdc++.h>
#define pii pair<int,int>
#define mkp(x,y) make_pair(x,y)
#define fir first
#define sec second
using namespace std;
const int maxn=1e4+5;
struct dsu{
int top,fa[maxn<<1],siz[maxn<<1],stk[maxn<<1];
inline void init(int x){
top=0;
for (int i=1;i<=x;i++) fa[i]=i,siz[i]=1;
}
inline int find(int x){
if (fa[x]==x) return x;
return find(fa[x]);
}
inline void merge(int x,int y){
x=find(x),y=find(y);
if (x==y) return ;
if (siz[x]<siz[y]) swap(x,y);
siz[x]+=siz[y],fa[y]=x;
stk[++top]=y;
}
inline void back(){
if (!top) return ;
int x=stk[top--];
siz[fa[x]]-=siz[x],fa[x]=x;
}
}f;
struct segment{
int l,r;
vector <pii> vec;
}c[maxn<<2];
int n,m;
vector <int> ans;
inline void build(int rt,int l,int r){
c[rt].l=l,c[rt].r=r;
if (l==r) return ;
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
}
inline void update(int rt,int l,int r,pii e){
if (c[rt].l>r || c[rt].r<l) return ;
if (c[rt].l>=l && c[rt].r<=r){
c[rt].vec.push_back(e);
return ;
}
update(rt<<1,l,r,e);
update(rt<<1|1,l,r,e);
}
inline void query(int rt,int flag){
int ret=f.top;
for (int i=0;i<c[rt].vec.size();i++){
pii e=c[rt].vec[i];
f.merge(e.fir,e.sec+n);
f.merge(e.fir+n,e.sec);
if (f.find(e.fir)==f.find(e.fir+n) || f.find(e.sec)==f.find(e.sec+n)) flag=true;
}
if (c[rt].l==c[rt].r){
if (!flag) ans.push_back(c[rt].l);
while (f.top>ret) f.back();
return ;
}
query(rt<<1,flag);
query(rt<<1|1,flag);
while (f.top>ret) f.back();
}
int main(){
scanf("%d%d",&n,&m);
f.init(n<<1);
build(1,1,m);
for (int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
if (i>1) update(1,1,i-1,mkp(x,y));
if (i<m) update(1,i+1,m,mkp(x,y));
}
query(1,false);
printf("%d\n",ans.size());
for (int i=0;i<ans.size();i++) printf("%d ",ans[i]);
return 0;
}