皮卡丘的梦想2

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 的百分号 “%”(不包括引号)。

Sample 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

Output

Case 1:
%
50
50
20 50
%
%

题目大意:
输入一个t,表示有 t 组测试样例,对于每组测试样例,输入n和q,表示一共有n种化石和q个操作,再输入q行,每行有三个整数。一共有三种操作:

  1. 如果输入1,紧接着输入 2 个整数 a (1 <= a <= n), b (1 <= b <= 60),表示第 a 个小镇引入了第 b 种进化石
  2. 如果输入2,紧接着输入 2 个整数 a (1 <= a <= n), b (1 <= b <= 60),表示第 a 个小镇失去了全部第 b 种进化石
  3. 如果输入3,紧接着输入 2 个整数 l, r (1 <= l <= r <= n),表示他想询问从第 l 个到第 r 个小镇上可收集的进化石有哪几种,并依次输出化石,如果有0种,则输出 %

解题思路:
这道题是线段树和状态压缩的题,关于状态压缩:一共有60种化石,不太好存,所以我们可以用二进制去存储,一开始所有博物馆的化石一定都是0种,我们可以用01来表示该化石的状态,比如:从左到右,第1个二进制位为1,则说明有第1种化石,如果为0则表示没有该种类的化石,我们存的时候和统计的时候都是通过位运算实现的,但是树中的还是要用十进制整数去存,一共有60位,我们用long long 去存。统计种数的时候用一个数组去存,通过位运算来计算哪一位上有1,哪一位上是1则说明有编号为这一位的化石。AC代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
const int _max=1e5+50;
ll tree[4*_max];
void bd(int node,int start,int end)//刚开始初始化都为0
{if(start==end){tree[node]=0;return;}int mid=(start+end)>>1;bd(node*2,start,mid);bd(node*2+1,mid+1,end);tree[node]=(tree[node*2]|tree[node*2+1]);//通过或运算的性质来添加化石,因为只要有一个1就是1,而两者都是1是还是1.return;
}
void update(int node,int start,int end,int idx,int val,int flag)
{if(start==end){ll tmp=1ll<<(val-1);//flag标记来判断添加还是删除化石,-1是因为我们是从1开始左移的,一开始就默认是1了。if(flag)tree[node]|=tmp;elsetree[node]&=(~tmp);//取反以后再与tmp去与,就能保证这一位上的是0,其他位是1.return;}int mid=(start+end)>>1;if(idx<=mid)update(node*2,start,mid,idx,val,flag);elseupdate(node*2+1,mid+1,end,idx,val,flag);tree[node]=(tree[node*2]|tree[node*2+1]);
}
ll query(int node,int start,int end,int l,int r)
{if(l<=start&&r>=end)return tree[node];int mid=(start+end)>>1;ll ans=0;if(l<=mid)ans|=query(node*2,start,mid,l,r);if(r>mid)ans|=query(node*2+1,mid+1,end,l,r);return ans;
}
int main()
{int t,k=1;cin>>t;while(t--){int n,m;cin>>n>>m;printf("Case %d:\n",k++);bd(1,1,n);while(m--){int c,l,r;cin>>c>>l>>r;if(c==1||c==2){if(c==1)update(1,1,n,l,r,1);elseupdate(1,1,n,l,r,0);}else{ll ans=query(1,1,n,l,r);int k=1,k1[65],k2=0;for(int i=0;i<60;i++)if(ans&(1ll<<i))k1[k2++]=i+1;sort(k1,k1+k2);if(k2==0)cout<<'%'<<endl;else{for(int i=0;i<k2-1;i++)//注意一下格式,我PE了一发cout<<k1[i]<<" ";cout<<k1[k2-1]<<endl;  }}}}//system("pause");return 0;
}

SDUT3930 - 皮卡丘的梦想2(线段树状态压缩)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【位运算 线段树】SDUT 3930 皮卡丘的梦想2

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

  7. 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

    我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...

  8. python canvas画弧度_编程作战丨如何利用python绘制可爱皮卡丘?

    好莱坞真人电影<精灵宝可梦:大侦探皮卡丘>预告片已经发布了,正片将于今年5月10日上映. 如果要做一个「童年梦想排行榜」的话,相信「拥有一只皮卡丘」这个梦想一定会名列前茅! 毕竟,谁不想揉 ...

  9. python打印皮卡丘步骤_编程作战丨如何利用python绘制可爱皮卡丘?

    好莱坞真人电影<精灵宝可梦:大侦探皮卡丘>预告片已经发布了,正片将于今年5月10日上映. 如果要做一个「童年梦想排行榜」的话,相信「拥有一只皮卡丘」这个梦想一定会名列前茅! 毕竟,谁不想揉 ...

最新文章

  1. javascript this 关键字学习
  2. 我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!
  3. IDEA创建包不是树形
  4. python现有两个磁盘文件a和b_有两个磁盘文件a和b,各存放一行字母,今要求把这两个文件中的信息合并...
  5. php 伸展菜单代码,上下伸展的JS菜单
  6. SAP License:更改物料基本计量单位
  7. Linux内存实际使用率
  8. 何时创建MVC应用程序
  9. 小学生都能看懂的生成函数入门教程
  10. Windows2019在IIS下添加.NET Framework 3.5 NetFx3 失败 (状态为:0x800f0950)的解决办法)
  11. 《迅雷链精品课》第十二课:PoW 共识算法
  12. ADB登录验证暴力破解工具
  13. 青岛发文:3年将在全市全面实施电子劳动合同和电子集体合同
  14. 计算机系统应用 莫军,Configuration tool for ARINC 653 operating systems
  15. 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合
  16. 【第三届蓝桥杯】手机尾号
  17. 百鸡问题用计算机思维,大力出奇迹:当古代数学难题遇到计算机
  18. FTP服务器的搭建与配置
  19. 洛谷题解——P1873:砍树
  20. 数据驱动「付费转化」的3个思路

热门文章

  1. java抽奖课程设计_java课程设计-彩票购买抽奖程序
  2. css 点击(onMouseDown和onMouseUp)后,hover失效
  3. 物联网新秀—辽宁奥普泰,全新工作模式亮相│2021CPSE安博会现场直击
  4. 写作的灵感从哪来?又要到哪里去?
  5. 43页县域农业大数据运营服务中心方案介绍
  6. [转]来自微信团队的Apk瘦身经验
  7. 抖音seo源码开发,开源技术保姆式搭建
  8. 仿手机QQ个人信息页面下拉放大背景图片
  9. [C++11]左值、右值、左值引用、右值引用小结
  10. 【phpcms-v9】利用phpcms-v9站群功能建立多个分站