清北学堂模拟赛d1t6 或和异或(xor)

题目描述

LYK最近在研究位运算,它研究的主要有两个:or和xor。(C语言中对于|和^)

为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组。它第一次先对所有相邻两个数执行or操作,得到一个2^(n-1)长度的数组。也就是说,如果一开始时a[1],a[2],…,a[2^n],执行完第一次操作后,会得到a[1] or a[2],a[3] or a[4] ,…, a[(2^n)-1] or a[2^n]。

第二次操作,LYK会将所有相邻两个数执行xor操作,得到一个2^(n-2)长度的数组,假如第一次操作后的数组是b[1],b[2],…,b[2^(n-1)],那么执行完这次操作后会变成b[1] xor b[2], b[3] xor b[4] ,…, b[(2^(n-1))-1] xor b[2^(n-1)]。

第三次操作,LYK仍然将执行or操作,第四次LYK执行xor操作。如此交替进行。

最终这2^n个数一定会变成1个数。LYK想知道最终这个数是多少。

为了让这个游戏更好玩,LYK还会执行Q次修改操作。每次修改原先的2^n长度的数组中的某一个数,对于每次修改操作,你需要输出n次操作后(最后一定只剩下唯一一个数)剩下的那个数是多少。

输入格式(xor.in)

第一行两个数n,Q。

接下来一行2^n个数ai表示一开始的数组。

接下来Q行,每行两个数xi,yi,表示LYK这次的修改操作是将a{xi}改成yi。

输出格式(xor.out)

Q行,表示每次修改操作后执行n次操作后剩下的那个数的值。

输入样例

2 4

1 6 3 5

1 4

3 4

1 2

1 2

输出样例

1

3

3

3

样例解释

第一次修改,{4,6,3,5}->{6,7}->{1}

第二次修改,{4,6,4,5}->{6,5}->{3}

第三次修改,{2,6,4,5}->{6,5}->{3}

第四次修改,{2,6,4,5}->{6,5}->{3}

对于30%的数据n<=17,Q=1。

对于另外20%的数据n<=10,Q<=1000。

对于再另外30%的数据n<=12,Q<=100000。

对于100%的数据1<=n<=17,1<=Q<=10^5,1<=xi<=2^n,0<=yi<2^30,0<=ai<2^30。

分析:考试的时候这道题是T3,题面又很长,就没信心做下去直接打了个暴力,竟然还有50分,现在看,竟然就是一道裸的线段树的题......

它的每一次操作都对应线段树的合并操作,我们只需要记录一下深度,看看进行哪一次操作就可以了.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n, q,maxn,c[1000010];

void build(int o, int l, int r, int dep)
{
    if (l == r)
    {
        scanf("%d", &c[o]);
        return;
    }
    int mid = (l + r) >> 1;
    build(o * 2, l, mid, dep + 1);
    build(o * 2 + 1, mid + 1, r, dep + 1);
    if ((n - dep + 1) % 2 == 1)
        c[o] = c[o * 2] | c[o * 2 + 1];
    else
        c[o] = c[o * 2] ^ c[o * 2 + 1];
}

void update(int o, int l, int r, int x, int v, int dep)
{
    if (l == r)
    {
        c[o] = v;
        return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid)
        update(o * 2, l, mid, x, v, dep + 1);
    if (x > mid)
        update(o * 2 + 1, mid + 1, r, x, v, dep + 1);
    if ((n - dep + 1) % 2 == 1)
        c[o] = c[o * 2] | c[o * 2 + 1];
    else
        c[o] = c[o * 2] ^ c[o * 2 + 1];
}

int main()
{
    scanf("%d%d", &n, &q);
    maxn = (1 << n);
    build(1, 1, maxn,1);
    for (int i = 1; i <= q; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        update(1, 1, maxn, x, y, 1);
        printf("%d\n", c[1]);
    }

    return 0;
}
时间: 2024-10-12 20:09:10

清北学堂模拟赛d1t6 或和异或(xor)的相关文章

清北学堂模拟赛day7 数字碰撞

/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #

清北学堂模拟赛day7 石子合并加强版

/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #define ll long long #define fo(i,

清北学堂模拟赛day7 错排问题

/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x∩y,把除t以外的搞一下容斥就行了 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<c

清北学堂模拟day4 传球接力

[问题描述]n 个小朋友在玩传球. 小朋友们用 1 到 n 的正整数编号. 每个小朋友有一个固定的传球对象,第 i 个小朋友在接到球后会将球传给第 ai个小朋友, 并且第 i 个小朋友与第 ai个小朋友之间的距离为 di.一次传球接力是这样进行的:由一个小朋友发球,将球传给他的传球对象,之后接到球的小朋友再将球传给自己的传球对象,如此传球若干次后停止. 期间,包括发球者在内,每个小朋友至多只能拿到球一次. 一次传球接力的总距离是每次传球的距离的总和.小朋友们想进行一次总距离最长的传球接力,现在需

清北学堂模拟day4 业务办理

[问题描述]在银行柜台前,有 n 个顾客排队办理业务. 队伍中从前往后,第 i 位顾客办理业务需要ti 分钟时间. 一位顾客的等待时间定义为:队伍中在他之前的所有顾客和他自己的办理业务时间的总和.第 i 位顾客有一个最长等待时间 di,如果超过了时间 di, 业务还没有办理完成,那么这位顾客就会觉得不满意. 具体来说, 假设第 i 位顾客的等待时间为 fi,若 fi > di, 则这位顾客的不满意度为 fi-di,否则不满意度为 0.你作为银行里的职员,需要安排这 n 位顾客的初始排队顺序,使得

清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天

铁轨 清北学堂 线段树

铁轨 清北学堂 线段树 [题目描述] R 国的铁轨经常会进行重新修建. R 国是一个细长的国家,一共有 n 个城市排成一排,首都位于 1 号城市,相邻两个城市之间有铁路相连. 每次新建铁轨的时候,一定是从首都开始修建,直到某一个城市为止,这其间的铁路都会变成新版本的设 施,而旧设施会被拆除.然而,由于 R 国的工程师脑子不太好使,任意两种不同版本的铁路之间都无法连 接,因此必须要进行换乘. 现在给出你修建铁轨的操作,小 R 时不时第会想问你,如果在第 x 个城市到第 y 个城市之间随机选择一个

济南清北学堂游记 Day 5.

十一月的第一天.算下来在济南已经呆了接近一星期了...... 还剩九天...看着洛谷的倒计时心里直发慌. 也许我不该过多纠结于高级算法,基础也是很重要的. 今天晚上就自由的敲一些板子吧.最后的九天,让自己不能留有遗憾才行. 今天的模拟赛就整体来说...较往常持平,依然是T1可写正解 T2 T3暴力...可暴力总是写挂...只有两个半小时时间也很难抽出时间对拍.. (今天借rqy的机械键盘用了一下,哇这个是真的用起来爽...这个青轴的声音听起来让人上瘾..) 明天还不知会有什么更加难写的题,加油吧

济南清北学堂游记 Day 7.

完结撒花? 最后的模拟赛与讲题.大家似乎仍然乐在其中,虽然看评测结果,仍然是满地红. 其实到了最后已经是没有多少可写的了..... 一个精彩的地方是晚上填表的时候,群里炸锅了已经.到处都在刷CCL老师的表情23333 (CCL表示让他们疯去吧) 大概的想了想这几天的内容,在最后的七天里,要做的事情还有很多. (学校模拟赛的出题任务又甩给我了...星期天就要比的..) 先列一些出来吧. 11.4 搞三个题,如果有时间就复习一下排序 查找 二分等基础操作. 11.5 树与图的相关算法(包括新增的二分