BZOJ2157: 旅游
先讲一个悲伤地故事
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: 旅游的更多相关文章
- bzoj2157旅游
bzoj2157旅游 题意: 给定有权树,支持单边权修改,路径边权取相反数,路径边权求和,路径边权求最大最小值. 题解: 用link-cut tree link-cut tree与树链剖分有些类似,都 ...
- [bzoj2157]旅游 (lct)
这个应该也算裸的模板题吧..主要是边权的问题,对于每条边u->v,我们可以新建一个节点代替他,把边的信息弄到新的点上,就变成u->x->v了... 当然了这样的话要防止u和v这些没用 ...
- BZOJ2157旅游——树链剖分+线段树
题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...
- BZOJ2157 旅游 【树剖 或 LCT】
题目 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径. ...
- BZOJ2157: 旅游(LCT)
Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...
- [BZOJ2157]旅游(树链剖分/LCT)
树剖裸题,当然LCT也可以. 树剖: #include<cstdio> #include<algorithm> #define ls (x<<1) #define ...
- BZOJ2157: 旅游 树链剖分 线段树
http://www.lydsy.com/JudgeOnline/problem.php?id=2157 在对树中数据进行改动的时候需要很多pushdown(具体操作见代码),不然会wa,大概原因 ...
- 【树链剖分】【线段树】bzoj2157 旅游
#include<cstdio> #include<algorithm> using namespace std; #define INF 2147483647 #define ...
- bzoj2157 旅游——LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 仍然是LCT模板题~ 不过有一些需要注意的地方,点和边的区分,0号点的 mx 和 mn ...
随机推荐
- vue.js+boostrap最佳实践
一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变 ...
- SQL2008R2 不支持用该后端版本设计数据库关系图或表
向下不兼容. 要么安装SQL2012,要么把SQL2012数据库通过脚本转成2008
- C# WinForm捕获全局异常
网上找的C# WinForm全局异常捕获方法,代码如下: static class Program { /// <summary> /// 应用程序的主入口点. /// </summ ...
- Change Eclipse Tooltip's Color in Ubuntu
这个问题十分高级,随着Ubuntu版本的变迁这个问题的解决方案也在不断变化 最开始,SystemSettings里面可以设置工具条背景色,后来这个选项在新版本Ubuntu中消失了 我用过Ubuntu1 ...
- 软件工程(FZU2015)增补作业
说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/01/03 前11次正式作业和练习的迭代评分见:http://www.cnbl ...
- Asp.Net Form验证不通过,重复登录
问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...
- Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题
本文由 Ceph 中国社区 -QiYu 翻译 英文出处:Using Ceph with MySQL 欢迎加入CCTG Over the last year, the Ceph world drew m ...
- MySQL 1045登录失败
当你登录MySQL数据库出现:Error 1045错误时(如下图),就表明你输入的用户名或密码错误被拒绝访问了,最简单的解决方法就是将MySQL数据库卸载然后重装,但这样的缺点就是就以前的数据库中的信 ...
- 成为JavaGC专家(1)—深入浅出Java垃圾回收机制
转载自:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC ...
- 【POJ 1981 】Circle and Points
当两个点距离小于直径时,由它们为弦确定的一个单位圆(虽然有两个圆,但是想一想知道只算一个就可以)来计算覆盖多少点. #include <cstdio> #include <cmath ...