线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations

题目传送门

 1 /*
 2     线段树的单点更新:有一个交叉更新,若rank=1,or;rank=0,xor
 3     详细解释:http://www.xuebuyuan.com/1154895.html
 4 */
 5 #include <cstdio>
 6 #include <iostream>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <string>
10 #include <cmath>
11 #include <set>
12 #include <map>
13 using namespace std;
14 #define lson l, mid, rt << 1
15 #define rson mid+1, r, rt << 1 | 1
16
17 const int MAXN = 1 << 17 | 1;
18 const int INF = 0x3f3f3f3f;
19 struct NODE
20 {
21     int v, mx, mn, sum;
22     int rank;
23 }node[MAXN << 2];
24
25 void push_up(int rt)
26 {
27     if (node[rt<<1].rank == 1)
28     {
29         node[rt].rank = 0;
30         node[rt].v = node[rt<<1].v | node[rt<<1|1].v;
31     }
32     else
33     {
34         node[rt].rank = 1;
35         node[rt].v = node[rt<<1].v ^ node[rt<<1|1].v;
36     }
37 }
38
39
40 void build(int l, int r, int rt)
41 {
42     if (l == r)
43     {
44         scanf ("%d", &node[rt].v);
45         node[rt].rank = 1;
46         return ;
47     }
48     int mid = (l + r) >> 1;
49     build (lson);
50     build (rson);
51
52     push_up (rt);
53 }
54
55 void updata(int p, int b, int l, int r, int rt)
56 {
57     if (l == r)
58     {
59         node[rt].v = b;
60         return ;
61     }
62     int mid = (l + r) >> 1;
63     if (p <= mid)    updata (p, b, lson);
64     else    updata (p, b, rson);
65
66     push_up (rt);
67 }
68
69
70 int main(void)        //Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations
71 {
72     //freopen ("H.in", "r", stdin);
73
74     int n, m;
75     scanf ("%d%d", &n, &m);
76     build (1, 1<<n, 1);
77
78     int p, b;
79     for (int i=1; i<=m; ++i)
80     {
81         scanf ("%d%d", &p, &b);
82         updata (p, b, 1, 1<<n, 1);
83         printf ("%d\n", node[1].v);
84     }
85
86     return 0;
87 }
时间: 2024-11-06 19:50:07

线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations的相关文章

set+线段树 Codeforces Round #305 (Div. 2) D. Mike and Feet

题目传送门 1 /* 2 题意:对于长度为x的子序列,每个序列存放为最小值,输出长度为x的子序列的最大值 3 set+线段树:线段树每个结点存放长度为rt的最大值,更新:先升序排序,逐个添加到set中 4 查找左右相邻的位置,更新长度为r - l - 1的最大值,感觉线段树结构体封装不错! 5 详细解释:http://blog.csdn.net/u010660276/article/details/46045777 6 其实还有其他解法,先掌握这种:) 7 */ 8 #include <cstd

C. Watto and Mechanism 字典树 Codeforces Round #291 (Div. 2)

C. Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Watto, the owner of a spare parts store, has recently got an order for the mechanism that can process strings in a ce

Codeforces Round #197 (Div. 2) A. Helpful Maths【字符串/给一个连加计算式,只包含数字 1、2、3,要求重新排序,使得连加的数字从小到大】

A. Helpful Maths time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Xenia the beginner mathematician is a third year student at elementary school. She is now learning the addition operation.

Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction   思维,并查集 或 线段树 题意:一个字符串被删除了,但给出 n条信息,要还原出可能的字典序最小的字符串.信息有:字符串ti,ki个位置xi,表明原本的字符串在xi位置是以字符串ti开头的. tags:惨遭 fst,一开始把所有字符串都存下来,排序做的,结果爆内存了.. 方法1: 考虑并查集,对于字符串 ti,在位置xi,

Codeforces Round #426 (Div. 2) D. The Bakery(线段树维护dp)

题目链接: Codeforces Round #426 (Div. 2) D. The Bakery 题意: 给你n个数,划分为k段,每段的价值为这一段不同的数的个数,问如何划分,使得价值最大. 题解: 考虑dp[i][j]表示划分为前j个数划分为i段的最大价值,那么这就是一个n*n*k的dp, 考虑转移方程dp[i][j]=max{dp[i][k]+val[k+1][j]},我们用线段树去维护这个max,线段树上每个节点维护的值是dp[i][k]+val[k+1][j],对于每加进来的一个数a

Codeforces Round #401 (Div. 2) E 贪心,线段树

Codeforces Round #401 (Div. 2) A 循环节 B 暴力排一下 C 标记出来,但10^5,特耿直地码了个O(n^2)的上去,最气的是在最后3分钟的时候被叉== D 从后往前贪心暴糙一下就好.比赛时一眼瞄出来了不敢写,搞不懂这样竟然不会超时.. E. Hanoi Factory 题意:n个环体,内径a[i],外径b[i],高h[i].当 a[i+1]<b[i]<=b[i+1] 时,第 i 个环体可以堆在第 i+1个环体上.求可以堆出的最高高度. tags:佩服那些大佬,

Codeforces Round #424 (Div. 2) E. Cards Sorting(线段树)

题目链接:Codeforces Round #424 (Div. 2) E. Cards Sorting 题意: 将n个数放进一个队列,每次检查队首,看看是不是队列中最小的数,如果是就扔掉,如果不是就放到队尾. 这样直到队列为空,为需要操作多少次. 题解: 考虑用两个指针模拟,最开始now指针指向第一个数,然后nxt指针指向下一个将要被删除的数. 然后我们要算出这里需要移动多少步,然后删掉这个数,一直重复操作,直到将全部的数删完. nxt指针可以用set来维护,now指针可以用并查集来维护. 计

Nastya Hasn&#39;t Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)

题目链接 传送门 题面 题意 给你一个\(a\)数组和一个\(k\)数组,进行\(q\)次操作,操作分为两种: 将\(a_i\)增加\(x\),此时如果\(a_{i+1}<a_i+k_i\),那么就将\(a_{i+1}\)变成\(a_i+k_i\),如果\(a_{i+2}<a_i+k_i\),则将\(a_{i+2}\)变成\(a_{i+1}+k_{i+1}\),以此类推. 查询\(\sum\limits_{i=l}^{r}a_i\). 思路 我们首先存下\(k\)数组的前缀和\(sum1\),

Codeforces Round #261 (Div. 2) D 树状数组应用

看着题意:[1,i]中等于a[i]的个数要大于[,jn]中等于a[j]的个数 且i<j,求有多少对这样的(i,j)  ,i<j但是 i前面的合法个数 要大于j后面的 看起来很像逆序数的样子,所以很容易往树状数组想去,但是处理就看个人了,像我比赛的时候就处理得非常的麻烦,虽做出了但是花时间也多,经过杰哥的教育,其实正着塞进树状数组 反着来找就可以了,灰常的简单清晰明了,贴一发纪念我的搓比 int n; int aa[1000000 + 55]; int bb[1000000 + 55]; int