皮卡丘的梦想2

1000 ms         65536 KiB

Submit Status My Status  Origin

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

Copy1
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

CopyCase 1:
%
50
50
20 50
%
%

Source

【“师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛】bLue

题解:题目咋一看感觉是线段树的模板题,但是麻烦在需要你输出石头的种类,这就不是单纯的线段树了,还需要加入一点二进制的思想(好像还是第一次接触到这样的二进制思想题目),用二进制从右向左0代表没有1代表有,如01001代表这个村庄有1号和4号石头,如此便可快速的输出石头的种类,同时线段树的区间合并需要用或运算来维护,区间删除则且上需要删除种类的二进制取反(想一下不难理解)。

#include<stdio.h>
#include <algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<deque>
#include<ctype.h>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<algorithm>
#define INF 0x3f3f3f3f
#define FAST_IO ios::sync_with_stdio(false)
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAX=1e5+10;
const int mod=1e9+7;
typedef long long ll;
using namespace std;
#define gcd(a,b) __gcd(a,b)
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
inline ll inv1(ll b){return qpow(b,mod-2);}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;}const int maxn=100000;
ll a[maxn+5],sum[maxn<<2];
void pushup(int st){sum[st]=sum[st<<1] | sum[st<<1|1];return;}void update(int p,int c,int l,int r,int st)
{if(l==r){sum[st]|=1ll<<(c-1);return;}int m=(l+r)>>1;if(p<=m) update(p,c,l,m,st<<1);else update(p,c,m+1,r,st<<1|1);pushup(st);
}void del(int p,int c,int l,int r,int st)
{if(l==r){sum[st] &= ~(1ll<<(c-1));return;}int m=(l+r)>>1;if(p<=m) del(p,c,l,m,st<<1);else del(p,c,m+1,r,st<<1|1);pushup(st);
}ll query(int L,int R,int l,int r,int st)
{if(l>=L && r<=R) return sum[st];int m=(l+r)>>1;ll ans=0;if(L<=m) ans|=query(L,R,l,m,st<<1);if(R>m) ans|=query(L,R,m+1,r,st<<1|1);return ans;
}int main()
{int t;t=read();for(int k=1;k<=t;k++){memset(sum,0,sizeof(sum));printf("Case %d:\n",k);int n=read();int q=read();while(q--){int node=read();int pos=read();int val=read();if(node==1){update(pos,val,1,n,1);}else if(node==2){del(pos,val,1,n,1);}else{ll ans=query(pos,val,1,n,1);ll cnt=0;int flag=1,ot=1;while(ans){if(ans&1){if(flag) flag=0;else putchar(' ');cout<<ot;}ot++;ans>>=1;}if(flag){printf("%%\n");}elseprintf("\n");}}}return 0;
}

皮卡丘的梦想(线段树+位运算)相关推荐

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

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

  2. 线段树位运算的三种操作(|,^,)

    银川站网络预选赛重赛(手动滑稽)的时候,第一道题就是这样的一个题,虽然最后没有判出来.不一定对,可以借鉴一下吧. 代码如下: #include<iostream> #include< ...

  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. 【位运算 线段树】SDUT 3930 皮卡丘的梦想2

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

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

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

  8. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  9. 杭电1166敌兵布阵(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

最新文章

  1. CI报Disallowed Key Characters的解决
  2. ORACLE分页SQL
  3. awk 实例练习(一)
  4. 如何使用窗体开发-理解那些函数怎么来的?
  5. C语言实现中国象棋(Qt实现界面,源码下载,详细注释,易移植)
  6. NeurIPS 2019 | 适用于众多模型的Embedding正则化方法
  7. javaone_虚拟化Java应用程序:最佳实践(JavaOne 2011)
  8. CSS 定位 四种定位
  9. 非常实用的安卓第三方库
  10. SAS数据挖掘实战篇【五】
  11. 上班一个月,后悔当初着急入职的选择了
  12. JavaEE 支付宝支付
  13. 非常有意思的35句话
  14. 干货 | 华为内部几近满分的项目管理PPT
  15. 随机森林回归预测r语言_R包randomForest的随机森林回归模型以及对重要变量的选择...
  16. 练习2-12 输出华氏-摄氏温度转换表
  17. idea 查找替换快捷键
  18. 我是K哥,大厂高管,抓住过几次风口,交个朋友吧
  19. ios java模拟器 2017_Xcode9之更好用的iOS Simulator(模拟器)
  20. 小程序自动化测试框架原理剖析

热门文章

  1. 山东春考计算机很难录取吗,山东春季高考很难录取吗?春季高考考试难吗?
  2. wx.showLoading不显示
  3. 『迷你教程』Keras中为截断的BPTT进行序列预测
  4. 新课程研究杂志新课程研究杂志社新课程研究编辑部2023年第12期目录查阅
  5. C语言char,char*赋值
  6. 2023年中职组网络安全竞赛——综合渗透测试解析
  7. 公网出口ip与本机ip的区别
  8. JGit获取当前分支的所有提交请求
  9. 2010-12-8 学习总结
  10. 学以致用——校园义务维修(1)