CF 339D - Xenia and Bit Operations(线段树)
2014-03-04 17:41
405 查看
由于点的个数为2^n,如果把每一步操作列出来,可以发现这是一颗满二叉树,因此,可以使用线段树维护每个操作后的值,再用一个节点来记录操作的类型,然后直接修改就行了。
代码:
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; const int maxn=(1<<18)+10; int val[maxn],type[maxn]; void PushUp(int rt) { type[rt]=type[rt<<1]^1; if(type[rt]) val[rt]=val[rt<<1]|val[rt<<1|1]; else val[rt]=val[rt<<1]^val[rt<<1|1]; } void build(int l,int r,int rt) { if(l==r) { scanf("%d",&val[rt]); type[rt]=0; return; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); PushUp(rt); } void Update(int p,int l,int r,int rt,int v) { if(l==r) { val[rt]=v; return; } int m=(l+r)>>1; if(m>=p) Update(p,l,m,rt<<1,v); else Update(p,m+1,r,rt<<1|1,v); PushUp(rt); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,m,N; scanf("%d%d",&n,&m); N=1<<n; build(1,N,1); int p,v; while(m--) { scanf("%d%d",&p,&v); Update(p,1,N,1,v); printf("%d\n",val[1]); } return 0; }
相关文章推荐
- linux如何升级内核
- linux下so动态库一些不为人知的秘密(上)
- centos yum搭建LAMP
- Linux GCC常用命令:编译流程、第三方库使用及其加载
- cenos 本地yum搭建
- linux定时任务 crontab
- apache2.2.11开启ssi功能
- linux文件夹打包命令
- 各种打印机故障排错及解决
- (看过来)hadoop平台配置怎么配都不会错
- TSM Server for Linux安装注意事项
- ARM linux的启动部分源代码简略分析
- openwrt下面创建/添加package----Makefile模版
- Linux C编程--进程间通信(IPC)3--信号集和发送信号介绍
- Linux进程控制——exec函数族
- Hadoop Self learning
- Linux学习记录--shell介绍
- Linux学习记录--shell介绍
- Linux中的目录和权限
- glloader 3.7.0发布,支持最新的OpenGL 4.2