zoukankan      html  css  js  c++  java
  • 【CF891C】Envy

    题面

    https://www.luogu.org/problem/CF891C

    题解

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define ri register int
    #define N 500050
    using namespace std;
    struct edge {
      int u,v;int l;
    } e[N];
    int ide[N];
    bool cmpide(int x,int y) {return e[x].l<e[y].l;}
    
    struct cut {
      int id,q;
      bool operator < (const cut &rhs) const {
        if (e[id].l==e[rhs.id].l) return q<rhs.q; else return e[id].l<e[rhs.id].l;
      }
    } tr[N<<2];
    
    int n,m,top;
    bool ans[N];
    
    struct ss {
      int a,b,c,d;
    };
    
    struct binchaji {
      int f[N];int cen[N]; ss stk[N];
      void push(int x,int y) {
        stk[++top]=(ss){x,f[x],y,cen[y]};
        f[x]=y;
      }
      void clear() {
        for (ri i=1;i<=n;i++) f[i]=i,cen[i]=1;
      }
      int findroot(int x){
        if (f[x]==x) return x;
        return findroot(f[x]);
      }
      bool insert(int x) {
        int r1=findroot(e[x].u),r2=findroot(e[x].v);
        if (r1==r2) return 0;
        if (cen[r1]>cen[r2]) {
          push(r2,r1);
          cen[r1]=max(cen[r1],cen[r2]+1);
        }
        else {
          push(r1,r2);
          cen[r2]=max(cen[r2],cen[r1]+1);
        }
        return 1;
      }
      void back() {
        f[stk[top].a]=stk[top].b;
        cen[stk[top].c]=stk[top].d;
        top--;
      }
    } bcj;
    
    int main(){
      scanf("%d %d",&n,&m);
      for (ri i=1;i<=m;i++) scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].l);
      for (ri i=1;i<=m;i++) ide[i]=i;
      sort(ide+1,ide+m+1,cmpide);
      int q;
      int cc=0;
      int k,x;
      scanf("%d",&q);
      for (ri i=1;i<=q;i++) {
        scanf("%d",&k);
        for (ri j=1;j<=k;j++) scanf("%d",&x),tr[++cc]=(cut){x,i};
      }
      sort(tr+1,tr+cc+1);
      memset(ans,1,sizeof(ans));
      int p=1; top=0;
      bcj.clear();
      for (ri i=1;i<=cc;i++) {
        if (e[tr[i].id].l!=e[tr[i-1].id].l) while (e[ide[p]].l<e[tr[i].id].l && p<=m) bcj.insert(ide[p]),p++;
        int ep,tot=0;
        for (ri j=i;tr[j].q==tr[i].q && e[tr[j].id].l==e[tr[i].id].l;j++) {
          if (!bcj.insert(tr[j].id)) ans[tr[i].q]=0; else tot++;
          ep=j;
        }
        while (tot) bcj.back(),tot--;
        i=ep;
      }
      for (ri i=1;i<=q;i++) if (ans[i]) puts("YES"); else puts("NO");
      return 0;
    }
  • 相关阅读:
    使用FolderBrowserDialog组件选择文件夹
    使用OpenFileDialog组件打开多个文
    使用OpenFileDialog组件打开对话框
    获取弹出对话框的相关返回值
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1137 Final Grading (25 分)
    PAT 甲级 1137 Final Grading (25 分)
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11275651.html
Copyright © 2011-2022 走看看