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;
    }
  • 相关阅读:
    (三)openwrt主Makefile解析
    (二)我的Makefile学习冲动&&编译过程概述
    openwrt修改flash大小
    (一)openwrt源码目录概述
    git_sop 脚本使用说明
    Openwrt LuCI模块练习详细步骤
    openwrt简单ipk生成及Makefile解释
    oracle中比较两表表结构差异和数据差异的方法
    C#泛型集合之Dictionary<k, v>使用技巧
    SQL语句添加,删除主键
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11275651.html
Copyright © 2011-2022 走看看