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 ...
随机推荐
- Python使用基础
1) 基本概念1.1 常量 Python没有提供常量保留字,需要自行扩展一个常量类来实现常量功能 class _const: class ConstError(TypeError):pass def ...
- WP8 对音视频格式支持的完整说明
Supported media codecs for Windows Phone http://msdn.microsoft.com/en-us/library/windowsphone/develo ...
- HTTP请求头参数
Accept-Language: zh-cn,zh;q=0.5 意思:浏览器支持的语言分别是中文和简体中文,优先支持简体中文. 详解: Accept-Language表示浏览器所支持的语言类型: ...
- 天龙客户端的ResourceManager
今天培训的时候,Leader针对项目结构讲了很多分层架构的思想,思路,对我而言有很大的助益,学会了将需求分层,或者说先设计出各个层次,然后有需求后落实到对应的层次上,尤其对于刚开始的架构设计阶段,能把 ...
- 调用天气Api实现天气查询
上面是简单截图: 前台代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name=&qu ...
- DLL编写教程
本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar DLL的优点 简单的 ...
- iOS -- autoResizingMask使用(转)
autoResizingMask 是UIView的一个属性,在一些简单的布局中,使用autoResizingMask,可以实现子控件相对于父控件的自动布局. autoResizingMask 是UIV ...
- Keepalived+Redis高可用部署
1 Redis简介及安装 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数 ...
- XML的总结学习
XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. (一切都是为了数据:采集.整理.存储.传输.显 ...
- find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...