BZOJ 4811 [Ynoi2017]由乃的OJ ——Link-Cut Tree
直接维护按照顺序经过每一段,初始的1可以变成什么,初始为0可以变成什么。
然后答案就可以和起床困难综合征一样贪心处理了。
写起来并不好写。
发现交换左右子树之后答案会改变,GG
调了一天,最后还是T掉了
肝败吓疯
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define L ch[x][0]
#define R ch[x][1]
#define ll unsigned long long
#define mp make_pair
#define maxn 400005 int n,m,k; ll all; namespace Link_Cut_Tree{
int ch[maxn][2],fa[maxn];
int rev[maxn];
int opt[maxn],sta[maxn],top=0;
ll num[maxn],tag1[maxn],tag0[maxn],revtag0[maxn],revtag1[maxn];
void print(int x)
{D(i,k-1,0) {printf("%d",(x>>i)&1);if (i==0) break;}}
ll Maker(ll tmp,int opt,ll x)
{
switch(opt)
{
case 1: return tmp&x; break;
case 2: return tmp|x; break;
case 3: return tmp^x; break;
}
}
void pushdown(int k);
void update(int x)
{
if (rev[L]&&rev[R])
{
tag1[x]=(Maker(revtag1[R],opt[x],num[x])&revtag1[L])|((~Maker(revtag1[R],opt[x],num[x]))&revtag0[L]);
tag0[x]=(Maker(revtag0[R],opt[x],num[x])&revtag1[L])|((~Maker(revtag0[R],opt[x],num[x]))&revtag0[L]);
revtag1[x]=(Maker(tag1[L],opt[x],num[x])&tag1[R])|((~Maker(tag1[L],opt[x],num[x]))&tag0[R]);
revtag0[x]=(Maker(tag0[L],opt[x],num[x])&tag1[R])|((~Maker(tag0[L],opt[x],num[x]))&tag0[R]);
}
else if (rev[L])
{
tag1[x]=(Maker(tag1[R],opt[x],num[x])&revtag1[L])|((~Maker(tag1[R],opt[x],num[x]))&revtag0[L]);
tag0[x]=(Maker(tag0[R],opt[x],num[x])&revtag1[L])|((~Maker(tag0[R],opt[x],num[x]))&revtag0[L]);
revtag1[x]=(Maker(tag1[L],opt[x],num[x])&revtag1[R])|((~Maker(tag1[L],opt[x],num[x]))&revtag0[R]);
revtag0[x]=(Maker(tag0[L],opt[x],num[x])&revtag1[R])|((~Maker(tag0[L],opt[x],num[x]))&revtag0[R]);
}
else if (rev[R])
{
tag1[x]=(Maker(revtag1[R],opt[x],num[x])&tag1[L])|((~Maker(revtag1[R],opt[x],num[x]))&tag0[L]);
tag0[x]=(Maker(revtag0[R],opt[x],num[x])&tag1[L])|((~Maker(revtag0[R],opt[x],num[x]))&tag0[L]);
revtag1[x]=(Maker(revtag1[L],opt[x],num[x])&tag1[R])|((~Maker(revtag1[L],opt[x],num[x]))&tag0[R]);
revtag0[x]=(Maker(revtag0[L],opt[x],num[x])&tag1[R])|((~Maker(revtag0[L],opt[x],num[x]))&tag0[R]);
}
else
{
tag1[x]=(Maker(tag1[R],opt[x],num[x])&tag1[L])|((~Maker(tag1[R],opt[x],num[x]))&tag0[L]);
tag0[x]=(Maker(tag0[R],opt[x],num[x])&tag1[L])|((~Maker(tag0[R],opt[x],num[x]))&tag0[L]);
revtag1[x]=(Maker(revtag1[L],opt[x],num[x])&revtag1[R])|((~Maker(revtag1[L],opt[x],num[x]))&revtag0[R]);
revtag0[x]=(Maker(revtag0[L],opt[x],num[x])&revtag1[R])|((~Maker(revtag0[L],opt[x],num[x]))&revtag0[R]);
}
}
bool isroot(int k)
{return ch[fa[k]][0]!=k&&ch[fa[k]][1]!=k;}
void pushdown(int k)
{
if (rev[k])
{
rev[k]^=1;
rev[ch[k][0]]^=1;
rev[ch[k][1]]^=1;
swap(ch[k][0],ch[k][1]);
if (rev[ch[k][0]]) pushdown (ch[k][0]);
update(k);
}
}
void rot(int x)
{
int y=fa[x],z=fa[y],l,r;
if (ch[y][0]==x) l=0; else l=1;
r=l^1;
if (!isroot(y))
{
if (ch[z][0]==y) ch[z][0]=x;
else ch[z][1]=x;
}
fa[x]=z; fa[y]=x; fa[ch[x][r]]=y;
ch[y][l]=ch[x][r]; ch[x][r]=y;
update(y); update(x);
}
void splay(int x)
{
top=0; sta[++top]=x;
for (int i=x;!isroot(i);i=fa[i]) sta[++top]=fa[i];
while (top) pushdown(sta[top--]);
while (!isroot(x))
{
int y=fa[x],z=fa[y];
if (!isroot(y))
{
if ((ch[y][0]==x)^(ch[z][0]==y)) rot(x);
else rot(y);
}
rot(x);
}
}
void access(int x)
{for (int t=0;x;t=x,x=fa[x])splay(x),ch[x][1]=t,update(x);}
void makeroot(int x)
{access(x); splay(x); rev[x]^=1;}
int find(int x)
{
access(x);
splay(x);
while (ch[x][0]) x=ch[x][0];
return x;
}
void cut(int x,int y)
{
makeroot(x);
access(y);
splay(y);
if (ch[y][0]==x) ch[y][0]=fa[x]=0;
update(y);
}
void link(int x,int y)
{
makeroot(x);
fa[x]=y;
}
void modify(int x,int op,ll xi)
{access(x);splay(x);opt[x]=op;num[x]=xi;update(x);}
void query(int x,int y,ll z)
{
makeroot(y);access(x);splay(x);
ll ret=0,ans=0;
for (int i=k-1;i>=0;--i)
{
if ((((tag1[x]>>i)&1LLu)==1LLu)&&(((tag0[x]>>i)&1LLu)==0))
{if ((ans|(1LLu<<i))<=z) ans|=1LLu<<i,ret|=1LLu<<i;}
else if ((((tag0[x]>>i)&1LLu)==1LLu)) ret|=1LLu<<i;
}
printf("%llu\n",ret);
}
void init(int k)
{tag1[0]=all;tag0[0]=0;revtag1[0]=all; revtag0[0]=0;opt[0]=1;num[0]=all;}
} using namespace Link_Cut_Tree; int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} ll Getull()
{
ll x=0; char ch=getchar();
while (ch<'0'||ch>'9')ch=getchar();
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x;
} int main()
{
n=Getint(); m=Getint(); k=Getint();
F(i,0,k-1) all|=(1LLu<<i); init(k);
F(i,1,n)
opt[i]=Getint(),num[i]=Getull();
F(i,2,n)
{
int a,b;
a=Getint(); b=Getint();
link(a,b);
}
F(i,1,m)
{
int Q,x,y;ll z;
Q=Getint(); x=Getint(); y=Getint(); z=Getull();
switch(Q)
{
case 1: query(x,y,z); break;
case 2: modify(x,y,z);break;
}
}
}
BZOJ 4811 [Ynoi2017]由乃的OJ ——Link-Cut Tree的更多相关文章
- bzoj 4811: [Ynoi2017]由乃的OJ
树链剖分,用zkw线段树维护每条链两个方向上对每一位的变换情况,由于位数较少,可以用两个unsigned long long表示 #include<cstdio> typedef unsi ...
- [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)
[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...
- link cut tree 入门
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...
- Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...
- Link/cut Tree
Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...
随机推荐
- Warning: skipping non-radio button in group
Question: 最近在开发中,设计了一个对话框来进行一系列的设定,其中有一组Radio Buttons(单选按钮),但在Debug下,发现对话的弹出有点延迟,经过分析,确定是因为在对话框弹出之 ...
- 【extjs6学习笔记】0.1 准备:基础概念 (01)
1. Ext.application 应用程序入口点 2. Ext.onReady() 页面加载完成后触发动作 3. Ext.define() 4. Ext.data.proxy.Proxy 5. E ...
- APP启动原理
当我们点击一个应用的时候,系统会自动创建一个相应的activity类实例,然后执行Oncreate方法,接着会执行以下两行代码,解释如下: super.onCreate(savedInstanceSt ...
- COGS 264. 数列操作
时间限制:1 s 内存限制:160 MB [问题描述] 假设有一列数 {Ai }(1 ≤ i ≤ n) ,支持如下两种操作: (1)将 A k 的值加 D .( k, D 是输入的数) (2) 输 ...
- 如何解决源码安装软件中make时一直重复打印configure信息
在通过源码安装软件时,会出现执行./configure后再make时总是重复打印configure的信息,无法进入下一阶段的安装. 主要原因是系统当前的时间与实际时间不一致,特别是在虚拟机上经常会出现 ...
- JAVASCRIPT闭包以及原型链
方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...
- python基础一 day14 复习
迭代器和生成器迭代器:双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir(数据))可迭代的一定 ...
- C++ _ const的用法,特别是用在函数前面与后面的区别!
在普通的非 const成员函数中 this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const成员函数中 this的类型是一个指向 ...
- Electric Motor Manufacturer - Motor Protection: 5 Questions, 5 Answers
I. Selection principle of motor protectorThe Electric Motor Manufacturer stated that the reasonab ...
- iOS Crash
常见原因及解决方法: 1. 访问数组类对象越界或插入了空对象NSMutableArray/NSMutableDictionary/NSMutableSet 等类下标越界,或者 insert 了一个 n ...