zoukankan      html  css  js  c++  java
  • bzoj 2594 [Wc2006]水管局长数据加强版(LCT+最小生成树)

    【深坑勿入】

    【给个链接】

      http://blog.csdn.net/popoqqq/article/details/41348549

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream>
      4 #include<algorithm>
      5 #define FOR(a,b,c) for(int a=b;a<=c;a++)
      6 #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
      7 using namespace std;
      8 
      9 typedef long long ll;
     10 typedef unsigned int ul;
     11 const int N = 4e5+10;
     12 
     13 ll read() {
     14     char c=getchar();
     15     ll f=1,x=0;
     16     while(!isdigit(c)) {
     17         if(c=='-') f=-1; c=getchar();
     18     }
     19     while(isdigit(c))
     20         x=x*10+c-'0',c=getchar();
     21     return x*f;
     22 }
     23 
     24 struct Edge { 
     25     int u,v,w;
     26     bool operator < (const Edge& rhs) const {
     27         return u<rhs.u||(u==rhs.u&&v<rhs.v);
     28     }
     29 }e[N<<2];
     30 
     31 namespace LCT {
     32 
     33     struct Node {
     34         Node *ch[2],*fa;
     35         int rev,id,maxe;
     36         Node() ;
     37         void reverse() {
     38             rev^=1;
     39             swap(ch[0],ch[1]);
     40         }
     41         void up_push() {
     42             if(fa->ch[0]==this||fa->ch[1]==this) 
     43                 fa->up_push();
     44             if(rev) {
     45                 ch[0]->reverse();
     46                 ch[1]->reverse();
     47                 rev=0;
     48             }
     49         }
     50         void maintain() {
     51             int _max=-1;
     52             if(e[ch[0]->maxe].w>_max)
     53                 _max=e[ch[0]->maxe].w,maxe=ch[0]->maxe;
     54             if(e[ch[1]->maxe].w>_max)
     55                 _max=e[ch[1]->maxe].w,maxe=ch[1]->maxe;
     56             if(e[id].w>_max) maxe=id;
     57         }
     58     } *null=new Node,T[N],E[N<<2];
     59     Node::Node() {
     60         id=maxe=rev=0;
     61         fa=ch[0]=ch[1]=null;
     62     }
     63     
     64     void rot(Node* o,int d) {
     65         Node *p=o->fa;
     66         p->ch[d]=o->ch[d^1];
     67         o->ch[d^1]->fa=p;
     68         o->ch[d^1]=p;
     69         o->fa=p->fa;
     70         if(p==p->fa->ch[0])
     71             p->fa->ch[0]=o;
     72         else if(p==p->fa->ch[1])
     73             p->fa->ch[1]=o;
     74         p->fa=o;
     75         p->maintain();
     76     }
     77     void splay(Node *o) {
     78         o->up_push();
     79         Node *nf,*nff;
     80         while(o->fa->ch[0]==o||o->fa->ch[1]==o) {
     81             nf=o->fa,nff=nf->fa;
     82             if(o==nf->ch[0]) {
     83                 if(nf==nff->ch[0]) rot(nf,0);
     84                 rot(o,0);
     85             } else {
     86                 if(nf==nf->ch[1]) rot(nf,1);
     87                 rot(o,1);
     88             }
     89         }
     90         o->maintain();
     91     }
     92     void Access(Node* o) {
     93         Node *son=null;
     94         while(o!=null) {
     95             splay(o);
     96             o->ch[1]=son;
     97             o->maintain();
     98             son=o; o=o->fa;
     99         }
    100     }
    101     void evert(Node* o) {
    102         Access(o);
    103         splay(o);
    104         o->reverse();
    105     }
    106     void Link(Node* u,Node* v) {
    107         evert(u);
    108         u->fa=v;
    109     }
    110     void Cut(Node* u,Node* v) {
    111         evert(u);
    112         Access(v); splay(v);
    113         u->fa=v->ch[0]=null;
    114         v->maintain();
    115     }
    116     Node* find(Node* o) {
    117         while(o->fa!=null) o=o->fa;
    118         return o;
    119     }
    120     
    121 }
    122 using namespace LCT;
    123 
    124 int n,m,q,flag[N],ans[N];
    125 
    126 struct Q { int op,x,y;
    127 }que[N];
    128 
    129 int query(Node* u,Node* v)
    130 {
    131     if(find(u)!=find(v)) return 0;
    132     evert(u);
    133     Access(v),splay(v);
    134     return v->maxe;
    135 }
    136 void insert(Node* u,Node* v,int id) 
    137 {
    138     if(find(u)==find(v)) {
    139         int maxe=query(u,v);
    140         if(e[maxe].w<=e[id].w) return ;
    141         Cut(&E[maxe],&T[e[maxe].u]);
    142         Cut(&E[maxe],&T[e[maxe].v]);
    143     }
    144     Link(&E[id],u);
    145     Link(&E[id],v);
    146 }
    147 int search(Edge x)
    148 {
    149     int l=1,r=m,mid;
    150     while(l<=r) {
    151         mid=l+r>>1;
    152         if((!(e[mid]<x))&&(!(x<e[mid]))) return mid;
    153         if(x<e[mid]) r=mid-1;
    154         else l=mid+1;
    155     }
    156     return 0;
    157 }
    158 
    159 int main()
    160 {
    161     freopen("in.in","r",stdin);
    162     freopen("out.out","w",stdout);
    163     n=read(),m=read(),q=read();
    164     FOR(i,0,m) E[i].maxe=E[i].id=i;
    165     FOR(i,1,m) {
    166         e[i].u=read(),e[i].v=read(),e[i].w=read();
    167         if(e[i].u>e[i].v) swap(e[i].u,e[i].v);
    168     }
    169     e[0].w=0;
    170     sort(e+1,e+m+1);
    171     FOR(i,1,q) {
    172         que[i].op=read(),que[i].x=read(),que[i].y=read();
    173         if(que[i].x>que[i].y) swap(que[i].x,que[i].y);
    174         if(que[i].op==2) {
    175             int x=search((Edge){que[i].x,que[i].y,0});
    176             if(x==0) puts("error");
    177             flag[x]=1;
    178         }
    179     }
    180     FOR(i,1,m) if(!flag[i]) {
    181         insert(&T[e[i].u],&T[e[i].v],i);
    182     }
    183     for(int i=q;i;i--) {
    184         if(que[i].op==2) {
    185             int x=search((Edge){que[i].x,que[i].y,0});
    186             insert(&T[e[x].u],&T[e[x].v],x);
    187         } else {
    188             ans[i]=e[query(&T[que[i].x],&T[que[i].y])].w;
    189         }
    190     }
    191     FOR(i,1,q) if(que[i].op==1)
    192         printf("%d
    ",ans[i]);
    193     return 0;
    194 }
    View Code
  • 相关阅读:
    ARM的存储器映射与存储器重映射
    Nand Flash与Nor
    内核 任务的堆栈切换
    Linux设备模型(总结)
    file结构体中private_data指针的疑惑
    Sysfs文件系统与Linux设备模型
    认识udev
    Linux操作系统下的常见系统资源共享
    linux下的udev是干嘛的,能否说的通俗点
    udev详解
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5323669.html
Copyright © 2011-2022 走看看