皮卡丘的梦想2
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
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
%
%
题解:很明显是用线段树来维护操作。可是用什么来存储状态呢?想了想,用二进制01来表示石头的有无。然后用位运算来支持操作。
代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<string.h>
#define ll long long
using namespace std;
const int N=1e5+10;
ll  sum[N<<2];
int t,n,q;
int pos,val,op;
void pushup(int rt)
{sum[rt]=sum[rt<<1]|sum[rt<<1|1];
}
void build(int l,int r,int rt)
{if(l==r){sum[rt]=0;return ;}int mid=(r+l)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);pushup(rt);
}
void add(int l,int r,int pos,int val,int rt)
{if(l==r){sum[rt]|=1ll<<(val-1);return ;}int mid=(r+l)>>1;if(pos<=mid)add(l,mid,pos,val,rt<<1);elseadd(mid+1,r,pos,val,rt<<1|1);pushup(rt);
}
void del(int l,int r,int pos,int val,int rt)
{if(l==r){sum[rt]&=~(1ll<<(val-1));return ;}int mid=(r+l)>>1;if(pos<=mid)del(l,mid,pos,val,rt<<1);elsedel(mid+1,r,pos,val,rt<<1|1);pushup(rt);}
ll query(int l,int r,int L,int R,int rt)
{if(L<=l&&R>=r){return sum[rt];}ll ans=0;int mid=(r+l)>>1;if(L<=mid)ans|=query(l,mid,L,R,rt<<1);if(R>mid)ans|=query(mid+1,r,L,R,rt<<1|1);return ans;
}
int main()
{scanf("%d",&t);for(int k=1;k<=t;k++){printf("Case %d:\n",k);scanf("%d%d",&n,&q);build(1,n,1);while(q--){scanf("%d",&op);scanf("%d%d",&pos,&val);if(op==1){add(1,n,pos,val,1);}if(op==2){del(1,n,pos,val,1);}if(op==3){ll ans=query(1,n,pos,val,1);ll cnt=0;bool flag=true;int ot=1;while(ans){if(ans&1){if(flag) flag=false;else printf(" ");printf("%d",ot);}ot++;ans>>=1;}if(flag){printf("%%\n");}elseprintf("\n");}}}return 0;
}

皮卡丘的梦想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. 线段树位运算的三种操作(|,^,)

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

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

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

  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. 利用python爬取猫眼电影,分析《大侦探皮卡丘》|凹凸数读

    利用python爬取猫眼电影,分析<大侦探皮卡丘>,看看当皮卡丘长出绒毛,"丑拒"还是"真香"都在猫眼短评里了. 本文首发于微信公众号<凹凸数 ...

最新文章

  1. 【小坑】Android 实现对话框会报错 (You need to use a Theme.AppCompat theme (or descendant) with this activity)
  2. zabbix监控mysql的性能_zabbix2.4.2实战监控mysql5.6性能
  3. linux查看redis内存,Linux查看redis占用内存的方法
  4. c++父类和子类转化致命的代码错误
  5. bootstraptable设置行高度_【短柱专题】窗台板为什么要通长设置
  6. vim打造成C++的IDE
  7. SSH启动失败解决方法
  8. python题目训练(随时更新)
  9. 宝塔控制面板配置Nginx 安全证书
  10. 12 个开源后台管理系统
  11. python计算条件概率_统计算法_概率基础
  12. 计算机网络传输速率单位MB,计算机网络中,传输速率MB/s和Gb/s如何换算?
  13. 解决chrome/IE浏览器被桔梗导航劫持的问题
  14. 最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评
  15. SQL Server numeric数据类型
  16. 微信小程序之小程序审核
  17. ”垂死挣扎还是涅槃重生 -- Delphi XE5 发布会归来感想“的感想
  18. toad mysql教程_使用 Toad 操作 Oracle 初步
  19. 自动化打包平台系列(一):自动化打平台建设概览
  20. tslib: Selected device is not a touchscreen (must support ABS and KEY event types)解决方法

热门文章

  1. Useful Blog
  2. 【360开源】Pika最佳实践
  3. MFC程序的DPI适配
  4. (七)JavaScript 流程控制语句
  5. Ansible Galax在线角色的使用
  6. 什么?听说你被小学奥数难倒了?
  7. cv2.resize函数报错:error: (-215:Assertion failed) func != 0 in function ‘cv::hal::resize‘
  8. 我讨厌这个绿油油的头像!我用opencv换一下背景
  9. 网络通信协议(IP地址,端口号,InetAddress,UDP与TCP)
  10. java随机组卷和手动组卷功能实现