皮卡丘的梦想2
来源:互联网 发布:网络嗅探器免费版 编辑:程序博客网 时间:2024/04/30 02:03
皮卡丘的梦想2
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
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
%
%
Hint
#include <iostream>#include <cstdio>#include <cstring>#include <stack>using namespace std;struct node{ unsigned long long val;}tree[400000];void bulid(int root,int left,int right){ if(left==right) { tree[root].val = 0; return ; } int mid = (left+right)>>1; bulid((root<<1)+1,left,mid); bulid((root<<1)+2,mid+1,right); tree[root].val = tree[(root<<1)+1].val +tree[(root<<1)+2].val;}void updata1(int root,int left,int right,int pos,unsigned long long val){ if(left==right) { tree[root].val = tree[root].val | val; return ; } int mid = (left + right)>>1; int lc = (root<<1)+1; int rc = (root<<1)+2; if(pos<=mid) updata1(lc,left,mid,pos,val); else updata1(rc,mid+1,right,pos,val); tree[root].val = tree[lc].val | tree[rc].val;}void updata2(int root,int left,int right,int pos,unsigned long long val){ if(left==right) { tree[root].val = tree[root].val & val; return ; } int mid = (left + right)>>1; int lc = (root<<1)+1; int rc = (root<<1)+2; if(pos<=mid) updata2(lc,left,mid,pos,val); else updata2(rc,mid+1,right,pos,val); tree[root].val = tree[lc].val | tree[rc].val;}unsigned long long query(int root,int left,int right,int qleft,int qright){ unsigned long long res = 0; if(qleft<=left&&qright>=right) return tree[root].val; int mid = (left + right)>>1; int lc = (root<<1)+1; int rc = (root<<1)+2; if(qleft<=mid) res = res | query(lc,left,mid,qleft,qright); if(qright>mid) res = res | query(rc,mid+1,right,qleft,qright); return res;}int main(){ unsigned long long Y = 1; int t; scanf("%d",&t); for(int j = 1;j<=t;j++) { printf("Case %d:\n",j); int n,m; scanf("%d %d",&n,&m); bulid(0,0,n-1); for(int i = 0;i<m;i++) { unsigned long long x,y,z; scanf("%lld %lld %lld",&x,&y,&z); if(x==1) { z = Y<<z; updata1(0,0,n-1,y-1,z); } else if(x==2) { z = ~(unsigned long long)(Y<<z); updata2(0,0,n-1,y-1,z); } else if(x==3) { int flag = 1; unsigned long long res = query(0,0,n-1,y-1,z-1); //xxx(res); if(res) { for(int k = 1;k<=60;k++) { if(res&Y<<(k)) { if(flag) { printf("%d",k); flag = 0; } else printf(" %d",k); } } printf("\n"); } else { printf("%%\n"); } } } }}
- 皮卡丘的梦想2
- 皮卡丘的梦想
- sdutoj 皮卡丘的梦想2 状态压缩+线段树
- 皮卡丘的梦想2(线段树+位运算)
- 【位运算 && 线段树】SDUT 3930 皮卡丘的梦想2
- SDUT 3513 皮卡丘的梦想 (二进制+线段树) -- 解题报告
- 师创杯”山东理工大学第九届ACM程序设计竞赛(网络同步赛)--I皮卡丘的梦想2
- “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 I.皮卡丘的梦想2【树状数组】水题
- 山东理工大学2017校赛 3930皮卡丘的梦想2—线段树加状压 3926bLue的二叉树-KMP或hash 3914校赛~校赛~-打表找规律
- 可爱的皮卡丘~~~
- 皮卡丘是如何发电的?
- 2324: [ZJOI2011]营救皮卡丘|有上下界的费用流
- 营救皮卡丘
- 梦想的大学 大学的梦想
- 【程序员的梦想】:今日之梦想
- 偶的梦想~~
- 我的毕业梦想~~
- 我的梦想
- linux权限2
- 浅析大型网站架构之分布式消息队列
- springboot小结
- MFC中进度控件的基本用法
- CC_CALLBACK_0/2/3的使用.
- 皮卡丘的梦想2
- [kuangbin带你飞]专题17:B
- 网络编程复习(一):最原始的BIO网络编程
- C++内联函数
- TCP/IP学习笔记(4)-ICMP协议,ping和Traceroute
- Java 并发编程:volatile的使用及其原理
- 大数据的概述
- 写给自己的博客
- C#DataSet操作for与foreach的区别