洛谷P3950 部落冲突 [LCT]
部落冲突
格式难调,体面就不放了。
分析:
julao们应该都看得出来就是个$LCT$板子,战争就$cut$,结束就$link$,询问就$find$。没了。。。
太久没打$LCT$,然后发现自己之前貌似理解得并不透彻,打得还是不熟。。。
Code:
- //It is made by HolseLee on 5th Sep 2018
- //Luogu.org P3950
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<iostream>
- #include<iomanip>
- #include<algorithm>
- using namespace std;
- const int N=3e5+;
- int n,m,fa[N],ch[N][],sign[N],cnt,q[N],top;
- struct War{
- int x,y; bool flag;
- }a[N];
- inline int read()
- {
- char c=getchar(); int num=; bool flag=false;
- while( c<'' || c>'' ) {
- if( c=='-' ) flag=false;
- c=getchar();
- }
- while( c>='' && c<='' ) {
- num=(num<<)+(num<<)+(c^);
- c=getchar();
- }
- return flag ? -num : num;
- }
- inline void pushdown(int x)
- {
- if( !sign[x] ) return;
- int temp=ch[x][];
- sign[ch[x][]=ch[x][]]^=;
- sign[ch[x][]=temp]^=;
- sign[x]=;
- }
- inline bool isroot(int x)
- {
- return (ch[fa[x]][]!=x && ch[fa[x]][]!=x);
- }
- inline void rotate(int x)
- {
- int y=fa[x], z=fa[y];
- int k=ch[y][]==x, w=ch[x][k^];
- if( !isroot(y) ) ch[z][ch[z][]==y]=x;
- ch[x][k^]=y; ch[y][k]=w;
- if( w ) fa[w]=y; fa[x]=z; fa[y]=x;
- }
- inline void splay(int x)
- {
- top=; q[top]=x;
- for(int i=x; !isroot(i); i=fa[i])
- q[++top]=fa[i];
- while( top ) pushdown(q[top--]);
- while( !isroot(x) ) {
- int y=fa[x], z=fa[y];
- if( !isroot(y) ) {
- (ch[y][]==x)^(ch[z][]==y) ? rotate(x) : rotate(y);
- }
- rotate(x);
- }
- }
- inline void access(int x)
- {
- for(int y=; x; y=x,x=fa[x]) {
- splay(x); ch[x][]=y;
- }
- }
- inline int find(int x)
- {
- access(x); splay(x);
- while( ch[x][] )pushdown(x),x=ch[x][];
- splay(x);
- return x;
- }
- inline void makeroot(int x)
- {
- access(x); splay(x); sign[x]^=;
- }
- inline void split(int x,int y)
- {
- makeroot(x); access(y); splay(y);
- }
- inline void link(int x,int y)
- {
- makeroot(x);
- fa[x]=y;
- }
- inline void cut(int x,int y)
- {
- split(x,y);
- fa[x]=ch[y][]=;
- }
- int main()
- {
- n=read(); m=read();
- char opt[]; int x,y;
- for(int i=; i<n; ++i) {
- x=read(), y=read();
- link(x,y);
- }
- for(int i=; i<=m; ++i) {
- scanf("%s",opt);
- if( opt[]=='Q' ) {
- x=read(), y=read();
- if( find(y)==find(x) ) printf("Yes\n");
- else printf("No\n");
- } else if( opt[]=='C' ) {
- x=read(), y=read();
- cut(x,y);
- a[++cnt].x=x, a[cnt].y=y;
- a[cnt].flag=false;
- } else {
- x=read();
- if( a[x].flag ) continue;
- link(a[x].x,a[x].y);
- a[x].flag=true;
- }
- }
- return ;
- }
洛谷P3950 部落冲突 [LCT]的更多相关文章
- 洛谷 P3950 部落冲突 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3 ...
- 洛谷P3950 部落冲突(LCT)
洛谷题目传送门 最无脑LCT题解,Dalao们的各种算法都比这个好多啦... 唯一的好处就是只管码代码就好了 开战cut,停战link,询问findroot判连通性 太无脑,应该不用打注释了.常数大就 ...
- 【刷题】洛谷 P3950 部落冲突
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...
- 洛谷:P3950 部落冲突
原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边 ...
- [题解] 洛谷P3950 部落冲突
传送门 拿到题目,一看 裸LCT (其实是我懒得打,splay又臭又长) 首先,这道题的意思就是删掉一些边 所以常规操作 点权转边权 之后对于战争操作,在对应的边上+1 对于和平操作,在对应的边上-1 ...
- [洛谷P3950]部落冲突
题目大意:给你一棵树,有$3$个操作: $Q\;p\;q:$询问$p,q$是否连通 $C\;p\;q:$把$p->q$这条边割断 $U\;x:$恢复第$x$次操作二 题解:可以在割断时把这条边赋 ...
- Cogs 2856. [洛谷U14475]部落冲突
2856. [洛谷U14475]部落冲突 ★★★ 输入文件:lct.in 输出文件:lct.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 在一个叫做Travi ...
- 洛谷 U14475 部落冲突 【比赛】 【树链剖分 + 线段树】
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...
- lupgu P3950 部落冲突
题目链接 luogu P3950 部落冲突 题解 树剖线段树可以 lct还行 代码 #include<cstdio> #include<algorithm> inline in ...
随机推荐
- gcc和MinGW的异同
cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...
- selenium利用Excel进行参数化(简单示例)
上篇搭建好环境后,正真开始我的自动化之旅了.... 开始之前特别说明一下testNG的版本,不能直接使用Eclipse直接线上下载的版本,线上版本太高,不能兼容,运行程序会报以下错误,需要自行下载低一 ...
- DES加密解密类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...
- [USACO07FEB] Lilypad Pond
https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...
- 重构改善既有代码设计--重构手法16:Introduce Foreign Method (引入外加函数)&& 重构手法17:Introduce Local Extension (引入本地扩展)
重构手法16:Introduce Foreign Method (引入外加函数)你需要为提供服务的类增加一个函数,但你无法修改这个类.在客户类中建立一个函数,并以第一参数形式传入一个服务类实例. 动机 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings
[题意]带修改的查询区间第k小 [算法]树状数组套可持久化线段树 [题解]对于树状数组上的每个节点,维护可持久化权值线段树(节点为权值),从而达到查询前缀和的目的. 对于每次修改,在待修改线段树基础上 ...
- 面向对象 ( OO ) 的程序设计——理解对象
本文地址:http://www.cnblogs.com/veinyin/p/7607938.html 1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可 ...
- Use of exceptionless, 作全局日志分布式记录处理
Download latest release of exceptionless on github and deploy on Window server, by default exception ...
- 51Nod 1256 扩展欧几里得求乘法逆元
给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...
- 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)
题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...