Problem Description

一天,一只住在 501 实验室的皮卡丘决定发奋学习,成为像 LeiQ 一样的巨巨,于是他向镇上的贤者金桔请教如何才能进化成一只雷丘。
金桔告诉他需要进化石才能进化,并给了他一个地图,地图上有 n 个小镇,他需要从这些小镇中收集进化石。
接下来他会进行 q 次操作,可能是打听进化石的信息,也可能是向你询问第 l 个小镇到第 r 个小镇之间的进化石种类。
如果是打听信息,则皮卡丘会得到一个小镇的进化石变化信息,可能是引入了新的进化石,也可能是失去了全部的某种进化石。
如果是向你询问,你需要回答他第 l 个小镇到第 r 个小镇之间的进化石种类。

Input

首先输入一个整数 T (1 <= T <= 10),代表有 T 组数据。
每组数据的第一行输入一个整数 n (1 <= n <= 100000) 和一个整数 q (1 <= q <= 100000),分别代表有 n 个小镇,表皮卡丘有 q 次操作。
接下来输入 q 行,对于每次操作,先输入操作类型,然后根据操作类型读入:
1: 紧接着输入 2 个整数 a (1 <= a <= n), b (1 <= b <= 60),表示第 a 个小镇引入了第 b 种进化石
2: 紧接着输入 2 个整数 a (1 <= a <= n), b (1 <= b <= 60),表示第 a 个小镇失去了全部第 b 种进化石
3: 紧接着输入 2 个整数 l, r (1 <= l <= r <= n),表示他想询问从第 l 个到第 r 个小镇上可收集的进化石有哪几种

Output

对于每组输入,首先输出一行 “Case T:”,表示当前是第几组数据。
对于每组数据中的每次 3 操作,在一行中按编号升序输出所有可收集的进化石。如果没有进化石可收集,则输出一个 MeiK 的百分号 “%”(不包括引号)。

Example Input

1
10 10
3 1 10
1 1 50
3 1 5
1 2 20
3 1 1
3 1 2
2 1 50
2 2 20
3 1 2
3 1 10

Example Output

Case 1:
%
50
50
20 50
%
%

裸的线段树,模板题,每个小镇看成一个集合。小镇拥有的进化石种类,看做成元素。把这些元素构成的集合用一个数表示。1<<60 得用转换成long long

#include<bits/stdc++.h>
using namespace std;
struct node
{long long num;//代表小镇拥有的进化石种类
};
#define MID int mid = (l + r) / 2//预处理
#define lson root << 1
#define rson root << 1 | 1
const int MAX = 4 * 100000;
node tree[MAX];
node merge_(node x, node y)//回潮的时候归并
{node t;t.num = x.num | y.num;//求两个集合的并return t;
}
void build(int root, int l, int r)//初始化线段树
{if(l == r)//一个点{tree[root].num = 0;//初始化为0return;}MID;build(lson, l, mid);//递归调用左子树build(rson, mid + 1, r);//右子树tree[root] = merge_(tree[lson], tree[rson]);//回潮归并
}
void updata(int root, int l, int r, int pos, int v)//引进
{if(l == r)//更新数据{tree[root].num = tree[root].num | ((long long)1 << v);//引进return;}MID;if(pos <= mid) updata(lson, l, mid, pos, v);else updata(rson, mid + 1, r, pos, v);tree[root] = merge_(tree[lson], tree[rson]);
}
void udata(int root, int l, int r, int pos, int v)//失去
{if(l == r){tree[root].num = tree[root].num & (~((long long)1 << v));//去除return;}MID;if(pos <= mid) udata(lson, l, mid, pos, v);else udata(rson, mid + 1, r, pos, v);tree[root] = merge_(tree[lson], tree[rson]);
}
long long query(int root, int l, int r, int ul, int ur)//求区间的进化石种类
{long long red = 0;if(ul <= l && r <= ur) return tree[root].num;//在区间范围内返回MID;if(mid >= ul) red = red | query(lson, l, mid, ul, ur);//左子树包含有if(mid < ur) red = red | query(rson, mid + 1, r, ul, ur);//右子树包含有return red;
}
int main()
{int T, cas = 1;scanf("%d", &T);while(T--){printf("Case %d:\n", cas++);int n, q;scanf("%d %d", &n, &q);build(1, 1, n);//初始化while(q--){int k, a, b;scanf("%d %d %d", &k, &a, &b);if(k == 1){updata(1, 1, n, a, b);//引进}else if(k == 2){udata(1, 1, n, a, b);//删除}else if(k == 3){int flag = 0;long long ans = query(1, 1, n, a, b);for(int i = 1; i <= 60; i++){if(ans & ((long long)1 << i))//含有该进化石{if(flag) printf(" ");printf("%d", i);//输出flag++;}}if(!flag) printf("%%");printf("\n");}}}
}

【位运算 线段树】SDUT 3930 皮卡丘的梦想2相关推荐

  1. 皮卡丘的梦想2(线段树+位运算)

    皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 实验 ...

  2. 皮卡丘的梦想(线段树+位运算)

    皮卡丘的梦想2 1000 ms         65536 KiB Submit Status My Status  Origin Description 一天,一只住在 501 实验室的皮卡丘决定发 ...

  3. SDUT3930 - 皮卡丘的梦想2(线段树状态压缩)

    皮卡丘的梦想2 Description 一天,一只住在 501 实验室的皮卡丘决定发奋学习,成为像 LeiQ 一样的巨巨,于是他向镇上的贤者金桔请教如何才能进化成一只雷丘. 金桔告诉他需要进化石才能进 ...

  4. “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 I.皮卡丘的梦想2【树状数组】水题

    皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 的皮 ...

  5. 师创杯”山东理工大学第九届ACM程序设计竞赛(网络同步赛)--I皮卡丘的梦想2

    作为水题王者前去水了一波山东理工大学的校赛,这道题一个小细节坑了我2个小时,思路其实很简单,就是线段树单点更新的模板,用一个60的数组标记,如果这个区间内有I种类的化石,那么就是1,否则为0,加入新化 ...

  6. 皮卡丘的梦想2(线段树+二进制状态压缩)

    Description 一天,一只住在 501 实验室的皮卡丘决定发奋学习,成为像 LeiQ 一样的巨巨,于是他向镇上的贤者金桔请教如何才能进化成一只雷丘. 金桔告诉他需要进化石才能进化,并给了他一个 ...

  7. 【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...

    题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...

  8. BZOJ 4811 树链剖分+线段树

    思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...

  9. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分

    http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...

最新文章

  1. 基于Centos7的autobahn-python+crossbar的环境搭建
  2. JS在即将离开当前页面(刷新或关闭)时触发事件
  3. 深入理解signed、unsigned 关键字
  4. 【Linux】一步一步学Linux——at命令(133)
  5. Java加入背景音乐
  6. 产品经理懂技术=流氓会武术(zz)
  7. 《三体》中的“维度”
  8. python合并word单元格_python之DataFrame实现excel合并单元格_python
  9. ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法
  10. 学习笔记10-C语言-小项目-五子棋
  11. win8.1重装系统计算机管理打不开,Windows8计算机打不开192.168.0.1怎么办
  12. 中国体重管理饮料市场趋势报告、技术动态创新及市场预测
  13. 微信小程序使用代码切换底部导航
  14. Java对接(顺丰、京东、跨越、EMS、DHL、FedEx、UPS)七大快递
  15. 计算机创客教育,浅析职业教育中计算机学科的创客教育
  16. JS加密小结---银行卡号,手机号,姓名加密显示星号
  17. 团队管理——情绪价值
  18. 服务器开虚拟机总是gpu满载,vSphere 环境机器学习 GPU 加速方案选型
  19. 暴力+格式转化+板子真题 蓝桥
  20. 关于unrecognized selector sent to instanc

热门文章

  1. 同一wifi下电脑与手机无法ping通,简单解决
  2. 第三方API对接如何设计接口认证?
  3. mybatis-plus 将查询参数 进行封装 QueryWrapper条件的实现另一种方式
  4. __OPTIMIZE__
  5. 计算机毕业设计SSM二手车交易平台设计【附源码数据库】
  6. 波音737和波音787有多少个座位
  7. 计算机网络英语教学大纲,《计算机网络》课程教学大纲
  8. Linux命令行下查看出口IP(公网IP)
  9. postgresql如何取得行号
  10. 运动历史图MHI——程序解析(超详细)