【BZOJ2049,2631,3282,1180】LCT模板四连A
好吧我并不想讲LCT
只是贴4个代码~
【BZOJ2049】[Sdoi2008]Cave 洞穴勘测
#include <cstdio>
#include <cstring>
#include <iostream>
#define isr(A) (s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
using namespace std;
const int maxn=10010;
int n,m;
struct NODE
{
int ch[2],fa,rev; }s[10010];
char str[20];
void pushdown(int x)
{
if(s[x].rev)
{
swap(s[x].ch[0],s[x].ch[1]);
if(s[x].ch[0]) s[s[x].ch[0]].rev^=1;
if(s[x].ch[1]) s[s[x].ch[1]].rev^=1;
s[x].rev=0;
}
}
void rotate(int x)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;
s[y].ch[d]=s[x].ch[d^1],s[y].fa=x,s[x].fa=z;
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
}
void pd(int x){if(!isr(x)) pd(s[x].fa); pushdown(x);}
void splay(int x)
{
pd(x);
while(!isr(x))
{
int y=s[x].fa,z=s[y].fa;
if(!isr(y))
{
if((x==s[y].ch[1])^(y==s[z].ch[1])) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
int y=0;
while(x) splay(x),s[x].ch[1]=y,y=x,x=s[x].fa;
}
void maker(int x)
{
access(x),splay(x),s[x].rev^=1;
}
int findr(int x)
{
access(x),splay(x);
while(s[x].ch[0]) pushdown(x),x=s[x].ch[0];
return x;
}
void link(int x,int y)
{
maker(x),s[x].fa=y;
}
void cut(int x,int y)
{
maker(y),access(x),splay(x);
s[x].ch[0]=s[y].fa=0;
}
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int main()
{
n=rd(),m=rd();
int i,a,b;
for(i=1;i<=m;i++)
{
scanf("%s",str);
a=rd(),b=rd();
switch(str[0])
{
case 'D':cut(a,b); break;
case 'C':link(a,b); break;
case 'Q':if(findr(a)==findr(b)) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}
【BZOJ2631】tree
此题的下传标记实在是长,好在我把它写到结构体里了
据说此题必须用unsigned int,不明觉厉~
#include <cstdio>
#include <cstring>
#include <iostream>
#define isr(A) (s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
#define mod 51061
using namespace std;
typedef unsigned int ui;
struct node
{
ui ch[2],fa,rev;
ui ts,tc,sum,siz,v;
void C(ui x) {v=v*x%mod,sum=sum*x%mod,tc=tc*x%mod,ts=ts*x%mod;}
void S(ui x) {v=(v+x)%mod,sum=(sum+siz*x)%mod,ts=(ts+x)%mod;}
}s[100010];
char str[10];
ui n,m;
void pushup(ui x)
{
s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
s[x].sum=(s[s[x].ch[0]].sum+s[s[x].ch[1]].sum+s[x].v)%mod;
}
void pushdown(ui x)
{
if(s[x].rev)
{
swap(s[x].ch[0],s[x].ch[1]);
if(s[x].ch[0]) s[s[x].ch[0]].rev^=1;
if(s[x].ch[1]) s[s[x].ch[1]].rev^=1;
s[x].rev=0;
}
if(s[x].tc!=1)
{
if(s[x].ch[0]) s[s[x].ch[0]].C(s[x].tc);
if(s[x].ch[1]) s[s[x].ch[1]].C(s[x].tc);
s[x].tc=1;
}
if(s[x].ts)
{
if(s[x].ch[0]) s[s[x].ch[0]].S(s[x].ts);
if(s[x].ch[1]) s[s[x].ch[1]].S(s[x].ts);
s[x].ts=0;
}
}
void rotate(ui x)
{
ui y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;
s[y].ch[d]=s[x].ch[d^1],s[x].fa=z,s[y].fa=x;
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
void updata(ui x)
{
if(!isr(x)) updata(s[x].fa);
pushdown(x);
}
void splay(ui x)
{
updata(x);
while(!isr(x))
{
ui y=s[x].fa,z=s[y].fa;
if(!isr(y))
{
if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(ui x)
{
ui y=0;
while(x) splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa;
}
void maker(ui x)
{
access(x),splay(x),s[x].rev^=1;
}
void cut(ui x,ui y)
{
maker(y),access(x),splay(x);
s[x].ch[0]=s[y].fa=0,pushup(x);
}
void link(ui x,ui y)
{
maker(y),s[y].fa=x;
}
ui rd()
{
ui ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int main()
{
n=rd(),m=rd();
ui i,a,b,c,d;
for(i=1;i<=n;i++) s[i].v=1;
for(i=1;i<n;i++) link(rd(),rd());
for(i=1;i<=m;i++)
{
scanf("%s",str),a=rd(),b=rd();
switch(str[0])
{
case '*':c=rd(),maker(a),access(b),splay(b),s[b].C(c); break;
case '+':c=rd(),maker(a),access(b),splay(b),s[b].S(c); break;
case '-':c=rd(),d=rd(),cut(a,b),link(c,d); break;
case '/':maker(a),access(b),splay(b),printf("%u\n",s[b].sum); break;
}
}
return 0;
}
【BZOJ3282】Tree
判断一下是否联通就好了
#include <cstdio>
#include <iostream>
#include <cstring>
#define isr(A) (s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
using namespace std;
int n,m;
struct node
{
int ch[2],fa,sum,v,rev;
}s[300010];
void pushup(int x)
{
s[x].sum=s[s[x].ch[0]].sum^s[s[x].ch[1]].sum^s[x].v;
}
void pushdown(int x)
{
if(s[x].rev)
{
swap(s[x].ch[0],s[x].ch[1]);
if(s[x].ch[0]) s[s[x].ch[0]].rev^=1;
if(s[x].ch[1]) s[s[x].ch[1]].rev^=1;
s[x].rev=0;
}
}
void rotate(int x)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;
s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
void updata(int x)
{
if(!isr(x)) updata(s[x].fa);
pushdown(x);
}
void splay(int x)
{
updata(x);
while(!isr(x))
{
int y=s[x].fa,z=s[y].fa;
if(!isr(y))
{
if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
int y=0;
while(x) splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa;
}
void maker(int x)
{
access(x),splay(x),s[x].rev^=1;
}
void cut(int x,int y)
{
maker(x),access(y),splay(y);
if(s[x].fa==y) s[x].fa=s[y].ch[0]=0,pushup(y);
}
void link(int x,int y)
{
maker(x),s[x].fa=y;
}
void split(int a,int b)
{
maker(a),access(b),splay(b);
}
int findr(int x)
{
access(x),splay(x);
while(s[x].ch[0]) x=s[x].ch[0];
return x;
}
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int main()
{
n=rd(),m=rd();
int i,a,b,c;
for(i=1;i<=n;i++) s[i].sum=s[i].v=rd();
for(i=1;i<=m;i++)
{
c=rd(),a=rd(),b=rd();
switch(c)
{
case 0:split(a,b),printf("%d\n",s[b].sum); break;
case 1:if(findr(a)!=findr(b)) link(a,b); break;
case 2:cut(a,b); break;
case 3:splay(a),s[a].v=b,pushup(a); break;
}
}
return 0;
}
[CROATIAN2009]OTOCI
我经常把ch[]数组开成int ch[0];不知道有谁跟我经常犯一样的错误。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#define isr(A) (s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
using namespace std;
int n,m;
struct node
{
int ch[2],fa,sum,v,rev;
}s[30010];
char str[20];
void pushup(int x)
{
s[x].sum=s[s[x].ch[0]].sum+s[s[x].ch[1]].sum+s[x].v;
}
void pushdown(int x)
{
if(s[x].rev)
{
swap(s[x].ch[0],s[x].ch[1]);
if(s[x].ch[0]) s[s[x].ch[0]].rev^=1;
if(s[x].ch[1]) s[s[x].ch[1]].rev^=1;
s[x].rev=0;
}
}
void rotate(int x)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;
s[y].fa=x,s[x].fa=z,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
void updata(int x)
{
if(!isr(x)) updata(s[x].fa);
pushdown(x);
}
void splay(int x)
{
updata(x);
while(!isr(x))
{
int y=s[x].fa,z=s[y].fa;
if(!isr(y))
{
if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
int y=0;
while(x) splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa;
}
void maker(int x)
{
access(x),splay(x),s[x].rev^=1;
}
void link(int x,int y)
{
maker(x),s[x].fa=y;
}
int findr(int x)
{
access(x),splay(x);
while(s[x].ch[0]) x=s[x].ch[0];
return x;
}
void split(int x,int y)
{
maker(y),access(x),splay(x);
}
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int main()
{
n=rd();
int i,a,b,c;
for(i=1;i<=n;i++) s[i].sum=s[i].v=rd();
m=rd();
for(i=1;i<=m;i++)
{
scanf("%s",str),a=rd(),b=rd();
switch(str[0])
{
case 'b':if(findr(a)!=findr(b)) printf("yes\n"),link(a,b);
else printf("no\n"); break;
case 'p':splay(a),s[a].v=b,pushup(a); break;
case 'e':if(findr(a)!=findr(b)) printf("impossible\n");
else split(a,b),printf("%d\n",s[a].sum); break;
}
}
return 0;
}
【BZOJ2049,2631,3282,1180】LCT模板四连A的更多相关文章
- LCT模板
之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...
- [BZOJ - 2631] tree 【LCT】
题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...
- LCT 模板及套路总结
这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...
- BZOJ2049[Sdoi2008]洞穴勘测——LCT
题目描述 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如 ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (四)
Xamarin XAML语言教程构建ControlTemplate控件模板 (四) 2.在页面级别中构建控件模板 如果开发者要在页面级别中构建控件模板,首先必须将ResourceDictionary添 ...
- [洛谷P1501] [国家集训队]Tree II(LCT模板)
传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #in ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
- BZOJ 1180 / 2843 LCT模板题_双倍经验
一大早上到机房想先拍一下模板,热热身. 结果....对照着染色敲的 LCT 竟然死活也调不过去(你说我抄都能抄错) 干脆自己重新敲了一遍,10min就敲完了....... 还是要相信自己 Code: ...
- [BZOJ2049][Sdoi2008]Cave 洞穴勘测 LCT模板
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9705 Solved: 4674[Submit] ...
随机推荐
- POJ 3279 Fliptile (二进制+搜索)
[题目链接]click here~~ [题目大意]: 农夫约翰知道聪明的牛产奶多. 于是为了提高牛的智商他准备了例如以下游戏. 有一个M×N 的格子,每一个格子能够翻转正反面,它们一面是黑色,还有一面 ...
- 统计重复字符串 如 eeefffkkkhjk 得到如下结果 3e3f3khjk;
//统计重复字符串 如 eeefffkkkhjk 得到如下结果 3e3f3khjk; string zipStr = Console.ReadLine(); var charList = zipStr ...
- canvas 压缩图片的大小
使用 signature_pad canvas 库生成的图片太大.但又没有提供方法来压缩. 当然这是根据你canvas的画布大小决定的,某些原因导致我的画布就得是那么大. 随随便便一个图片转化为bas ...
- mysql数据类型与运算符
一.数据类型 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediu ...
- How To run OAI eNB (No S1) with USRP X310(1)
How To run OAI eNB (No S1) with USRP X310 1.Things need to be done 1.1 Install Ubuntu 14.04 1.1.1 In ...
- vue 单元测试
单元测试 配置和工具 任何兼容基于模块的构建系统都可以正常使用,但如果你需要一个具体的建议,可以使用Karma进行自动化测试.它有很多社区版的插件,包括对webpack和browserify的支持. ...
- 记一次线上MySQL数据库死锁问题
最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过.这次刚好遇到了,便在此记录一下 ...
- 16V554 的测试代码
//------------------------------------------------------------------------ #include "AT16C554 ...
- Android——Android Bundle类(转)
今天发现自己连Bundle类都没有搞清楚,于是花时间研究了一下. 根据google官方的文档(http://developer.android.com/reference/android/os/Bun ...
- iconfont补遗
一.TureTpe(.ttf)格式: .ttf字体是Windows和Mac的最常见的字体,是一种RAW格式,因此他不为网站优化,支持这种字体的浏览器有[IE9+,Firefox3.5+,Chrome4 ...