呀智障选手都快忘了代码怎么打了..


做这道题干啥咧..

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: 决战相关推荐

  1. bzoj3159 决战

    题目描述: bz 咕了几个月的题解: 无脑$splay$+树剖. 论复制粘贴在考场上拉分的重要作用. 代码: #include<cstdio> #include<cstring> ...

  2. bzoj3159 决战 LCT

    题目大意: 维护一个树,支持以下操作: 1.链+ 2.链求和 3.链求最大 4.链求最小 5.链翻转(此处的翻转是指把链上的值翻转,而树的形态不变) 题目分析:(LCT) 如果只有前四个操作就可以用L ...

  3. BZOJ3159: 决战(FHQ Treap)

    传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...

  4. 陕西农心邮箱服务器,由农心杯决战看AI规则对胜负判断的差异

    最近最为引人注目的就是农心杯的决战了.农心杯最后两局,都是半目胜负.因为在医院等候,都是通过腾讯围棋APP观看的.在评论区,有网友列示katago的胜率分析,与腾讯绝艺的胜率出入很大,甚至是完全相反的 ...

  5. vc++ mfc 非客户区 描绘线_决战客户端技术

    原文链接-决战客户端技术 最近经常有小伙伴问我要做一个客户端, 该怎么弄. 这个问题问得很粗犷, 但是实际上客户端的选型是一个很细的问题. 从大学到现在, 也弄了不少的客户端, 从公司主营炒股专业客户 ...

  6. Serverless 与容器决战在即?有了弹性伸缩就不一样了

    作者 | 阿里云容器技术专家 莫源   本文整理自莫源于 8 月 31 日 K8s & cloudnative meetup 深圳场的演讲内容.关注"阿里巴巴云原生"公众号 ...

  7. 6.19决战光荣日,一场魔兽狂欢里的青春、父爱和友谊

    6月19日决战光荣日-程序员魔兽嘉年华在杭州城西银泰举办.全城开发者.魔兽迷以及电影爱好者济济一堂,燃情狂欢,游戏环节高潮迭起,点燃激情盛夏.观者如堵的同时,无论是联盟还是部落,现场组队征战,嗨翻全场 ...

  8. 战友!6.19决战光荣日,一个真实的魔兽世界在等你!

    勇士们 还记得魔兽中曾经的战友吗? 还记得当年那热血的承诺吗? "一日WOWER,终身WOWER!" 曾记否在副本里被虐得死去活来 曾记否相约奥格门外插旗至天亮 我们早已不再青春 ...

  9. 为决战5G时代,小米出手一点不含糊,接连招揽牛人,这次是曾学忠

    文 | 科技有意思,编辑 | 猫叔 目前,智能手机厂商们在4G时代的博弈战算是告一段落了.而随着国内市场的5G蓬勃发展,实际上许多中国手机厂商都已经做好了准备,甚至是All in 5G了. 这其中,小 ...

  10. html5决战沙城源码,决战沙城h5符文玩法介绍 怎么获得完美首通

    导 读 决战沙城h5的符文玩法的作用更适用于PK当中,随着后期攻击力越高越高之后,伤害减少比起输出增加更为的重要,你得比别人站得更久,才能有更高的输出,一起来看看符文功能的一些介绍吧. 1.功... ...

最新文章

  1. js词法作用域(静态作用域)
  2. Wireshark分析器分析数据流过程
  3. 对网上花店系统进行软件测试,网上花店系统
  4. SAP设置信贷控制范围有什么作用?
  5. 浅谈APP流式分页服务端设计(转)
  6. redis设置开机自启动
  7. spring解析配置文件(三)
  8. 小谈Online-game服务器端设计(4)
  9. 她说:行!嫁人就选程序员!
  10. Mac Terminal终端光标的快捷键操作
  11. yum下载rpm包、源码包安装
  12. 为Android GridView 设置行背景
  13. 小菜找实习——阿里3.25场笔试第一题(矩阵数组最小差值和)
  14. c语言课程设计报告猜数字,猜数字游戏C语言课程设计报告书.docx
  15. openlayer中的投影
  16. mac电脑网游加速器哪个好用?网易uu网游加速器分享
  17. 在 vmware ESXi上安装mac系统虚拟机
  18. 【第三方互联】微博1、注册成为新浪微博(sina)开发者
  19. 联想笔记本fn键linux,ThinkPad如何修改fn键默认操作
  20. python爬取拼多多数据_Python---数据的爬取与存储

热门文章

  1. C++中的set(STL的应用部分)
  2. java aapt linux_Android:linux下aapt使用 | 学步园
  3. html编写个人博客_云开发平台开箱,3分钟零基础搭建个人Hexo博客
  4. 易筋SpringBoot 2.1 | 第十五篇:SpringBoot连接池Druid
  5. idea中tomcat不能发布html,idea中Tomcat无法启动成功
  6. 编程实现strcpy函数
  7. python maketrans函数_python中maketrans
  8. android studio for android learning (四) 兼容性问题
  9. 【Gym-102059 G】Fascination Street【亏欠型DP思想】
  10. 【CodeForces - 471D 】【构造差分kmp】MUH and Cube Walls