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 ...
随机推荐
- Xamarin Android -创建Splash Screen (一)
......(空话少说) Xamarin 开发的技术资料很少,通过学习,把自己的学习过程及其中碰到的问题与大家分享. Splash Screen 就是在应用程序启动时,出现的一张图片,一般App的Sp ...
- 部署到IIS上的网站打开时总是显示无法找到资源解决方案
1.首先修改项目目录的访问权限:右键->属性->安全里面找到组名或用户名 ->编辑->添加一个用户取名everyOne并设置可以修改即可 2.然后在IIS下面,选中你的mvc项 ...
- 浅谈Javascript 中几种克隆(clone)方式
clone就是把原来的东西原样复制一份,新复制的东西和以前的东西没有任何关系 一:在Javascript里,如果克隆对象是基本类型,我们直接赋值就可以了: var sStr = "kingw ...
- 【JavaEE企业应用实战学习记录】logFilter
package sanglp.servlet; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import ja ...
- cmd 下telnet 不是内部或外部命令
问题:cmd 下telnet 提示不是内部或外部命令 解决方案:
- RabbitMQ 路由选择 (Routing)
让日志接收者能够订阅部分消息.例如,我们可以仅仅将致命的错误写入日志文件,然而仍然在控制面板上打印出所有的其他类型的日志消息. 1.绑定(Bindings) 在前面中我们已经使用过绑定.类似下面的代码 ...
- javascript获得客户端IP的又一方法
<script language="JavaScript">VIH_BackColor = "palegreen";VIH_ForeColor = ...
- DOS常用命令收集(长期更新)
命令列表 命令 说明 ASSOC 显示或修改文件扩展名关联. ATTRIB 显示或更改文件属性. BREAK 设置或清除扩展式 CTRL+C 检查. BCDEDIT 设置启动数据库中的属性以控制启动加 ...
- ubuntu15.10下搭建cordova+ionic开发环境
安装jdk 在命令下输入java如果没有安装会提示该命令包含于openjdk软件包 sudo apt-get install openjdk然后按下tab会列出openjdk开头的软件包 我这里就选择 ...
- Shiro 学习笔记(一)——shiro简介
Apache Shiro 是一个安全框架.说白了,就是进行一下 权限校验,判断下这个用户是否登录了,是否有权限去做这件事情. Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与web 集成. ...