再水一道模板题,明天就要出发去参加二轮省选了赶紧复习复习模板。

链剖模板题,可是写链剖太麻烦了,还是写lct吧。

但这个lct比较麻烦了,因为边权有正有负,要统计最大值和最小值,这样点权赋为什么值都会妨碍统计。

想了半天,后来发现自己脑抽了,统计的时候特判一下当前点是点还是边不就可以了吗?

裸的模板题调了好久啊,因为后来往原先错误的程序加上上述特判时总是漏这漏那,以后一定要认真思考每个细节确保无误后再开始写代码,这样脑子里有一个清晰的框架,写起来更快,而且不容易出错,大大节省了调试的时间。切忌边想边写!!!这样写到最后会有很多bug,而且对于程序的每个函数的作用会比较模糊。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 20003;
const int inf = 0x7fffffff;
void read(int &k) {
k = 0; int fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 1) + (k << 3) + c - '0';
k = k * fh;
} struct node *null;
struct node {
node *ch[2], *fa;
int d, mx, mn, sum;
bool edge;
short rev, change;
bool pl() {return fa->ch[1] == this;}
void setc(node *r, bool c) {ch[c] = r; r->fa = this;}
bool check() {return fa == null || (fa->ch[0] != this && fa->ch[1] != this);}
void upd() {if (this == null) return; sum = -sum; d = -d; swap(mx, mn); mx = -mx; mn = -mn;}
void push() {
if (rev) {rev = 0; swap(ch[0], ch[1]); ch[0]->rev ^= 1; ch[1]->rev ^= 1;}
if (change) {
change = 0;
ch[0]->change ^= 1; ch[1]->change ^= 1;
ch[0]->upd(); ch[1]->upd();
}
}
void count() {
sum = ch[0]->sum + ch[1]->sum;
mx = max(ch[0]->mx, ch[1]->mx); mn = min(ch[0]->mn, ch[1]->mn);
if (edge) mx = max(mx, d), mn = min(mn, d), sum += d;
}
} pool[N + N], *p[N], *E[N]; namespace LCT {
void rotate(node *r) {
node *f = r->fa; bool c = r->pl();
if (f->check()) r->fa = f->fa;
else f->fa->setc(r, f->pl());
f->setc(r->ch[!c], c);
r->setc(f, !c);
f->count();
}
void update(node *r) {if (!r->check()) update(r->fa); r->push();};
void splay(node *r) {
update(r);
for(; !r->check(); rotate(r))
if (!r->fa->check()) rotate(r->pl() == r->fa->pl() ? r->fa : r);
r->count();
}
node *access(node *r) {
node *y = null;
for(; r != null; y = r, r = r->fa)
splay(r), r->ch[1] = y;
return y;
}
void changert(node *r) {access(r)->rev ^= 1; splay(r);}
void link(node *r, node *t) {changert(r); r->fa = t;}
int tot = 0;
node *newnode(int num, bool flag) {
node *t = &pool[++tot];
t->ch[0] = t->ch[1] = t->fa = null;
t->d = t->sum = num;
t->rev = t->change = 0;
t->edge = flag;
if (flag) t->mx = t->mn = num;
else t->mx = -inf, t->mn = inf;
return t;
}
void Build(int n) {
null = new node;
null->ch[0] = null->ch[1] = null->fa = null;
null->mx = -inf; null->mn = inf;
null->rev = null->change = null->edge = null->d = null->sum = 0;
for(int i = 0; i < n; ++i) p[i] = newnode(0, 0);
}
} int n, m;
int main() {
read(n);
LCT::Build(n);
int u, v, e, x, y;
for(int i = 1; i < n; ++i) {
read(u); read(v); read(e);
E[i] = LCT::newnode(e, 1);
LCT::link(p[u], E[i]); LCT::link(p[v], E[i]);
}
read(m);
char c[3];
for(int i = 1; i <= m; ++i) {
scanf("%s", c); read(u); read(v);
switch (c[0]) {
case 'C':
LCT::splay(E[u]);
E[u]->d = v; E[u]->count();
break;
case 'N':
LCT::changert(p[u]); LCT::access(p[v]); LCT::splay(p[v]);
p[v]->upd(); p[v]->change ^= 1;
break;
case 'S':
LCT::changert(p[u]); LCT::access(p[v]); LCT::splay(p[v]);
printf("%d\n", p[v]->sum);
break;
case 'M':
LCT::changert(p[u]); LCT::access(p[v]); LCT::splay(p[v]);
if (c[1] == 'A') printf("%d\n", p[v]->mx);
else printf("%d\n", p[v]->mn);
break;
}
}
return 0;
}

SDOI 2016 Round2 Day-1 Bless All,祝CreationAugust,TA,morestep,Vampire,Sunshine,Lcomyn,Rivendell学长们和fye学姐都进队!

【BZOJ 2157】旅游的更多相关文章

  1. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  2. bzoj 2157: 旅游 (LCT 边权)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题面; 2157: 旅游 Time Limit: 10 Sec  Memory Lim ...

  3. BZOJ 2157: 旅游

    2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1347  Solved: 619[Submit][Status][Discuss] ...

  4. 【刷题】BZOJ 2157 旅游

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

  5. BZOJ 2157 旅游(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...

  6. BZOJ 2157 旅游(树链剖分+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...

  7. BZOJ 2157: 旅游 (2017.7.21 6:30-2017.7.21 15:38 今日第一题。。)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1754  Solved: 765 Description Ray 乐忠于旅游,这次他来到了T 城.T ...

  8. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  9. BZOJ 2157: 旅游 (树链剖分+线段树)

    树链剖分后线段树维护区间最大最小值与和. 支持单点修改与区间取反. 直接写个区间取反标记就行了.线段树板题.(200行6000B+ 1A警告) #include <cstdio> #inc ...

  10. BZOJ 2157: 旅游 (结构体存变量)

    用结构体存变量好像确实能提高运行速度,以后就这么写数据结构了 Code: #include <cstdio> #include <algorithm> #include < ...

随机推荐

  1. 网页下载Google Play 的App

    前言 当你想在google play上下载某个应用,而无奈手机的系统并没有安装google servicess,此刻是否有些捉急? 本文分享的是一个网站,它可以无需手机而直接通过网页下载Google ...

  2. datepicker monthpicker

  3. jQuery动态产生的铵钮怎样实现事件处理

    在ASP.NET MVC环境中,实现一个小功能,就是希望使用jQuery动态一个铵钮,并让用户能执行这个铵钮的click事件.为了更好的理解与对比,Insus.NET在视图中先写一个静态的,执行相似的 ...

  4. 谈谈patch strategy

    所谓的patch strategy,就是软件发布后出现bug时打补丁的方式 - 主要是关于源代码branch如何组织的方式 针对项目的开发阶段.开发状态.维护方式不同,可以有不同的patching s ...

  5. 扩展欧几里得算法(extgcd)

    相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...

  6. opencv6.1-imgproc图像处理模块之平滑与形态学操作

    这个部分是<opencv-tutorials.pdf>的部分,这部分也是几大部分中例子最多的,其实这个教程的例子都很不错,不过有些看得出来还是c接口的例子,说明例子有些年头了,其实在&qu ...

  7. 基于Laravel+Swoole开发智能家居后端

    基于Laravel+Swoole开发智能家居后端 在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法. 今天,我参与的智能家居项目基 ...

  8. .net程序员转行做手游开发经历(一)

    从辞职到自己开发游戏也有几个月的时间了,游戏也已经在AppStore上线了,我觉得我有必要写点东西,算是留下的一些记忆,也可以和广大博友分享下自己的创业经历,这可能不是一篇成功的创业经历,因为故事还在 ...

  9. dev gridcontrol纵向合并单元格设置

    1.要设置gridcontrol中指定列(columns中选中指定列)的AllowMerge属性为true; 2.要设置gridview中AllowCellMerge的属性为true; 3.如果只合并 ...

  10. 3DMax 常用快捷键

    视图切换: T 顶视图 F 前视图, B后视图,L-左视图,右视图因为R键是另外一个功能, 所以是V+R 线框视图切换F3, 实体线框同时出现 F4 模型复位Z P透视图 在透视图的情况下: 鼠标中间 ...