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 ...
随机推荐
- linux | 管道符、输出重定向
1 输出重定向 ll > a.txt 将 ll的结果写入到a.txt 2 管道符 ls -la | grep h* 这条命令的理解为:ls -la 的结果作为gerp h* 的结果 gerp 是 ...
- equals()的用法
比如,两个对象 c1, c2; 那么,c1.equals(c2) == true; 则表示c1, c2两个变量的值是一致的 equals适用于所有对象,这是一种特殊方法 equals这种表现形式我们一 ...
- 42-stat 显示文件的信息
显示文件的信息 stat [options] [file-list] 参数 file-list指定stat所显示的一个或多个文件的路径名 选项 -f 显示文件系 ...
- 2-ls 显示目录内容
ls list directory contents 显示目录内容 [语法]: ls [选项] [参数] [功能介绍] ls指令用来显示目录列表,在Linux系统中有着较高的使用率.ls指令的输出信息 ...
- 大规模数据 从SQL SERVER导入到ORACLE方法
来源于:http://blog.csdn.net/iitkd/article/details/40394789 来源:一个7G的SQL SERVER .bak文件要导入到Oracle中,经过实验,完成 ...
- 线段树 poj3225
U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 因 ...
- Elasticsearch 2.X 版本Java插件开发简述
1:elasticsearch插件分类简述 2:Java插件开发要点 3:如何针对不同版本elasticsearch提供多版本的插件 4:插件具有外部依赖时遇到的一些问题(2016-09-07更新) ...
- jsrender for array 和for object语法
for array 循环数组 循环使用案例 定义数组数据 var data = { names: ["Maradona","Pele","Ronald ...
- c#如何使输入数据类型限制,C#如何添加限制
验证n位的数字:^\d{n}$ ,例如要输6位数字,不能多也不能少: ^\d{6}$ 验证数字的正则表达式集 验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$ ...
- 扩展html 无边框的input 边框
public static class HtmlHelper { /// <summary> /// 返回没有边框的只读的TextBox标签 /// </summary> // ...