Description

昊昊喜欢运动

他N天内会参加M种运动(每种运动用一个[1,m]的整数表示)

现在有Q个操作,操作描述如下

  • 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m])
  • 问昊昊第l天到第r天参加了多少种不同的运动

Input

输入两个数N, M (1≤N≤105, 1≤M≤100);

输入N个数ai(ai∈[1,m])表示在第i天昊昊做了第ai类型的运动;

输入一个数Q(1≤Q≤105);

输入Q行 每行描述以下两种操作

  • 形如M l r x,表示昊昊把第l天到第r天的运动全部换成了x(x∈[1,m])
  • 形如Q l r,表示昊昊想知道他第l天到第r天参加了多少种不同的运动

Output

对于所有的Q操作,每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动

Sample Input

5 3 
1 2 3 2 3 

Q 1 4 
Q 2 4 
M 5 5 2 
Q 1 5

Sample Output



3

题意:中文题意
 
题解:线段树+bitset
 bitset记录运动的种类 bitset的用法 姿势涨  
 bitset<110> sum 
 
 (sum.reset() 全部置为0 )
 (sum.count()计算为1的位数) 
 (sum[x]=1 第x位赋为1)
 坑点: 千万不要直接复制样例 直接复制会很坑 orzzzz
      getchar()的问题  re多次   太菜了...
                  
 /******************************
code by drizzle
blog: www.cnblogs.com/hsd-/
^ ^ ^ ^
O O
******************************/
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<bitset>
//#define ll long long
#define mod 1000000007
#define PI acos(-1.0)
using namespace std;
struct node
{
int l,r;
int add;
bitset<> sum;
} tree[];
int n,m;
int exm;
int l1,r1,x;
int q;
char judge;
void buildtree(int root,int left,int right)
{
tree[root].l=left;
tree[root].r=right;
tree[root].add=;
if(left==right)
{
tree[root].sum.reset();
scanf("%d",&exm);
tree[root].sum[exm]=;
return ;
}
int mid=(left+right)>>;
buildtree(root<<,left,mid);
buildtree(root<<|,mid+,right);
tree[root].sum=tree[root<<].sum|tree[root<<|].sum;//按位或得到新的运动种类
}
void pushdown(int root)
{
if(tree[root].add==)
return ;
tree[root<<].sum.reset();
tree[root<<|].sum.reset();
tree[root<<].sum[tree[root].add]=;
tree[root<<|].sum[tree[root].add]=;
tree[root<<].add=tree[root].add;//注意延迟标记也要往下传
tree[root<<|].add=tree[root].add;
tree[root].add=;
}
void updata(int root,int left,int right,int c)
{
if(tree[root].l==left&&tree[root].r==right)
{
tree[root].sum.reset();//全部置零
tree[root].add=c;
tree[root].sum[c]=;//整个区间只有c运动
return ;
}
pushdown(root);//lazy 延迟标记
int mid=(tree[root].l+tree[root].r)>>;
if(right<=mid)
updata(root<<,left,right,c);
else
{
if(left>mid)
updata(root<<|,left,right,c);
else
{
updata(root<<,left,mid,c);
updata(root<<|,mid+,right,c);
}
}
tree[root].sum=tree[root<<].sum|tree[root<<|].sum;
}
bitset<> query(int root,int left,int right)
{
if(tree[root].l==left&&tree[root].r==right)
{
return tree[root].sum;
}
pushdown(root);
int mid=(tree[root].l+tree[root].r)>>;
if(right<=mid)
return query(root<<,left,right);
else
{
if(left>mid)
return query(root<<|,left,right);
else
return query(root<<,left,mid)|query(root<<|,mid+,right);
}
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
buildtree(,,n);
scanf("%d",&q);
getchar();
for(int i=; i<=q; i++)
{
scanf("%c",&judge);
if(judge=='Q')
{
scanf("%d %d",&l1,&r1);
printf("%d\n",query(,l1,r1).count());
}
else
{
scanf("%d %d %d",&l1,&r1,&x);
updata(,l1,r1,x);
}
getchar();//坑点
}
}
return ;
}
 

最新文章

  1. Threejs中的材质贴图
  2. Javascript学习笔记3 Javascript与BOM简介
  3. MySql变量,
  4. VC++遇到的错误汇集
  5. 二叉树之AVL树的平衡实现(递归与非递归)
  6. string为什么可以写入共享内存
  7. Model Browser
  8. onTextChanged参数解释及实现EditText字数监听
  9. SQL存储过程笔记
  10. jsp中iframe所包含的页面调用父页面的function方法
  11. c++类的实例化,有没有new的区别
  12. javascript笔记整理(变量作用域)
  13. Craig可能是个冲浪爱好者
  14. mahout源码KMeansDriver分析之五CIMapper初探
  15. (纯干货)最新WEB前端学习路线汇总初学者必看
  16. Memcache,redis,rabbitMQ,SQLAlchemy
  17. Git的配置与使用
  18. nginx的http_sub_module模块使用之替换字符串
  19. 使用 Sixel 图形格式在终端中显示缩略图
  20. Linux装机利器Cobbler安装配置

热门文章

  1. 基于Xtrabackup恢复单个innodb表
  2. MySQL查询优化 对not in 、in 的优化
  3. 779. K-th Symbol in Grammar
  4. 状压DP详解(位运算)
  5. 使用泛型类简化ibatis系统架构
  6. git回滚到指定commit
  7. JVM——参数设置、分析
  8. PHP.22-Smart模版
  9. HDU 1384 Intervals(差分约束)
  10. 简易版AI英文问答程序解决