线段树分治板子 RE 求调qwq
  • 板块CF19E Fairy
  • 楼主TimSwn090306
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/3/4 13:28
  • 上次更新2024/3/4 17:42:40
查看原帖
线段树分治板子 RE 求调qwq
564732
TimSwn090306楼主2024/3/4 13:28

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;
}
2024/3/4 13:28
加载中...