萌新刚学 sgt 分治,0 pt 求调
查看原帖
萌新刚学 sgt 分治,0 pt 求调
749665
huta0楼主2024/7/30 12:41
#include <iostream>
#include <vector>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
    constexpr int N = 8e5+5;
    int n,m,k,top,fa[N],ht[N];
    struct edge { int u,v; } e[N];
    struct node { int x,y,add; } stk[N];
    vector<int> t[N];
    int find(int x) { return fa[x]==x?x:find(fa[x]); }
    void merge(int x,int y) {
        x=find(x),y=find(y);
        if(ht[x]>ht[y]) swap(x,y);
        stk[++top]={x,y,ht[x]==ht[y]};
        fa[x]=y;
        if(ht[x]==ht[y]) ht[y]++;
    }
    void init() { rep(i,1,N) fa[i]=i,ht[i]=1; }
    void ins(int p,int L,int R,int l,int r,int i) {
        if(L>r||R<l) return;
        if(L<=l&&r<=R) {
            t[p].push_back(i);
            return;
        }
        int mid=l+r>>1;
        ins(p<<1,L,R,l,mid,i);
        ins(p<<1|1,L,R,mid+1,r,i);
    }
    void solve(int p,int l,int r) {
        int fl=1,lst=top;
        for(int i=0;i<t[p].size();i++) {
            if(find(e[t[p][i]].u)==find(e[t[p][i]].v)) {
                rep(j,l,r) puts("No");
                fl=0; break;
            }
            merge(e[t[p][i]].u,e[t[p][i]].v+n);
            merge(e[t[p][i]].v,e[t[p][i]].u+n);
        }
        if(fl) {
            int mid=l+r>>1;
            if(l==r) puts("Yes");
            else solve(p<<1,l,mid),solve(p<<1|1,mid+1,r);
        }
        while(top>lst) {
            ht[fa[stk[top].x]]-=stk[top].add;
            fa[stk[top].x]=stk[top].x;
            top--;
        }
    }
}
using namespace ai;
ai_jiang {
    cin.tie(0); cout.tie(0);
    cin>>n>>m>>k; init();
    rep(i,1,m) {
        int a,b,c,d;
        cin>>a>>b>>c>>d; c++;
        e[i]={a,b};
        ins(1,c,d,1,k,i);
    }
    solve(1,1,k);
    return 0;
}
2024/7/30 12:41
加载中...