bzoj 4811 由乃的OJ

  • 考虑树链剖分.
  • 树剖后用一颗线段树维护一段连续区间,类似于一个函数,各位上进入 \(0/1\) ,输出的数字分别是什么.注意到最多只有 \(64\) 位,可以用一个 \(unsigned\ long\ long\) 的大数状压表示,合并两段区间时推导一下可以做到 \(O(1)\) .
  • 注意 \(3 种\)位运算混在一起,满足交换律,却不满足结合律,所以从区间左/右侧进入同一个数,最后得到的数不同.需要维护两个方向的函数.
  • 修改时在线段树上单点修改就好,查询用树剖的基本操作,先找出 \(x\to y\) 这一段的函数,再贪心构造解.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
typedef unsigned long long ull;
ull read(){
ull nm=0,fh=1;char cw=getchar();
for(;!isdigit(cw);cw=getchar()) ;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
const int MAXN=2e5+10;
ull cnt=0,head[MAXN],to[MAXN<<1],nx[MAXN<<1];
inline void addedge(ull u,ull v)
{
++cnt;
to[cnt]=v;
nx[cnt]=head[u];
head[u]=cnt;
}
inline void ins(ull u,ull v)
{
addedge(u,v);
addedge(v,u);
}
const unsigned long long U1=1;
ull fa[MAXN],siz[MAXN],mxson[MAXN],top[MAXN],dfn[MAXN],rnk[MAXN],dep[MAXN],idx=0;
void dfs1(ull u)
{
siz[u]=U1;
dep[u]=dep[fa[u]]+U1;
for(ull i=head[u];i>0;i=nx[i])
{
ull v=to[i];
if(v==fa[u])
continue;
fa[v]=u;
dfs1(v);
siz[u]+=siz[v];
if(siz[v]>siz[mxson[u]])
mxson[u]=v;
}
}
void dfs2(ull u,ull Tp)
{
dfn[u]=++idx;
rnk[idx]=u;
top[u]=Tp;
if(mxson[u]>0)
dfs2(mxson[u],Tp);
for(ull i=head[u];i>0;i=nx[i])
{
ull v=to[i];
if(v==fa[u] || v==mxson[u])
continue;
dfs2(v,v);
}
}
inline ull calc(ull x,ull bas,ull op)
{
if(op==1)
return x&bas;
if(op==2)
return x|bas;
return x^bas;
}
ull val[MAXN],opt[MAXN];
unsigned long long maxv=0;
struct node{
ull l,r;
ull d[2][2];//d[左入/右入][全0/全1]
void init(ull v,ull op)
{
d[0][0]=d[1][0]=calc(0,v,op);
d[0][1]=d[1][1]=calc(maxv,v,op);
}
void merge(node L,node R)
{
d[0][0]=(L.d[0][0]&R.d[0][1])|((~L.d[0][0])&R.d[0][0]);
d[1][0]=(R.d[1][0]&L.d[1][1])|((~R.d[1][0])&L.d[1][0]);
d[0][1]=(L.d[0][1]&R.d[0][1])|((~L.d[0][1])&R.d[0][0]);
d[1][1]=(R.d[1][1]&L.d[1][1])|((~R.d[1][1])&L.d[1][0]);
}
void inverse()
{
swap(d[0][0],d[1][0]);
swap(d[0][1],d[1][1]);
}
};
struct SegmentTree{
#define root Tree[o]
#define lson Tree[o<<1]
#define rson Tree[o<<1|1]
node Tree[MAXN<<2];
void BuildTree(ull o,ull l,ull r)
{
root.l=l,root.r=r;
if(l==r)
{
root.init(val[rnk[l]],opt[rnk[l]]);
return;
}
ull mid=(l+r)>>1;
BuildTree(o<<1,l,mid);
BuildTree(o<<1|1,mid+1,r);
root.merge(lson,rson);
}
void update(ull o,ull pos,ull newv,ull newopt)
{
ull l=root.l,r=root.r;
if(l==r)
{
root.init(newv,newopt);
return;
}
ull mid=(l+r)>>1;
if(pos<=mid)
update(o<<1,pos,newv,newopt);
else
update(o<<1|1,pos,newv,newopt);
root.merge(lson,rson);
}
node query(ull o,ull L,ull R)
{
ull l=root.l,r=root.r;
if(L<=l && r<=R)
return root;
node res;
res.init(0,3);
if(l>R || r<L)
return res;
res.merge(query(o<<1,L,R),query(o<<1|1,L,R));
return res;
}
}T;
ull n,m,k;
void init()
{
ull rt=(n+1)>>1;
fa[rt]=0;
for(ull i=0;i<k;i++)
maxv+=(U1<<i);
dfs1(rt);
dfs2(rt,rt);
T.BuildTree(1,1,n);
}
ull solve(ull x,ull y,ull lim)
{
ull tot=0;
node res1,res2,cur;
res1.init(0,3);
res2.init(0,3);
while(top[x]!=top[y])
{
if(dep[top[x]]>dep[top[y]])
{
res1.merge(T.query(1,dfn[top[x]],dfn[x]),res1);
x=fa[top[x]];
}
else
{
res2.merge(T.query(1,dfn[top[y]],dfn[y]),res2);
y=fa[top[y]];
}
}
if(dep[x]>dep[y])
{
node c=T.query(1,dfn[y],dfn[x]);
res1.merge(c,res1);
}
else
{
node c=T.query(1,dfn[x],dfn[y]);
res2.merge(c,res2);
}
res1.inverse();
cur.merge(res1,res2);
for(ull i=k;i-->0;)
{
if(cur.d[0][0] & (U1<<i))
tot+=(U1<<i);
else if( ( (cur.d[0][1]) & (U1<<i) ) >0 && lim>=(U1<<i) )
lim-=(U1<<i),tot+=(U1<<i);
}
return tot;
}
int main()
{
n=read(),m=read(),k=read();
for(ull i=1;i<=n;++i)
opt[i]=read(),val[i]=read();
for(ull i=1;i<n;++i)
{
ull u=read(),v=read();
ins(u,v);
}
init();
while(m--)
{
ull op=read();
ull x=read(),y=read(),z=read();
if(op==1)
cout<<solve(x,y,z)<<endl;
else
T.update(1,dfn[x],z,y);
}
return 0;
}

bzoj 4811 由乃的OJ的更多相关文章

  1. bzoj 4811: [Ynoi2017]由乃的OJ

    树链剖分,用zkw线段树维护每条链两个方向上对每一位的变换情况,由于位数较少,可以用两个unsigned long long表示 #include<cstdio> typedef unsi ...

  2. BZOJ 4811 [Ynoi2017]由乃的OJ ——Link-Cut Tree

    直接维护按照顺序经过每一段,初始的1可以变成什么,初始为0可以变成什么. 然后答案就可以和起床困难综合征一样贪心处理了. 写起来并不好写. 发现交换左右子树之后答案会改变,GG 调了一天,最后还是T掉 ...

  3. BZOJ 4811 树链剖分+线段树

    思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...

  4. bzoj 1565 [NOI2009]植物大战僵尸 解题报告

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2161  Solved: 1000[Submit][Stat ...

  5. 博主自传——蒟蒻的OI之路

    博主来自河北石家庄市第二中学,现在读高二,主攻信息学竞赛(其实并没有学习其他学科竞赛). NOIP中人品大爆发,使劲挤进河北省一等奖队伍,侥幸留在竞赛团队中(差点就淘汰出局啦). 关于我的ID,YOU ...

  6. 【BZOJ】3224: Tyvj 1728 普通平衡树(某不科学的oj)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3224 无力吐槽,无力吐槽,无力吐槽....... bzoj竟然不能用time(0)我竟然不造!!re ...

  7. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  8. bzoj 3678 wangxz与OJ

    3678: wangxz与OJ Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.php ...

  9. BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常

    Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...

随机推荐

  1. Deep Learning入门

    今天在看电影的过程中我忽然想起来几件特别郁闷的事,我居然忘了上周三晚上的计算机接口的实验课!然后我又想起来我又忘了上周六晚上的就业指导!然后一阵恐惧与责备瞬间涌了上来.这事要是在以前我绝对会释然的,可 ...

  2. [Vue]实例化Vue时的两种挂载方式el与$mount

    Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作.判断等),之后要手动挂载上.new Vue时,el和$mount并没有本质上的不同. 1.el Vue实 ...

  3. Android Codenames, Tags, and Build Numbers

    Starting with Cupcake, individual builds are identified with a short build code, e.g. FRF85B. The fi ...

  4. bzoj1014: [JSOI2008]火星人prefix splay+hash+二分

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  5. JS返回一个数据的千分位格式

    /** * 价钱转换-从右往左每3位数字加一个逗号 * @param price 需要转换的价格 */ formatPrice(price){ var newPrice = price.split(' ...

  6. IOS-数据缓存

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

  7. 暗网 tor溯源困难根因——用户的请求会在分布全球的主机随机跳转三次,最终才到达服务器,这就造成了溯源的极其困难

    Tor(The Onion Router)可以说是目前最为流行的网络匿名访问技术,用户的请求会在分布全球的主机随机跳转三次,最终才到达服务器,这就造成了溯源的极其困难,从而使得所有的访问者完全没有身份 ...

  8. Apache编译安装

    1.准备好源码包并配置好yum源,需要的源码包包括:httpd-2.4.18.apr-1.5.2.tar.gz.apr-util-1.5.4.tar.gz 2.准备用户 groupadd -r apa ...

  9. eureka-4-eureka server 高可用

    Eureka Server 可以通过运行多个实例并相互注册实现高可用部署.Eureka Server 实例之间会彼此增量同步信息,确保所有节点信息一致. 关键点: 配置: eureka.client. ...

  10. nodejs之log4js日志记录模块简单配置使用

    在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...