传送门

先讲一个悲伤地故事

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中更新节点最大最小值时:

  1. if(node>N){
  2. t[node].maxx=max(t[node].maxx,t[node].v);
  3. t[node].minn=min(t[node].minn,t[node].v);
  4. }

载入边权之前

  1. up(i,,N){t[i].minn=oo;t[i].maxx=-oo;}

具体实现:

  1. //BZOJ 2157
  2. //by Cydiater
  3. //2016.9.17
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <string>
  8. #include <algorithm>
  9. #include <queue>
  10. #include <map>
  11. #include <ctime>
  12. #include <cstdlib>
  13. #include <iomanip>
  14. #include <cmath>
  15. using namespace std;
  16. #define ll long long
  17. #define up(i,j,n) for(int i=j;i<=n;i++)
  18. #define down(i,j,n) for(int i=j;i>=n;i--)
  19. ;
  20. const int oo=0x3f3f3f3f;
  21. inline int read(){
  22. ,f=;
  23. ;ch=getchar();}
  24. +ch-';ch=getchar();}
  25. return x*f;
  26. }
  27. ,N,M,edge[MAXN],node,num,nodea,nodeb;
  28. ];
  29. struct Tree{
  30. ],fa,siz,tag,v,sum,maxx,minn,re;
  31. }t[MAXN];
  32. namespace solution{
  33. inline ]==node;}
  34. inline bool isroot(int node){
  35. ]!=node&&t[t[node].fa].son[]!=node;
  36. }
  37. inline void updata(int node){
  38. if(node){
  39. t[node].sum=t[node].v;
  40. t[node].maxx=max(t[t[node].son[]].maxx,t[t[node].son[]].maxx);
  41. t[node].minn=min(t[t[node].son[]].minn,t[t[node].son[]].minn);
  42. if(node>N){
  43. t[node].maxx=max(t[node].maxx,t[node].v);
  44. t[node].minn=min(t[node].minn,t[node].v);
  45. }
  46. t[node].sum+=t[t[node].son[]].sum;
  47. t[node].sum+=t[t[node].son[]].sum;
  48. }
  49. }
  50. inline void work(int node){
  51. t[node].sum=-t[node].sum;t[node].v=-t[node].v;
  52. t[node].maxx=-t[node].maxx;t[node].minn=-t[node].minn;
  53. swap(t[node].maxx,t[node].minn);
  54. t[node].re^=;
  55. }
  56. inline void downit(int node){
  57. if(t[node].tag){
  58. t[t[node].son[]].tag^=;t[t[node].son[]].tag^=;
  59. swap(t[node].son[],t[node].son[]);
  60. t[node].tag=;
  61. }
  62. if(t[node].re){
  63. ])work(t[node].son[]);
  64. ])work(t[node].son[]);
  65. t[node].re=;
  66. }
  67. }
  68. void rotate(int node){
  69. int old=t[node].fa,oldf=t[old].fa,which=get(node);
  70. ]==old]=node;
  71. t[old].son[which]=t[node].son[which^];t[t[old].son[which]].fa=old;
  72. t[node].son[which^]=old;t[old].fa=node;t[node].fa=oldf;
  73. updata(old);updata(node);
  74. }
  75. inline void splay(int node){
  76. top=;q[++top]=node;
  77. for(int i=node;!isroot(i);i=t[i].fa)q[++top]=t[i].fa;
  78. down(i,top,)downit(q[i]);
  79. while(!isroot(node)){
  80. int old=t[node].fa,oldf=t[old].fa;
  81. if(!isroot(old))rotate(get(node)==get(old)?old:node);
  82. rotate(node);
  83. }
  84. }
  85. inline void access(int node){
  86. ;
  87. while(node){
  88. splay(node);
  89. t[node].son[]=tmp;
  90. updata(node);
  91. tmp=node;node=t[node].fa;
  92. }
  93. }
  94. inline ;}
  95. inline void Link(int noda,int nodb){
  96. Reverse(noda);
  97. t[noda].fa=nodb;
  98. }
  99. inline void LCA(int noda,int nodb){
  100. Reverse(noda);
  101. access(nodb);
  102. splay(nodb);
  103. }
  104. inline void Change(int id,int num){id=edge[id];splay(id);t[id].v=num;updata(id);}
  105. //Link-Cut-Tree
  106. void slove(){
  107. N=read();
  108. memset(edge,,sizeof(edge));
  109. up(i,,N){t[i].minn=oo;t[i].maxx=-oo;}
  110. up(i,,N-){
  111. ,nodeb=read()+,v=read();
  112. edge[i]=i+N;
  113. t[edge[i]].sum=t[edge[i]].v=t[edge[i]].maxx=t[edge[i]].minn=v;
  114. Link(nodea,edge[i]);Link(nodeb,edge[i]);
  115. }
  116. M=read();
  117. while(M--){
  118. scanf("%s",op);
  119. ]=='C'){
  120. node=read();num=read();
  121. Change(node,num);
  122. }
  123. ]=='N'){
  124. nodea=read()+;nodeb=read()+;
  125. LCA(nodea,nodeb);
  126. work(nodeb);
  127. }
  128. ]=='S'){
  129. nodea=read()+;nodeb=read()+;
  130. LCA(nodea,nodeb);
  131. printf("%d\n",t[nodeb].sum);
  132. }
  133. ]=='M'){
  134. nodea=read()+;nodeb=read()+;
  135. LCA(nodea,nodeb);
  136. printf(]=='A'?t[nodeb].maxx:t[nodeb].minn);
  137. }
  138. }
  139. }
  140. }
  141. int main(){
  142. //freopen("input.in","r",stdin);
  143. //freopen("out.out","w",stdout);
  144. using namespace solution;
  145. slove();
  146. ;
  147. }

BZOJ2157: 旅游的更多相关文章

  1. bzoj2157旅游

    bzoj2157旅游 题意: 给定有权树,支持单边权修改,路径边权取相反数,路径边权求和,路径边权求最大最小值. 题解: 用link-cut tree link-cut tree与树链剖分有些类似,都 ...

  2. [bzoj2157]旅游 (lct)

    这个应该也算裸的模板题吧..主要是边权的问题,对于每条边u->v,我们可以新建一个节点代替他,把边的信息弄到新的点上,就变成u->x->v了... 当然了这样的话要防止u和v这些没用 ...

  3. BZOJ2157旅游——树链剖分+线段树

    题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...

  4. BZOJ2157 旅游 【树剖 或 LCT】

    题目 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径. ...

  5. BZOJ2157: 旅游(LCT)

    Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...

  6. [BZOJ2157]旅游(树链剖分/LCT)

    树剖裸题,当然LCT也可以. 树剖: #include<cstdio> #include<algorithm> #define ls (x<<1) #define ...

  7. BZOJ2157: 旅游 树链剖分 线段树

    http://www.lydsy.com/JudgeOnline/problem.php?id=2157   在对树中数据进行改动的时候需要很多pushdown(具体操作见代码),不然会wa,大概原因 ...

  8. 【树链剖分】【线段树】bzoj2157 旅游

    #include<cstdio> #include<algorithm> using namespace std; #define INF 2147483647 #define ...

  9. bzoj2157 旅游——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 仍然是LCT模板题~ 不过有一些需要注意的地方,点和边的区分,0号点的 mx 和 mn ...

随机推荐

  1. get_post

    各种http的请求协议: http://ymiter.iteye.com/blog/1922464 HTTP请求报文和HTTP响应报文 http://www.cnblogs.com/biyeymyhj ...

  2. C#迭代器

    迭代器概述 迭代器是可以返回相同类型的值的有序序列的一段代码. 迭代器可用作方法.运算符或 get 访问器的代码体. 迭代器代码使用 yield return 语句依次返回每个元素.yield bre ...

  3. 基于FPGA的通信系统实验

    伪随机信号发生器 1.伪随机信号发生器原理 伪随机信号发生器又叫PN序列发生器或者是m序列发生器.m序列是一种线性反馈寄存器序列,m序列的产生可以利用r级寄存器产生长度为2^r-1的m序列,该实验中采 ...

  4. [HDOJ5445]Food Problem(优先队列优化多重背包)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:多重背包 分析:f[i][j]=max(f[i-1][j-k*w[i]]+k*v[i]) 将j ...

  5. 禁用Win10显卡更新

    右键This PC-Properties-Advanced system settings-选择Hardware这个tab-Device installation settings选择No

  6. 手机信号强度单位dB、dBm和asu

    dB.dBm都是功率增益的单位,不同之处如下: dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log( ...

  7. centos 7 安装mysql

    # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # rpm -ivh mysql-community- ...

  8. Android下的数据储存方式

      安卓系统默认提供了一下几种数据储存的方式: Shared Preferences 内部储存 外部储存 SQLite数据库 保存到网络服务器   使用Shared Preferences       ...

  9. model 的验证

    Ext.onReady(function(){ Ext.define('User', { extend: 'Ext.data.Model', fields: [ { name: 'name', typ ...

  10. 逻辑回归&&code

    没有正则化项的时候的二分类 #-*-coding=utf-8-*- from numpy import loadtxt,where, transpose import matplotlib.pyplo ...