题意:起床困难综合征出到树上,带单点修改和区间询问
很容易想到在线段树上维护每一位遍历所有操作后会变成什么,但是第一次交TLE了。。。
然后发现我以前写了假的《又是nand》。。。我说怎么跑得这么慢。。。
维护上面说的这个东西并不需要64*2个bool变量,而是可以压到两个unsigned long long里,分别代表每一位输入为0和每一位输入为1。
将两个合并:若输入为0,经过左变量后某些bit会变成1,这些bit在输出中与”若输入为1”的右变量那些bit保持一致,其余bit与”若输入为0”的右变量那些bit保持一致,可得:
c.x0=(a.x0&b.x1)|(~a.x0&b.x0)
另一个同理。c.x1=(a.x1&b.x1)|(~a.x1&b.x0)
于是树剖就可以维护了。得到信息后从高位到低位贪心能选就选。
代码:

#include<cstdio>
#include<cstring>
#define gm 100001
using namespace std;
typedef unsigned long long ll;
int n,m,k;
struct Istream
{static const size_t str=1<<16;char buf[str],*s,*t;Istream():buf(),s(),t(){}char get(){return (s==t)?(t=buf+fread(s=buf,1,str,stdin),*s++):(*s++);}Istream& operator >> (int &x){register char c;do c=get(); while(c<'0'||c>'9');x=0;while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=get();return *this;}Istream& operator>> (ll &x){register char c;do c=get(); while(c<'0'||c>'9');x=0;while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=get();return *this;}
}cin;
struct Ostream
{static const size_t str=1<<16;char buf[str],*s,*t;Ostream():buf(),s(buf),t(buf+str){}~Ostream(){fwrite(buf,1,s-buf,stdout);}void put(char c){(s==t)?(fwrite(s=buf,1,str,stdout),*s++=c):(*s++=c);}Ostream& operator<< (ll x){if(!x){return put('0'),*this;}char a[22],t=1;while(x)a[t++]=x%10,x/=10;while(--t)put(a[t]+'0');return *this;}Ostream& operator<< (const char *x){while(*x) put(*x++);return *this;}
}cout;
const char *endl="\n";
struct info
{ll a,b;info(){}info(const ll &x,int opt){switch(opt){case 1:a=0,b=x;break;case 2:a=x,b=~0ull;break;default:a=x,b=~x;}}info(const ll &a,const ll &b):a(a),b(b){}bool operator () (int x,int y){return y?(b>>x&1ull):(a>>x&1ull);}info operator + (const info &v) const{return info((a&v.b)|(~a&v.a),(b&v.b)|(~b&v.a));}
}pre[262144],suf[262144],nil;
int op[gm];
ll val[gm];
ll pool[gm<<1],*ptr=pool;
struct e
{int t;e *n;e(int t,e *n):t(t),n(n){}inline void* operator new(size_t){return ++ptr;}
}*f[gm];
int sz[gm],fa[gm],son[gm],dfn[gm],dep[gm],top[gm],ord[gm],ct=0;
void dfs1(int x=1)
{sz[x]=1;for(e *i=f[x];i;i=i->n){if(i->t==fa[x]) continue;fa[i->t]=x;dep[i->t]=dep[x]+1;dfs1(i->t);sz[x]+=sz[i->t];if(sz[i->t]>=sz[son[x]]) son[x]=i->t;}
}
void dfs2(int x=1)
{ord[dfn[x]=++ct]=x;top[x]=(x==son[fa[x]]?top[fa[x]]:x);if(son[x]) dfs2(son[x]);for(e *i=f[x];i;i=i->n){if(i->t==fa[x]||i->t==son[x]) continue;dfs2(i->t);}
}
void build(int l=1,int r=n,int o=1)
{if(l==r){pre[o]=suf[o]=info(val[ord[l]],op[ord[l]]);return;}int mid=l+r>>1,ls=o<<1,rs=ls|1;build(l,mid,ls);build(mid+1,r,rs);pre[o]=pre[ls]+pre[rs];suf[o]=suf[rs]+suf[ls];
}
int x,y;
void cast(int l=1,int r=n,int o=1)
{if(l==r){pre[o]=suf[o]=info(val[ord[l]],op[ord[l]]);return;}int mid=l+r>>1,ls=o<<1,rs=ls|1;if(x<=mid) cast(l,mid,ls);else cast(mid+1,r,rs);pre[o]=pre[ls]+pre[rs];suf[o]=suf[rs]+suf[ls];
}
info getpr(int l=1,int r=n,int o=1)
{if(x<=l&&r<=y){return pre[o];}int mid=l+r>>1,ls=o<<1,rs=ls|1;if(y<=mid) return getpr(l,mid,ls);if(mid<x) return getpr(mid+1,r,rs);return getpr(l,mid,ls)+getpr(mid+1,r,rs);
}
info getsf(int l=1,int r=n,int o=1)
{if(x<=l&&r<=y){return suf[o];}int mid=l+r>>1,ls=o<<1,rs=ls|1;if(y<=mid) return getsf(l,mid,ls);if(mid<x) return getsf(mid+1,r,rs);return getsf(mid+1,r,rs)+getsf(l,mid,ls);
}
int LCA(int a,int b)
{while(top[a]!=top[b]){if(dep[top[a]]<dep[top[b]]) a^=b^=a^=b;a=fa[top[a]];}return dep[a]<dep[b]?a:b;
}
info query(int a,int b)
{int lca=LCA(a,b);info ra=nil,rb=nil,res;while(top[a]!=top[lca]){x=dfn[top[a]],y=dfn[a];ra=ra+getsf();a=fa[top[a]];}x=dfn[lca],y=dfn[a];ra=ra+getsf();while(top[b]!=top[lca]){x=dfn[top[b]],y=dfn[b];rb=getpr()+rb;b=fa[top[b]];}if(b!=lca){x=dfn[lca]+1,y=dfn[b];rb=getpr()+rb;}return ra+rb;
}
int main()
{cin>>n>>m>>k;nil.a=0,nil.b=(k==64?~0ull:(1ull<<k)-1);for(int i=1;i<=n;++i)cin>>op[i]>>val[i];for(int i=1;i<n;++i){int u,v;cin>>u>>v;f[u]=new e(v,f[u]);f[v]=new e(u,f[v]);}dfs1(),dfs2(),build();for(int i=1;i<=m;++i){int tp,x,y;ll z;cin>>tp>>x>>y>>z;if(tp==1){info res=query(x,y);ll ans=0,kre=0;for(int i=k-1;~i;--i){if(res(i,0)) ans|=1ull<<i;else if(res(i,1)&&(kre|(1ull<<i))<=z)kre|=1ull<<i,ans|=1ull<<i;}cout<<ans<<endl;}else{op[x]=y,val[x]=z;::x=dfn[x];cast();}}return 0;
}

BZOJ4811: [Ynoi2017]由乃的OJ 重链剖分相关推荐

  1. BZOJ-4811: [Ynoi2017]由乃的OJ (树链剖分 线段树维护区间操作值 好题)

    4811: [Ynoi2017]由乃的OJ Time Limit: 6 Sec  Memory Limit: 256 MB Submit: 366  Solved: 118 [Submit][Stat ...

  2. [BZOJ4811][Ynoi2017]由乃的OJ 树链剖分+线段树

    4811: [Ynoi2017]由乃的OJ Time Limit: 6 Sec  Memory Limit: 256 MB Submit: 405  Solved: 134 [Submit][Stat ...

  3. [BZOJ4811][YNOI2017]由乃的OJ(树链剖分+线段树)

    起床困难综合症那题,只要从高往低贪心,每次暴力跑一边看这一位输入0和1分别得到什么结果即可. 放到序列上且带修改,只要对每位维护一个线段树,每个节点分别记录0和1从左往右和从右往左走完这段区间后变成的 ...

  4. 树链剖分(轻重链剖分)

    树链剖分,是一种将树剖分为链,在链上进行各种操作以达到目的的算法.树链剖分(轻重链剖分)可以解决lca(最近公共祖先),树上操作(对树上两点及经过的路的权值进行求和,修改等操作)等一类操作.对于这些问 ...

  5. 树链剖分(轻重链剖分) 讲解 (模板题目 P3384 【模板】轻重链剖分 )

    P3384 [模板]轻重链剖分 首先先说一下基本概念: 1.重儿子:一个结点的所有儿子中,大小最大的那个(最重的,所以说只有一个,如果有多个儿子的大小相等那就随便取一个). 2.轻儿子:一个结点的儿子 ...

  6. P4719 【模板】“动态 DP“动态树分治(矩阵/轻重链剖分/ddp)

    P4719 [模板]"动态 DP"&动态树分治 求解树上最大权独立集,但是需要支持修改. https://www.luogu.com.cn/problem/solution ...

  7. [XSY] 树与图(树形DP、生成函数、分治NTT、重链剖分)

    树与图 如果真的在图上跑算法,那么光建图复杂度就O(n2logn)O(n^2logn)O(n2logn)了,这显然不可行.所以一定要把 在图上的操作 转换成 在树上的操作 在图上删去点u,相当于在树上 ...

  8. 树链剖分——轻重链剖分

    2022年01月27日,第十三天 1. 题目链接:P3384 [模板]轻重链剖分/树链剖分 思路:树链剖分直接搞,时间复杂度为 O(nlog2n)O(nlog^2n)O(nlog2n) ,通过模板题, ...

  9. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

最新文章

  1. 5 OC 中的三种对象
  2. 1008: [HNOI2008]越狱(计数问题)
  3. 送我Ta的一首歌!--《爱到底》
  4. 据说很多女生都想知道男生是如何上厕所的?
  5. CF5E-Bindian Signalizing【单调栈】
  6. 汇编语言(王爽第三版) 实验5编写、调试具体多个段的程序
  7. PHP的rm指令,git rm 命令
  8. Spring解决bean之间的循环依赖(循环引用)
  9. 一个长方体玻璃容器从里面量长宽_在玻璃鱼缸里用微型观叶植物布置景观,比盆景还要迷人...
  10. WSDM2021 | 多交互注意力网络用于CTR预估中细粒度特征学习
  11. puppet之判断和class
  12. js 不相等 多次随机数_node.js静态\动态服务器
  13. 程序入口地址的直接定制表【 (1) 清屏(2) 设置前景色 (3) 设置背景色 (4) 向上滚动一行】...
  14. 【TSP问题】基于禁忌搜索算法求解旅行商问题Matlab源码
  15. 映美精LoadDeviceStateFromFile问题
  16. 基于LabVIEW的WIFI通信人机交互界面设计
  17. 有效沟通bic法则_职场中5个有效沟通的法则
  18. 一篇文章轻松搞定SpringSecurity权限框架!
  19. 视频怎么转为GIF,如何制作GIF
  20. 哈工大人工智能暑期课实践项目——手写体识别四则运算

热门文章

  1. 浅谈产品经理入门和学习路径
  2. 如何用“底层逻辑“看透世界的底牌?| 刘润最新演讲-学习总结
  3. 极狐阿尔法 S 华为公司自动驾驶体验:100 分鐘无对接,体验类似人工操作
  4. C#控件篇 - PictureBox控件设置滚动条
  5. Sqoop1和Sqoop2的刨析对比
  6. android 函数库,Android Studio 实现开源函数库的离线依赖-greenDAO 3 为例
  7. ——廖一梅《像我这样笨拙地生活》经典语录
  8. redis7 Cluster模式 集群
  9. 链表 - 头节点的意义
  10. 美团Java面试题,java笔试题库微信公众号