传送门

先讲一个悲伤地故事

RunID User Problem Result Memory Time Language Code_Length Submit_Time
1635823 Cydiater 2157 Accepted 48180 kb 724 ms C++/Edit 4264 B 2016-09-17 18:23:45
1635820 Cydiater 2157 Wrong_Answer 48188 kb 144 ms C++/Edit 4419 B 2016-09-17 18:05:56
1635819 Cydiater 2157 Wrong_Answer 48188 kb 148 ms C++/Edit 4419 B 2016-09-17 18:02:18
1635813 Cydiater 2157 Wrong_Answer 48188 kb 148 ms C++/Edit 4418 B 2016-09-17 17:59:04
1635804 Cydiater 2157 Wrong_Answer 48184 kb 192 ms C++/Edit 4453 B 2016-09-17 17:48:17
1635802 Cydiater 2157 Wrong_Answer 48184 kb 192 ms C++/Edit 4456 B 2016-09-17 17:44:26
1635801 Cydiater 2157 Wrong_Answer 48184 kb 192 ms C++/Edit 4443 B 2016-09-17 17:42:04
1635799 Cydiater 2157 Wrong_Answer 48184 kb 200 ms C++/Edit 4443 B 2016-09-17 17:40:29
1635780 Cydiater 2157 Wrong_Answer 48188 kb 192 ms C++/Edit 4349 B 2016-09-17 17:20:36
1635587 Cydiater 2157 Wrong_Answer 48188 kb 200 ms C++/Edit 4342 B 2016-09-17 14:29:53
1635573 Cydiater 2157 Wrong_Answer 48188 kb 184 ms C++/Edit 4313 B 2016-09-17 14:13:51
1635566 Cydiater 2157 Wrong_Answer 48188 kb 188 ms C++/Edit 4315 B 2016-09-17 14:03:45

感觉LCT写熟练了真的要比树剖好写QAQ

2个需要注意的地方。

1.LCT如果需要使用当前节点的信息,而且这些信息是需要打上lazy-tag的,传标记时一定要先下穿到子节点。传标记时一定要先下穿到子节点。传标记时一定要先下穿到子节点。

因为这个WA了无数次而找不到原因,直到看了别人的代码...

2.这个对于边的处理比较轻松的做法是把边也看成点。但是这样子在统计信息的$maxx$和$minn$就很容易出问题,所以做以下处理

在updata中更新节点最大最小值时:

if(node>N){
    t[node].maxx=max(t[node].maxx,t[node].v);
    t[node].minn=min(t[node].minn,t[node].v);
}

载入边权之前

up(i,,N){t[i].minn=oo;t[i].maxx=-oo;}

具体实现:

 //BZOJ 2157
 //by Cydiater
 //2016.9.17
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <cstdlib>
 #include <iomanip>
 #include <cmath>
 using namespace std;
 #define ll long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ,N,M,edge[MAXN],node,num,nodea,nodeb;
 ];
 struct Tree{
     ],fa,siz,tag,v,sum,maxx,minn,re;
 }t[MAXN];
 namespace solution{
     inline ]==node;}
     inline bool isroot(int node){
         ]!=node&&t[t[node].fa].son[]!=node;
     }
     inline void updata(int node){
         if(node){
             t[node].sum=t[node].v;
             t[node].maxx=max(t[t[node].son[]].maxx,t[t[node].son[]].maxx);
             t[node].minn=min(t[t[node].son[]].minn,t[t[node].son[]].minn);
             if(node>N){
                 t[node].maxx=max(t[node].maxx,t[node].v);
                 t[node].minn=min(t[node].minn,t[node].v);
             }
             t[node].sum+=t[t[node].son[]].sum;
             t[node].sum+=t[t[node].son[]].sum;
         }
     }
     inline void work(int node){
         t[node].sum=-t[node].sum;t[node].v=-t[node].v;
         t[node].maxx=-t[node].maxx;t[node].minn=-t[node].minn;
         swap(t[node].maxx,t[node].minn);
         t[node].re^=;
     }
     inline void downit(int node){
         if(t[node].tag){
             t[t[node].son[]].tag^=;t[t[node].son[]].tag^=;
             swap(t[node].son[],t[node].son[]);
             t[node].tag=;
         }
         if(t[node].re){
             ])work(t[node].son[]);
             ])work(t[node].son[]);
             t[node].re=;
         }
     }
     void rotate(int node){
         int old=t[node].fa,oldf=t[old].fa,which=get(node);
         ]==old]=node;
         t[old].son[which]=t[node].son[which^];t[t[old].son[which]].fa=old;
         t[node].son[which^]=old;t[old].fa=node;t[node].fa=oldf;
         updata(old);updata(node);
     }
     inline void splay(int node){
         top=;q[++top]=node;
         for(int i=node;!isroot(i);i=t[i].fa)q[++top]=t[i].fa;
         down(i,top,)downit(q[i]);
         while(!isroot(node)){
             int old=t[node].fa,oldf=t[old].fa;
             if(!isroot(old))rotate(get(node)==get(old)?old:node);
             rotate(node);
         }
     }
     inline void access(int node){
         ;
         while(node){
             splay(node);
             t[node].son[]=tmp;
             updata(node);
             tmp=node;node=t[node].fa;
         }
     }
     inline ;}
     inline void Link(int noda,int nodb){
         Reverse(noda);
         t[noda].fa=nodb;
     }
     inline void LCA(int noda,int nodb){
         Reverse(noda);
         access(nodb);
         splay(nodb);
     }
     inline void Change(int id,int num){id=edge[id];splay(id);t[id].v=num;updata(id);}
     //Link-Cut-Tree
     void slove(){
         N=read();
         memset(edge,,sizeof(edge));
         up(i,,N){t[i].minn=oo;t[i].maxx=-oo;}
         up(i,,N-){
             ,nodeb=read()+,v=read();
             edge[i]=i+N;
             t[edge[i]].sum=t[edge[i]].v=t[edge[i]].maxx=t[edge[i]].minn=v;
             Link(nodea,edge[i]);Link(nodeb,edge[i]);
         }
         M=read();
         while(M--){
             scanf("%s",op);
             ]=='C'){
                 node=read();num=read();
                 Change(node,num);
             }
             ]=='N'){
                 nodea=read()+;nodeb=read()+;
                 LCA(nodea,nodeb);
                 work(nodeb);
             }
             ]=='S'){
                 nodea=read()+;nodeb=read()+;
                 LCA(nodea,nodeb);
                 printf("%d\n",t[nodeb].sum);
             }
             ]=='M'){
                 nodea=read()+;nodeb=read()+;
                 LCA(nodea,nodeb);
                 printf(]=='A'?t[nodeb].maxx:t[nodeb].minn);
             }
         }
     }
 }
 int main(){
     //freopen("input.in","r",stdin);
     //freopen("out.out","w",stdout);
     using namespace solution;
     slove();
     ;
 }

BZOJ2157: 旅游的更多相关文章

  1. bzoj2157旅游

    bzoj2157旅游 题意: 给定有权树,支持单边权修改,路径边权取相反数,路径边权求和,路径边权求最大最小值. 题解: 用link-cut tree link-cut tree与树链剖分有些类似,都 ...

  2. [bzoj2157]旅游 (lct)

    这个应该也算裸的模板题吧..主要是边权的问题,对于每条边u->v,我们可以新建一个节点代替他,把边的信息弄到新的点上,就变成u->x->v了... 当然了这样的话要防止u和v这些没用 ...

  3. BZOJ2157旅游——树链剖分+线段树

    题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...

  4. BZOJ2157 旅游 【树剖 或 LCT】

    题目 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径. ...

  5. BZOJ2157: 旅游(LCT)

    Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...

  6. [BZOJ2157]旅游(树链剖分/LCT)

    树剖裸题,当然LCT也可以. 树剖: #include<cstdio> #include<algorithm> #define ls (x<<1) #define ...

  7. BZOJ2157: 旅游 树链剖分 线段树

    http://www.lydsy.com/JudgeOnline/problem.php?id=2157   在对树中数据进行改动的时候需要很多pushdown(具体操作见代码),不然会wa,大概原因 ...

  8. 【树链剖分】【线段树】bzoj2157 旅游

    #include<cstdio> #include<algorithm> using namespace std; #define INF 2147483647 #define ...

  9. bzoj2157 旅游——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 仍然是LCT模板题~ 不过有一些需要注意的地方,点和边的区分,0号点的 mx 和 mn ...

随机推荐

  1. linux | 管道符、输出重定向

    1 输出重定向 ll > a.txt 将 ll的结果写入到a.txt 2 管道符 ls -la | grep h* 这条命令的理解为:ls -la 的结果作为gerp h* 的结果 gerp 是 ...

  2. equals()的用法

    比如,两个对象 c1, c2; 那么,c1.equals(c2) == true; 则表示c1, c2两个变量的值是一致的 equals适用于所有对象,这是一种特殊方法 equals这种表现形式我们一 ...

  3. 42-stat 显示文件的信息

    显示文件的信息 stat [options] [file-list] 参数 file-list指定stat所显示的一个或多个文件的路径名 选项 -f                     显示文件系 ...

  4. 2-ls 显示目录内容

    ls list directory contents 显示目录内容 [语法]: ls [选项] [参数] [功能介绍] ls指令用来显示目录列表,在Linux系统中有着较高的使用率.ls指令的输出信息 ...

  5. 大规模数据 从SQL SERVER导入到ORACLE方法

    来源于:http://blog.csdn.net/iitkd/article/details/40394789 来源:一个7G的SQL SERVER .bak文件要导入到Oracle中,经过实验,完成 ...

  6. 线段树 poj3225

    U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0    D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 因 ...

  7. Elasticsearch 2.X 版本Java插件开发简述

    1:elasticsearch插件分类简述 2:Java插件开发要点 3:如何针对不同版本elasticsearch提供多版本的插件 4:插件具有外部依赖时遇到的一些问题(2016-09-07更新) ...

  8. jsrender for array 和for object语法

    for array 循环数组 循环使用案例 定义数组数据 var data = { names: ["Maradona","Pele","Ronald ...

  9. c#如何使输入数据类型限制,C#如何添加限制

    验证n位的数字:^\d{n}$ ,例如要输6位数字,不能多也不能少: ^\d{6}$ 验证数字的正则表达式集 验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$ ...

  10. 扩展html 无边框的input 边框

    public static class HtmlHelper { /// <summary> /// 返回没有边框的只读的TextBox标签 /// </summary> // ...