zoukankan      html  css  js  c++  java
  • 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个小时吧。

  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8098119.html
Copyright © 2011-2022 走看看