bzoj3159: 决战
呀智障选手都快忘了代码怎么打了..
做这道题干啥咧..
GDOI2017D3T4.. dwjshift说很像这道题,然后就去做了..
然后就做了半个月??
简略解法
就是两棵LCT,一棵维护树的结构,一棵维护权值,两棵树在中序遍历上映射,所以维护一下根对根的映射即可
所以要怎么Access..
对于当前点$x$,在把它旋到当前splay的根的时候可以知道它在这棵splay上的排名
然后就去找对应的那棵权值splay的排名就知道映射的是哪个了啊..
然后.. 就没有然后了吧..
下面是代码呀..
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define LL long long
using namespace std;
const LL Maxn = 50010;
struct node {LL y, next;
}a[Maxn*2]; LL first[Maxn], len;
LL _max(LL x, LL y) { return x > y ? x : y; }
LL _min(LL x, LL y) { return x < y ? x : y; }
void ins(LL x, LL y) {len++;a[len].y = y;a[len].next = first[x]; first[x] = len;
}
LL n, m, r;
LL p[Maxn];
LL Maxx[Maxn], Minn[Maxn], sum[Maxn], val[Maxn];
LL vfa[Maxn], fa[Maxn], sizef[Maxn], sizev[Maxn];
LL cf[Maxn][2], cv[Maxn][2];
LL revf[Maxn], revv[Maxn], la[Maxn];
LL sta[Maxn], tp;
char s[10];
void dfs(LL x) {p[x] = x; sizef[x] = sizev[x] = 1;for(LL k = first[x]; k; k = a[k].next){LL y = a[k].y;if(y == fa[x]) continue;fa[y] = x; vfa[y] = x;dfs(y);}
}
LL rt;
/*f*/
bool is_rootf(LL x) { return cf[fa[x]][0] != x && cf[fa[x]][1] != x; }
void push_downf(LL x) {if(revf[x]){swap(cf[x][0], cf[x][1]);revf[cf[x][0]] ^= 1; revf[cf[x][1]] ^= 1;revf[x] = 0;}
}
void prepf(LL x) {LL i; tp = 0;for(i = x; !is_rootf(i); i = fa[i]) sta[++tp] = i;sta[++tp] = i;for(i = tp; i >= 1; i--) push_downf(sta[i]);
}
void updatef(LL x) { sizef[x] = sizef[cf[x][0]]+sizef[cf[x][1]]+1; }
void rotatef(LL x) {LL y = fa[x], z = fa[y], l, r;if(cf[y][0] == x) l = 0; else l = 1; r = l^1;if(!is_rootf(y)){ if(cf[z][0] == y) cf[z][0] = x; else cf[z][1] = x; }fa[x] = z; fa[y] = x; fa[cf[x][r]] = y;cf[y][l] = cf[x][r]; cf[x][r] = y;updatef(y);
}
void splayf(LL x) {rt = x;prepf(x);while(!is_rootf(x)){LL y = fa[x], z = fa[y];if(!is_rootf(y)){if(is_rootf(z)) rt = z;if((cf[z][0] == y)^(cf[y][0] == x)) rotatef(x);else rotatef(y);} else rt = y;rotatef(x);}updatef(x);
}
/*v*/
bool is_rootv(LL x) { return cv[vfa[x]][0] != x && cv[vfa[x]][1] != x; }
void push_downv(LL x) {if(revv[x]){swap(cv[x][0], cv[x][1]);revv[cv[x][0]] ^= 1; revv[cv[x][1]] ^= 1;revv[x] = 0;}if(la[x] > 0){if(cv[x][0] > 0){sum[cv[x][0]] += sizev[cv[x][0]]*la[x]; val[cv[x][0]] += la[x];Maxx[cv[x][0]] += la[x];Minn[cv[x][0]] += la[x];la[cv[x][0]] += la[x];} if(cv[x][1] > 0){sum[cv[x][1]] += sizev[cv[x][1]]*la[x]; val[cv[x][1]] += la[x];Maxx[cv[x][1]] += la[x];Minn[cv[x][1]] += la[x];la[cv[x][1]] += la[x];}la[x] = 0;}
}
void prepv(LL x) {LL i; tp = 0;for(i = x; !is_rootv(i); i = vfa[i]) sta[++tp] = i;sta[++tp] = i;for(i = tp; i >= 1; i--) push_downv(sta[i]);
}
void updatev(LL x) {Maxx[x] = _max(Maxx[cv[x][0]], _max(Maxx[cv[x][1]], val[x]));Minn[x] = _min(Minn[cv[x][0]], _min(Minn[cv[x][1]], val[x]));sum[x] = sum[cv[x][0]]+sum[cv[x][1]]+val[x];sizev[x] = sizev[cv[x][0]]+sizev[cv[x][1]]+1;
}
void rotatev(LL x) {LL y = vfa[x], z = vfa[y], l, r;if(cv[y][0] == x) l = 0; else l = 1; r = l^1;if(!is_rootv(y)){ if(cv[z][0] == y) cv[z][0] = x; else cv[z][1] = x; }vfa[x] = z; vfa[y] = x; vfa[cv[x][r]] = y;cv[y][l] = cv[x][r]; cv[x][r] = y;updatev(y);
}
void splayv(LL x) {prepv(x);while(!is_rootv(x)){LL y = vfa[x], z = vfa[y];if(!is_rootv(y)){if((cv[z][0] == y)^(cv[y][0] == x)) rotatev(x);else rotatev(y);}rotatev(x);}updatev(x);
}
LL find_rank(LL x, LL p) {push_downv(x);if(sizev[cv[x][0]]+1 == p) return x;if(sizev[cv[x][0]] >= p) return find_rank(cv[x][0], p);else return find_rank(cv[x][1], p-sizev[cv[x][0]]-1);
}
void splay(LL x) {splayf(x);LL o = find_rank(p[rt], sizef[cf[x][0]]+1);splayv(o);p[x] = o;
}
void access(LL x) {LL tf = 0, tv = 0;while(x){splay(x);LL o = p[x];p[cf[x][1]] = cv[o][1];cf[x][1] = tf;cv[o][1] = tv;if(tv) vfa[tv] = o;tv = o;tf = x;x = fa[x];}
}
void make_root(LL x) { access(x); splay(x); revf[x] ^= 1; revv[p[x]] ^= 1; }
void getchain(LL x, LL y) { make_root(x); access(y); splay(y); }
LL getsum(LL x, LL y) { getchain(x, y); return sum[p[y]]; }
LL getmin(LL x, LL y) { getchain(x, y); return Minn[p[y]]; }
LL getmax(LL x, LL y) { getchain(x, y); return Maxx[p[y]]; }
void add(LL x, LL y, LL c) { getchain(x, y); sum[p[y]] += sizev[p[y]]*c; val[p[y]] += c; Maxx[p[y]] += c; Minn[p[y]] += c; la[p[y]] += c; }
void invert(LL x, LL y) { getchain(x, y); revv[p[y]] ^= 1; }
int main() {LL i, j, k;Maxx[0] = -0x7fffffff; Minn[0] = 0x7fffffff;scanf("%lld%lld%lld", &n, &m, &r);for(i = 1; i < n; i++){LL x, y;scanf("%lld%lld", &x, &y);ins(x, y); ins(y, x);}dfs(r);for(i = 1; i <= m; i++){scanf("%s", s+1);if(s[1] == 'I' && s[3] == 'c'){LL x, y, c;scanf("%lld%lld%lld", &x, &y, &c);add(x, y, c);} else if(s[1] == 'S'){LL x, y;scanf("%lld%lld", &x, &y);printf("%lld\n", getsum(x, y));} else if(s[1] == 'M' && s[2] == 'a'){LL x, y;scanf("%lld%lld", &x, &y);printf("%lld\n", getmax(x, y));} else if(s[1] == 'M'){LL x, y;scanf("%lld%lld", &x, &y);printf("%lld\n", getmin(x, y));} else {LL x, y;scanf("%lld%lld", &x, &y);invert(x, y);}}return 0;
}
转载于:https://www.cnblogs.com/darklove/p/6874869.html
bzoj3159: 决战相关推荐
- bzoj3159 决战
题目描述: bz 咕了几个月的题解: 无脑$splay$+树剖. 论复制粘贴在考场上拉分的重要作用. 代码: #include<cstdio> #include<cstring> ...
- bzoj3159 决战 LCT
题目大意: 维护一个树,支持以下操作: 1.链+ 2.链求和 3.链求最大 4.链求最小 5.链翻转(此处的翻转是指把链上的值翻转,而树的形态不变) 题目分析:(LCT) 如果只有前四个操作就可以用L ...
- BZOJ3159: 决战(FHQ Treap)
传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...
- 陕西农心邮箱服务器,由农心杯决战看AI规则对胜负判断的差异
最近最为引人注目的就是农心杯的决战了.农心杯最后两局,都是半目胜负.因为在医院等候,都是通过腾讯围棋APP观看的.在评论区,有网友列示katago的胜率分析,与腾讯绝艺的胜率出入很大,甚至是完全相反的 ...
- vc++ mfc 非客户区 描绘线_决战客户端技术
原文链接-决战客户端技术 最近经常有小伙伴问我要做一个客户端, 该怎么弄. 这个问题问得很粗犷, 但是实际上客户端的选型是一个很细的问题. 从大学到现在, 也弄了不少的客户端, 从公司主营炒股专业客户 ...
- Serverless 与容器决战在即?有了弹性伸缩就不一样了
作者 | 阿里云容器技术专家 莫源 本文整理自莫源于 8 月 31 日 K8s & cloudnative meetup 深圳场的演讲内容.关注"阿里巴巴云原生"公众号 ...
- 6.19决战光荣日,一场魔兽狂欢里的青春、父爱和友谊
6月19日决战光荣日-程序员魔兽嘉年华在杭州城西银泰举办.全城开发者.魔兽迷以及电影爱好者济济一堂,燃情狂欢,游戏环节高潮迭起,点燃激情盛夏.观者如堵的同时,无论是联盟还是部落,现场组队征战,嗨翻全场 ...
- 战友!6.19决战光荣日,一个真实的魔兽世界在等你!
勇士们 还记得魔兽中曾经的战友吗? 还记得当年那热血的承诺吗? "一日WOWER,终身WOWER!" 曾记否在副本里被虐得死去活来 曾记否相约奥格门外插旗至天亮 我们早已不再青春 ...
- 为决战5G时代,小米出手一点不含糊,接连招揽牛人,这次是曾学忠
文 | 科技有意思,编辑 | 猫叔 目前,智能手机厂商们在4G时代的博弈战算是告一段落了.而随着国内市场的5G蓬勃发展,实际上许多中国手机厂商都已经做好了准备,甚至是All in 5G了. 这其中,小 ...
- html5决战沙城源码,决战沙城h5符文玩法介绍 怎么获得完美首通
导 读 决战沙城h5的符文玩法的作用更适用于PK当中,随着后期攻击力越高越高之后,伤害减少比起输出增加更为的重要,你得比别人站得更久,才能有更高的输出,一起来看看符文功能的一些介绍吧. 1.功... ...
最新文章
- js词法作用域(静态作用域)
- Wireshark分析器分析数据流过程
- 对网上花店系统进行软件测试,网上花店系统
- SAP设置信贷控制范围有什么作用?
- 浅谈APP流式分页服务端设计(转)
- redis设置开机自启动
- spring解析配置文件(三)
- 小谈Online-game服务器端设计(4)
- 她说:行!嫁人就选程序员!
- Mac Terminal终端光标的快捷键操作
- yum下载rpm包、源码包安装
- 为Android GridView 设置行背景
- 小菜找实习——阿里3.25场笔试第一题(矩阵数组最小差值和)
- c语言课程设计报告猜数字,猜数字游戏C语言课程设计报告书.docx
- openlayer中的投影
- mac电脑网游加速器哪个好用?网易uu网游加速器分享
- 在 vmware ESXi上安装mac系统虚拟机
- 【第三方互联】微博1、注册成为新浪微博(sina)开发者
- 联想笔记本fn键linux,ThinkPad如何修改fn键默认操作
- python爬取拼多多数据_Python---数据的爬取与存储
热门文章
- C++中的set(STL的应用部分)
- java aapt linux_Android:linux下aapt使用 | 学步园
- html编写个人博客_云开发平台开箱,3分钟零基础搭建个人Hexo博客
- 易筋SpringBoot 2.1 | 第十五篇:SpringBoot连接池Druid
- idea中tomcat不能发布html,idea中Tomcat无法启动成功
- 编程实现strcpy函数
- python maketrans函数_python中maketrans
- android studio for android learning (四) 兼容性问题
- 【Gym-102059 G】Fascination Street【亏欠型DP思想】
- 【CodeForces - 471D 】【构造差分kmp】MUH and Cube Walls