• 2816: [ZJOI2012]网络


    传送们

    把一个点拆成c个即可

    浪费时间的水题...

      1 //Achen
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<cstring>
      5 #include<cstdlib>
      6 #include<vector>
      7 #include<cstdio>
      8 #include<queue>
      9 #include<cmath>
     10 #include<set>
     11 #include<map>
     12 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     13 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     14 const int N=2e5+7;
     15 typedef long long LL; 
     16 typedef double db;
     17 using namespace std;
     18 int n,m,c,q,cnt[N][11];
     19 LL v[N];
     20 
     21 template<typename T> void read(T &x) {
     22     char ch=getchar(); x=0; T f=1;
     23     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
     24     if(ch=='-') f=-1,ch=getchar();
     25     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
     26 }
     27 
     28 map<LL,int>col;
     29 LL get(int x,int y) { return (LL)x*1000000+y; }
     30 
     31 int p[N],ch[N][2],flip[N];
     32 LL mx[N];
     33 #define lc ch[x][0]
     34 #define rc ch[x][1]
     35 void update(int x) { mx[x]=max(max(mx[lc],mx[rc]),v[x]); }
     36 
     37 void down(int x) {
     38     if(!flip[x]) return;
     39     swap(lc,rc);
     40     flip[lc]^=1;
     41     flip[rc]^=1;
     42     flip[x]^=1;
     43 }
     44 
     45 int isroot(int x) { return ch[p[x]][0]!=x&&ch[p[x]][1]!=x; }
     46 
     47 void rotate(int x) {
     48     int y=p[x],z=p[y],l=(x==ch[y][1]),r=l^1;
     49     if(!isroot(y)) ch[z][y==ch[z][1]]=x; p[x]=z;
     50     ch[y][l]=ch[x][r]; p[ch[x][r]]=y;
     51     ch[x][r]=y; p[y]=x;
     52     update(y); update(x);
     53 }
     54 
     55 void splay(int x) {
     56     static int g[N],top=0,tp;
     57     for(tp=x;!isroot(tp);tp=p[tp]) g[++top]=tp;
     58     g[++top]=tp;
     59     while(top) down(g[top--]);
     60     for(;!isroot(x);rotate(x)) {
     61         int y=p[x],z=p[y];
     62         if(!isroot(y)) ((x==ch[y][1])^(y==ch[z][1]))?rotate(x):rotate(y);
     63     }
     64 }
     65 
     66 void access(int x) {
     67     for(int t=0;x;x=p[t=x]) {
     68         splay(x);
     69         rc=t;
     70         update(x);
     71     }
     72 }
     73 
     74 int find_root(int x) {
     75     access(x);
     76     splay(x);
     77     while(lc) x=lc;
     78     return x;
     79 }
     80 
     81 void newroot(int x) {
     82     access(x);
     83     splay(x);
     84     flip[x]^=1;
     85 }
     86 
     87 void lik(int x,int y) {
     88     newroot(x);
     89     splay(x); 
     90     splay(y);
     91     p[x]=y;
     92 }
     93 
     94 void cut(int x,int y) {
     95     newroot(x);
     96     access(y);
     97     splay(y);
     98     if(ch[y][0]==x) ch[y][0]=p[x]=0;
     99     update(y);
    100 }
    101 
    102 void change(int x,int y) {
    103     splay(x);
    104     v[x]=y;
    105     update(x);
    106 }
    107 
    108 void qry(int x,int y) {
    109     if(find_root(x)!=find_root(y)) {
    110         puts("-1"); return;
    111     }
    112     newroot(x);
    113     access(y);
    114     splay(y);
    115     printf("%lld
    ",mx[y]);
    116 }
    117 
    118 #define DEBUG
    119 int main() {
    120 #ifdef DEBUG
    121     freopen("std.in","r",stdin);
    122     //freopen(".out","w",stdout);
    123 #endif
    124     read(n); read(m); read(c); read(q);
    125     For(i,1,n) {
    126         read(v[i]);
    127         For(j,1,c-1) v[i+j*n]=v[i];
    128     }
    129     For(i,1,m) {
    130         int u,v,w;
    131         read(u); read(v); read(w); w++;
    132         cnt[u][w]++; cnt[v][w]++;
    133         col[get(u,v)]=col[get(v,u)]=w;
    134         lik(u+(w-1)*n,v+(w-1)*n); 
    135     }
    136     For(ti,1,q) {
    137         int o,x,y,u,v,nw;
    138         read(o);
    139         if(o==0) {
    140             read(x); LL xx; read(xx);
    141             For(i,1,c) 
    142                 change(x+(i-1)*n,xx);
    143         }
    144         else if(o==1) {
    145             read(u); read(v); read(nw); nw++;
    146             int w=col[get(u,v)];
    147             if(!w) { puts("No such edge."); continue; }
    148             if(w==nw) { puts("Success."); continue; }
    149             if(cnt[u][nw]+1>2||cnt[v][nw]+1>2) { puts("Error 1."); continue; }
    150             if(find_root((nw-1)*n+u)==find_root((nw-1)*n+v)) { puts("Error 2."); continue; }
    151             col[get(u,v)]=col[get(v,u)]=nw;
    152             cnt[u][w]--; cnt[v][w]--;
    153             cnt[u][nw]++; cnt[v][nw]++;
    154             cut((w-1)*n+u,(w-1)*n+v);
    155             lik((nw-1)*n+u,(nw-1)*n+v);
    156             puts("Success.");
    157         }
    158         else {
    159             read(nw); read(u); read(v);
    160             qry(nw*n+u,nw*n+v);
    161         }
    162     }
    163     return 0;
    164 }
    View Code

     

  • 相关阅读:
    MySQL的备份
    Linux下MySQL安装及配置
    MySQL的优化
    MySQL的基本操作
    python文件操作练习之文件备份
    文件操作练习之统计目录大小
    SQLite
    PyMySQL模块
    python语法练习题之九九乘法表
    类装饰器
  • 原文地址:https://www.cnblogs.com/Achenchen/p/8980913.html
Copyright © 2020-2023  润新知