【位运算 线段树】SDUT 3930 皮卡丘的梦想2
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相关推荐
- 皮卡丘的梦想2(线段树+位运算)
皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 实验 ...
- 皮卡丘的梦想(线段树+位运算)
皮卡丘的梦想2 1000 ms 65536 KiB Submit Status My Status Origin Description 一天,一只住在 501 实验室的皮卡丘决定发 ...
- SDUT3930 - 皮卡丘的梦想2(线段树状态压缩)
皮卡丘的梦想2 Description 一天,一只住在 501 实验室的皮卡丘决定发奋学习,成为像 LeiQ 一样的巨巨,于是他向镇上的贤者金桔请教如何才能进化成一只雷丘. 金桔告诉他需要进化石才能进 ...
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 I.皮卡丘的梦想2【树状数组】水题
皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 的皮 ...
- 师创杯”山东理工大学第九届ACM程序设计竞赛(网络同步赛)--I皮卡丘的梦想2
作为水题王者前去水了一波山东理工大学的校赛,这道题一个小细节坑了我2个小时,思路其实很简单,就是线段树单点更新的模板,用一个60的数组标记,如果这个区间内有I种类的化石,那么就是1,否则为0,加入新化 ...
- 皮卡丘的梦想2(线段树+二进制状态压缩)
Description 一天,一只住在 501 实验室的皮卡丘决定发奋学习,成为像 LeiQ 一样的巨巨,于是他向镇上的贤者金桔请教如何才能进化成一只雷丘. 金桔告诉他需要进化石才能进化,并给了他一个 ...
- 【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...
题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...
- BZOJ 4811 树链剖分+线段树
思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...
- 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 ...
最新文章
- 基于Centos7的autobahn-python+crossbar的环境搭建
- JS在即将离开当前页面(刷新或关闭)时触发事件
- 深入理解signed、unsigned 关键字
- 【Linux】一步一步学Linux——at命令(133)
- Java加入背景音乐
- 产品经理懂技术=流氓会武术(zz)
- 《三体》中的“维度”
- python合并word单元格_python之DataFrame实现excel合并单元格_python
- ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法
- 学习笔记10-C语言-小项目-五子棋
- win8.1重装系统计算机管理打不开,Windows8计算机打不开192.168.0.1怎么办
- 中国体重管理饮料市场趋势报告、技术动态创新及市场预测
- 微信小程序使用代码切换底部导航
- Java对接(顺丰、京东、跨越、EMS、DHL、FedEx、UPS)七大快递
- 计算机创客教育,浅析职业教育中计算机学科的创客教育
- JS加密小结---银行卡号,手机号,姓名加密显示星号
- 团队管理——情绪价值
- 服务器开虚拟机总是gpu满载,vSphere 环境机器学习 GPU 加速方案选型
- 暴力+格式转化+板子真题 蓝桥
- 关于unrecognized selector sent to instanc