• bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct


    【清华集训2016】温暖会指引我们前行

     统计

    寒冬又一次肆虐了北国大地

    无情的北风穿透了人们御寒的衣物

    可怜虫们在冬夜中发出无助的哀嚎

    “冻死宝宝了!”

    这时

    远处的天边出现了一位火焰之神

    “我将赐予你们温暖和希望!”

    只见他的身体中喷射出火焰之力

    通过坚固的钢铁,传遍了千家万户

    这时,只听见人们欢呼

    “暖气来啦!”

    任务描述

    虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低。

    小R的宿舍楼中有nn个地点和一些路,一条路连接了两个地点,小R可以通过这条路从其中任意一个地点到达另外一个地点。但在刚开始,小R还不熟悉宿舍楼中的任何一条路,所以他会慢慢地发现这些路,他在发现一条路时还会知道这条路的温度和长度。每条路的温度都是互不相同的。

    小R需要在宿舍楼中活动,每次他都需要从一个地点到达另一个地点。小R希望每次活动时经过一条最温暖的路径,最温暖的路径的定义为,将路径上各条路的温度从小到大排序后字典序最大。即温度最低的路温度尽量高,在满足该条件的情况下,温度第二低的路温度尽量高,以此类推。小R不会经过重复的路。由于每条路的温度互不相同,因此只存在一条最温暖的路径。

    对于小R的每次活动,你需要求出小R需要走过的路径总长度。如果小R通过当前发现的路不能完成这次活动,则输出 1−1。

    注意本题中的字典序与传统意义上的字典序定义有所不同,对于两个序列a,b(ab)a,b(a≠b),若aa是bb的前缀则aa的字典序较大,同时可以推出空串的字典序最大。

    输入格式

    第一行两个正整数 n,mn,m。表示小R的宿舍楼中有 nn 个地点,共发生了 mm 个事件。

    接下来 mm 行,每行描述一个事件,事件分为三类。

    1. find id u v t lfind id u v t l 表示小R发现了一条连接uu和vv之间的路,编号为idid。相同idid的边只会出现一次。

    2. move u vmove u v 表示小R要从uu到达vv,你需要计算出最温暖的路径的长度 ,若不能从uu到达vv,则输出1−1。

    3. change id lchange id l 表示从uu到vv这条边的长度变为了ll(保证在当前时间点这条边存在)。

    输出格式

    对于每个询问,输出一行整数,表示最温暖的路径长度。

    样例一

    input

    8 19
    find 0 0 2 7 2
    find 1 2 4 4 4
    find 2 4 6 10 1
    find 3 6 7 8 6
    move 2 7
    move 1 6
    find 4 2 5 3 4
    move 0 5
    change 0 12
    find 5 4 5 5 10
    find 6 2 3 6 9
    move 3 5
    find 7 0 1 12 1
    move 1 6
    find 8 1 7 11 100
    move 1 6
    move 3 7
    move 5 6
    move 2 2
    
    

    output

    11
    -1
    6
    23
    18
    106
    122
    11
    0
    
    

    样例二

    input

    15 45
    find 0 1 0 8 5987
    find 1 2 0 14 5455
    find 2 3 0 27 8830
    find 3 4 3 42 7688
    find 4 5 0 25 1756
    find 5 6 5 35 1550
    find 6 7 4 43 9440
    move 3 9
    change 2 9113
    move 10 13
    move 3 3
    move 11 10
    find 7 8 7 6 7347
    find 8 9 8 26 8935
    move 8 4
    change 3 4466
    find 9 10 9 28 8560
    move 6 5
    find 10 11 10 31 6205
    change 9 9228
    find 11 12 10 23 948
    find 12 13 12 45 5945
    move 0 9
    move 2 5
    change 2 6118
    find 13 14 13 12 6906
    move 4 1
    change 2 504
    find 14 4 2 22 9796
    move 10 7
    move 1 14
    move 13 3
    find 15 12 9 39 8985
    find 16 9 8 17 3710
    change 1 5370
    find 17 1 0 36 4669
    find 18 7 6 37 8087
    move 9 0
    find 19 14 9 33 8234
    find 20 0 4 24 5209
    change 1 4883
    find 21 6 3 9 2461
    find 22 5 2 19 4291
    change 1 7219
    change 6 4846
    
    

    output

    -1
    -1
    0
    -1
    16787
    1550
    39301
    7211
    16571
    25510
    59706
    46309
    30692
    
    

    样例三

    见样例数据下载

    限制与约定

    对于find操作:(0id<m,0u,v<n,uv,0t1000000000,0l10000)(0≤id<m,0≤u,v<n,u≠v,0≤t≤1000000000,0≤l≤10000);

    对于move操作:(0u,v<n)(0≤u,v<n);

    对于change操作:(0l10000)(0≤l≤10000)。

    对于100%的数据,1n100000,1m3000001≤n≤100000,1≤m≤300000 。

    本题共有20个数据点,每个数据点5分。

    测试点nnmm其它
    121−2 20≤20 50≤50 无特殊约定
    353−5 1000≤1000 3000≤3000
    6106−10 100000≤100000 300000≤300000 所有的find事件都在move事件之前,且没有change事件
    111411−14 所有的find事件都在move事件之前
    152015−20 无特殊约定

    时间限制2s2s

    空间限制512MB

    题意:

      

    题解:

      这种加边操作,删边操作,

      应该是lct,八九不离十了,

      a的最小值最大,次小值最大,就是最大瓶颈树上的操作吧。

      然后就是lct的基本操作,splay中维护sum即可,以及最小值的边号。

      每次加入一条边的时候,需要找出这个环中最小值,

      设最小值为x,如果x<now则,将x删去,吧now加入,

      即可。

      1 #include<cstring>
      2 #include<cmath>
      3 #include<algorithm>
      4 #include<iostream>
      5 #include<cstdio>
      6 
      7 #define inf 1000000007
      8 #define N 400007
      9 #define ls c[p][0]
     10 #define rs c[p][1]
     11 using namespace std;
     12 inline int read()
     13 {
     14     int x=0,f=1;char ch=getchar();
     15     while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();}
     16     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
     17     return x*f;
     18 }
     19 
     20 int n,m;
     21 int rev[N],c[N][2],fa[N],e[N][2],sum[N],st[N];
     22 struct Node
     23 {
     24     int mi,t,len;
     25 }a[N];
     26 char ch[10];
     27 
     28 inline bool isroot(int x)
     29 {
     30     return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;
     31 }
     32 void pushdown(int p)
     33 {
     34     if (rev[p])
     35     {
     36         rev[ls]^=1;
     37         rev[rs]^=1;
     38         rev[p]^=1;
     39         swap(c[p][0],c[p][1]);
     40     }
     41 }
     42 void update(int p)
     43 {
     44     sum[p]=sum[ls]+sum[rs]+a[p].len;
     45     a[p].mi=p;
     46     if (a[a[ls].mi].t<a[a[p].mi].t&&ls) a[p].mi=a[ls].mi;
     47     if (a[a[rs].mi].t<a[a[p].mi].t&&rs) a[p].mi=a[rs].mi;
     48 }
     49 void rotate(int x)
     50 {
     51     int y=fa[x],z=fa[y],l,r;
     52     if (c[y][0]==x) l=0;else l=1;r=l^1;
     53     if (!isroot(y))
     54     {
     55         if (c[z][0]==y) c[z][0]=x;
     56         else c[z][1]=x;
     57     }
     58     fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
     59     c[y][l]=c[x][r],c[x][r]=y;
     60     update(y),update(x);
     61 }
     62 void splay(int x)
     63 {
     64     int top=0;
     65     st[++top]=x;
     66     for (int i=x;!isroot(i);i=fa[i])
     67         st[++top]=fa[i];
     68     for (int i=top;i>=1;i--)
     69         pushdown(st[i]);
     70     while(!isroot(x))
     71     {
     72         int y=fa[x],z=fa[y];
     73         if (!isroot(y))
     74         {
     75             if (c[y][0]==x^c[z][0]==y) rotate(x);
     76             else rotate(y);
     77         }
     78         rotate(x);
     79     }        
     80     update(x);
     81 }
     82 void access(int x)
     83 {
     84     int t=0;
     85     while(x)
     86     {
     87         splay(x);
     88         c[x][1]=t;
     89         update(x);
     90         t=x,x=fa[x];
     91     }
     92 }
     93 void makeroot(int x)
     94 {
     95     access(x);
     96     splay(x);
     97     rev[x]^=1;
     98 }
     99 void link(int x,int y)
    100 {
    101     makeroot(x);
    102     fa[x]=y;
    103     //update(x),update(y);
    104 }
    105 void cut(int x,int y)
    106 {
    107     makeroot(x);
    108     access(y);
    109     splay(y);
    110     c[y][0]=fa[x]=0;
    111     update(y);
    112 }
    113 int find(int x)
    114 {
    115     access(x),splay(x);
    116     int y=x;
    117     while(c[y][0])
    118         y=c[y][0];
    119     return y;    
    120 }
    121 int main()
    122 {
    123     n=read(),m=read();
    124     for (int i=1;i<=n;i++)a[i].t=inf;
    125     while(m--)
    126     {
    127         scanf("%s",ch);
    128         if (ch[0]=='f')
    129         {
    130             int id=read()+n,u=read(),v=read();u++,v++,id++;
    131             e[id][0]=u,e[id][1]=v;
    132             a[id].t=read(),a[id].len=read();
    133             
    134             if (find(u)!=find(v)) link(id,u),link(id,v);
    135             else
    136             {
    137                 makeroot(u),access(v),splay(v);
    138                 if (a[a[v].mi].t<a[id].t)
    139                 {
    140                     int k=a[v].mi;
    141                     cut(k,e[k][0]);
    142                     cut(k,e[k][1]);//就是这个最小点断开即可。 
    143                     link(id,u),link(id,v);
    144                 }
    145             }
    146         }
    147         else if (ch[0]=='m')
    148         {
    149             int u=read(),v=read();u++,v++;
    150             if (find(u)!=find(v)) printf("-1
    ");
    151             else 
    152             {
    153                 makeroot(u),access(v),splay(v);
    154                 printf("%d
    ",sum[v]);
    155             }    
    156         }
    157         else
    158         {
    159             int id=read()+n+1,x=read();
    160             a[id].len=x;
    161             splay(id);
    162             update(id);
    163         }
    164     }
    165 }

    完全自己打的,码了好久,调了半天,差不多花了6个小时吧。

  • 相关阅读:
    C/S 随思录
    3dTiles 最后一块拼图:几何误差与屏幕空间误差
    aps.net cannot connect to runtime process
    asp.net web api swagger使用总结
    asp.net webaip 跨域
    LightGBM算法实践
    Zabbix 机器 CPU 飙高 和 时区相差8个小时
    【vue踩坑记录】3、“Error in render: "TypeError: Cannot read property '0' of undefined"”渲染错误问题
    1-关于补码的理解
    vscode快捷键
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8098119.html
Copyright © 2020-2023  润新知