求助,线段树分治开O2导致Re
  • 板块学术版
  • 楼主天梦
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/7 14:20
  • 上次更新2023/11/4 18:29:35
查看原帖
求助,线段树分治开O2导致Re
194093
天梦楼主2021/7/7 14:20

rt。 代码:

#include<bits/stdc++.h>
#define dd double
#define ld long double
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define N 1000010
#define M 600010
using namespace std;

const int INF=0x3f3f3f3f;

template<typename T> inline void read(T &x) {
    x=0; int f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c == '-') f=-f;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    x*=f;
}

int n,m,k;

int fa[M],deep[M],top=0;
pair<int,int> sta[M];
struct bingchaji{
    int find(int a){
        return a==fa[a]?a:find(fa[a]);
    }
    bool belong_to_the_same(int a,int b){
        int faa=find(a),fab=find(b);
        return faa==fab;
    }
    bool merge(int a,int b){
        int faa=find(a),fab=find(b);
        if(faa==fab) return 0;
        if(deep[faa]>deep[fab]) swap(faa,fab);
        fa[faa]=fab;sta[++top]=make_pair(faa,deep[fab]);
        if(deep[faa]==deep[fab]) deep[fab]++;
        return 1;
    }
    void chushihua(int n){
        for(int i=1;i<=n;i++) fa[i]=i,deep[i]=0;top=0;
    }
    void chexiao(int k){
        for(int i=1;i<=k;i++){
            int lastdian=sta[top].first,lastdeep=sta[top].second;
            deep[fa[lastdian]]=lastdeep;fa[lastdian]=lastdian;top--;
        }
    }
};
bingchaji bcj;

struct edge{
    int from,to;
    edge(){}
    edge(int from,int to) : from(from),to(to) {}
};

struct node{
    int l,r;
    node(){l=r=0;}
};
vector<edge> bian[N<<2];
node p[N<<2];

int tot=0,root=0;
bool ans[M];

int new_node(){
    tot++;p[tot].l=p[tot].r=0;return tot;
}

void change(int &k,int l,int r,int z,int y,int u,int v){
    if(k==0) k=new_node();
    if(l==z&&r==y){
        bian[k].push_back(edge(u,v));return;
    }
    int mid=(l+r)>>1;
    if(y<=mid) change(p[k].l,l,mid,z,y,u,v);
    else if(z>mid) change(p[k].r,mid+1,r,z,y,u,v);
    else change(p[k].l,l,mid,z,mid,u,v),change(p[k].r,mid+1,r,mid+1,y,u,v);
}

void solve(int &k,int l,int r,bool op){
    if(l>r) return;
    if(!k) k=new_node();
    int mid=(l+r)>>1,cnt=0;
    for(int j=0;j<bian[k].size()&&op;j++){
        edge nowbian=bian[k][j];
        if(bcj.belong_to_the_same(nowbian.from,nowbian.to)){
            op=0;break;
        }
        bcj.merge(nowbian.from,nowbian.to+n);cnt++;
        bcj.merge(nowbian.to,nowbian.from+n);cnt++;
    }
    if(l==r){ans[l]=op;bcj.chexiao(cnt);return;}
    if(op){solve(p[k].l,l,mid,op);solve(p[k].r,mid+1,r,op);}
    bcj.chexiao(cnt);
}

int main(){
    read(n);read(m);read(k);
    for(int i=1;i<=m;i++){
        int x,y,l,r;read(x);read(y);read(l);read(r);l++;
        if(l>r) continue;
        change(root,1,k,l,r,x,y);
    }
    bcj.chushihua(n<<1);
    solve(root,1,k,1);
    for(int i=1;i<=k;i++) if(ans[i]) printf("Yes\n");else printf("No\n");
    return 0;
}
2021/7/7 14:20
加载中...