BZOJ2908: 又是nand
Description
Input
Output
Sample Input
2 7 3
1 2
2 3
Query 2 3
Replace 1 3
Query 1 1
Sample Output
7
HINT
100%的数据N、M≤100000,K≤32
我们发现nand这个东西啊,excited。。。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
typedef unsigned int uint;
inline uint read() {
uint x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=100010;
int n,m,k,first[maxn],next[maxn<<1],to[maxn<<1],e;
void AddEdge(int u,int v) {
to[++e]=v;next[e]=first[u];first[u]=e;
to[++e]=u;next[e]=first[v];first[v]=e;
}
int fa[maxn],son[maxn],siz[maxn],dep[maxn];
void dfs(int x) {
dep[x]=dep[fa[x]]+1;siz[x]=1;
ren if(to[i]!=fa[x]) {
fa[to[i]]=x;dfs(to[i]);
siz[x]+=siz[to[i]];if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
}
}
int top[maxn],pos[maxn],cnt;
void build(int x,int tp) {
top[x]=tp;pos[x]=++cnt;
if(son[x]) build(son[x],tp);
ren if(to[i]!=fa[x]&&to[i]!=son[x]) build(to[i],to[i]);
}
int lca(int x,int y) {
int f1=top[x],f2=top[y];
while(f1!=f2) {
if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);
x=fa[f1];f1=top[x];
}
return dep[x]<dep[y]?x:y;
}
struct Node {
uint sum0,sum1;
}T[maxn<<2],T2[maxn<<2];
uint all,val[maxn];
uint nand(uint x,uint y) {return (x&y)^all;}
Node operator + (Node A,Node B) {
Node C;C.sum0=C.sum1=0;
rep(i,0,k-1) {
if(A.sum0>>i&1) {
if(B.sum1>>i&1) C.sum0|=1u<<i;
}
else {
if(B.sum0>>i&1) C.sum0|=1u<<i;
}
if(A.sum1>>i&1) {
if(B.sum1>>i&1) C.sum1|=1u<<i;
}
else {
if(B.sum0>>i&1) C.sum1|=1u<<i;
}
}
return C;
}
void maintain(int o) {
int lc=o<<1,rc=lc|1;
T[o]=T[lc]+T[rc];
T2[o]=T2[rc]+T2[lc];
}
void update(int o,int l,int r,int p,uint v) {
if(l==r) T[o]=T2[o]=(Node){nand(0,v),nand(all,v)};
else {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
if(p<=mid) update(lc,l,mid,p,v);
else update(rc,mid+1,r,p,v);
maintain(o);
}
}
Node ans;
int flag;
void query(int o,int l,int r,int ql,int qr,int tp) {
if(ql<=l&&r<=qr) {
if(!flag) ans=(!tp?T[o]:T2[o]),flag=1;
else ans=ans+(!tp?T[o]:T2[o]);
}
else {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
if(!tp) {
if(ql<=mid) query(lc,l,mid,ql,qr,tp);
if(qr>mid) query(rc,mid+1,r,ql,qr,tp);
}
else {
if(qr>mid) query(rc,mid+1,r,ql,qr,tp);
if(ql<=mid) query(lc,l,mid,ql,qr,tp);
}
}
}
int Ql[maxn],Qr[maxn],Top;
void query(int x,int y) {
int z=lca(x,y),f,ql,qr;
f=top[x];flag=0;
while(f!=top[z]) {
ql=pos[f];qr=pos[x];
query(1,1,n,ql,qr,1);
x=fa[f];f=top[x];
}
ql=pos[z];qr=pos[x];
query(1,1,n,ql,qr,1);
f=top[y];
while(f!=top[z]) {
ql=pos[f];qr=pos[y];
Ql[++Top]=ql;Qr[Top]=qr;
y=fa[f];f=top[y];
}
ql=pos[z]+1;qr=pos[y];
if(ql<=qr) Ql[++Top]=ql,Qr[Top]=qr;
while(Top) {
query(1,1,n,Ql[Top],Qr[Top],0);
Top--;
}
printf("%u\n",ans.sum0);
}
int main() {
n=read();m=read();k=read();
rep(i,0,k-1) all|=1ll<<i;
rep(i,1,n) val[i]=read();
rep(i,2,n) AddEdge(read(),read());
dfs(1);build(1,1);
rep(i,1,n) update(1,1,n,pos[i],val[i]);
rep(i,1,m) {
char c=Getchar();while(!isalpha(c)) c=Getchar();
int x=read(),y=read();
if(c=='Q') query(x,y);
else update(1,1,n,pos[x],y);
}
return 0;
}
BZOJ2908: 又是nand的更多相关文章
- 【BZOJ2908】又是nand 树链剖分+线段树
[BZOJ2908]又是nand escription 首先知道A nand B=not(A and B) (运算操作限制了数位位数为K)比如2 nand 3,K=3,则2 nand 3=not (2 ...
- 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树
[BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NAND Flash的基本操作——读、写、擦除
基本操作 这里将会简要介绍一下NAND Flash的基本操作在NAND Flash内部是如何进行的,基本操作包括:读.写和擦除. 读: 当我们读取一个存储单元中的数据时(如图2.4),是使 ...
- 怎么看时序图--nand flash的读操作详解(转载)
出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知 ...
- MTD下的Nand驱动
目录 MTD下的Nand驱动 引入 平台设备资源文件 关键数据结构 平台框架 s3c24xx_nand_probe nand_scan s3c2410_nand_add_partition add_m ...
- 怎么看时序图--nand flash的读操作详解
出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html 这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本 ...
- 转载:百为STM32开发板教程之十二——NAND FLASH
http://bbs.21ic.com/icview-586200-1-1.html 百为STM32开发板教程之十二——NAND FLASH 参考资料:百为stm32开发板光盘V3\百为stm32开发 ...
- 3D NAND闪存是个啥?让国内如此疯狂
Repost: https://news.mydrivers.com/1/477/477251.htm 上个月底武汉新芯科技主导的国家级存储器产业基地正式动工,在大基金的支持下该项目将投资240亿美元 ...
随机推荐
- grub2添加win引导(未试用)
http://www.ruesin.com/system/centos/centos7-grub2-193.html
- 通过挂载系统光盘搭建本地yum仓库的方法
在CentOS系统中,我们常常会安装大量的软件,但许多软件包都存在需要依赖性,当然我们可以通过一一安装依赖包来完成安装,但对于有些软件包需要大量的依赖包,再一一安装起来会显得特别麻烦.接下来我们就来讲 ...
- 6. UIImageView 的使用
1. UIImageView 的认识 QQ:853740091 UIImageView 继承UIView,通过他的名字我们也可以看出这个是用来显示图片的 2. 使用方法 UIImageView *im ...
- javascript中的对象
除了字符串,数字,布尔值(true,false),null,undefined,js中的值都是对象. 操作一个对象 var o = {name: 'man', value: 99} o.name = ...
- Mysql Master-slave 主从配置
MySQL主从复制 场景描述:主数据库服务器:192.168.10.130,MySQL已经安装,并且无应用数据.从数据库服务器:192.168.10.131,MySQL已经安装,并且无应用数据. 2. ...
- LINQ
lambda表达式: LINQ to Object: 参考:http://www.cnblogs.com/leon-y-liu/articles/3575009.html LINQ to XML: u ...
- mac版本cornerstone的无限期破解方法【转】
CornerStone是个人非常喜欢的mac上的一款SVN客户端工具,官方提供了14天的免费试用(trail)版本.我们可以在此基础上提供无限期试用版本. 方法一:如果你从来没有安装过这个trail版 ...
- 转 centos虚拟机环境的构建。
转自:http://www.cnblogs.com/xiaoluo501395377/archive/2013/03/31/CentOs.html 一.前言 作为一个想从事j2ee后台开发的程序猿,l ...
- PHPExcel 大数据的导出
PHPExcel 是一个php语言读取导出数据.导入生成Excel的类库,使用起来非常方便,但有时会遇到以些问题,比如导出的数据超时,内存溢出等. 下面我们来说说这些问题和解决办法. PHPExcel ...
- ABP中单元测试的技巧:Mock和数据驱动
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:虽然ABP为大家提供了测试的脚手架了,不过有些小技巧还是需要自己探索的. ASP.NE ...