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 ...
随机推荐
- Sql视图创建语句
create view [dbo].[AllUsers] as select u.UserId, u.Firstname, u.Lastname, u.ts, am.Email, au.UserNam ...
- [codeforces 519E]E. A and B and Lecture Rooms(树上倍增)
题目:http://codeforces.com/problemset/problem/519/E 题意:给你一个n个点的树,有m个询问(x,y),对于每个询问回答树上有多少个点和x,y点的距离相等 ...
- BPR: Bayesian Personalized Ranking from Implicit Feedback-CoRR 2012——20160421
1.Information publication:CoRR 2012 2.What 商品推荐中常用的方法矩阵因子分解(MF),协同过滤(KNN)只考虑了用户购买的商品,文章提出利用购买与未购买的偏序 ...
- 站内搜索——Lucene +盘古分词
为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ...
- MVC————添加视图时没有模型可用
我们有时想创建强类型视图,却发现下拉列表里面没有东西,这时不要慌,这是因为你没有编译造成的,编译一下就好了~
- ios UITableview 刷新某一个cell 或 section
//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:]; [tableview reloadSections:ind ...
- 把时间转成适合符合日常习惯的格式【js】
假设现在是7月30日12点,我们可以说今天12点,意思也非常明确. 我们习惯说昨天12点,而不习惯说29号12点. 我们习惯说周一12点,而不习惯说28号12点,这样不用翻日历看今天是几号. so,上 ...
- .net 使用memcache做缓存
前段时间去一家公司面试,面试官问到我对缓存了解多少,因为我是做B/S开发的,所以把知道的都说了.比如:Application.Cache.页面缓存.文件缓存.然后面试官说“不止这些,还有呢?”,我后来 ...
- [转] JPQL
原文地址:http://blog.csdn.net/suncaishen/article/details/6512028 select name ,age from user; //原生SQL语句 s ...
- Mybatis——oracle 的模糊查询 和 日期处理
第一种 1 <if test="AGTNAM !=null and AGTNAM !=''"> <![CDATA[and AGTNAM like concat(c ...