地址:http://acm.uestc.edu.cn/#/contest/show/95

题目:

Q - 昊昊爱运动 II

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

昊昊喜欢运动

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

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

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

Input

输入两个数NN , MM (1≤N≤1051≤N≤105 , 1≤M≤1001≤M≤100 );

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

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

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

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

Output

l

Sample input and output

Sample Input Sample Output
5 3
1 2 3 2 3
4
Q 1 4
Q 2 4
M 5 5 2
Q 1 5
3
2
3

思路:

区间覆盖,区间查询

依旧线段树搞起,不过有pushup和pushdown操作,这要注意下

具体的就不说了,和前面的题目没啥区别

对了要用bitset记录,,差点忘了、

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <cstdlib>
#include <string>
#include <bitset> #define PI acos((double)-1)
#define E exp(double(1))
#define K 100000
using namespace std;
int n,m;
int a[K+];
struct node
{
bitset<>s;
int change,l,r;
};
struct node tree[*K+]; void pushdown(int id)
{
if(!tree[id].change)
return ;
tree[id*+].s=tree[id*].s=tree[id].s;
tree[id*+].change=tree[id*].change=;
tree[id].change=;
}
void build(int id,int l,int r)
{
tree[id].l=l;tree[id].r=r;tree[id].change=;
if(l==r)
tree[id].s[a[l]]=;
else
{
int mid=(tree[id].l+tree[id].r)>>;
if(r <= mid) build(id*,l,r);
else if(l > mid) build(id*+,l,r);
else
{
build(id<<,l,mid);
build(id*+,mid+,r);
}
tree[id].s=tree[id*].s|tree[id*+].s;
}
}
void update(int id,int l,int r,int v)
{
if(tree[id].l==l && tree[id].r==r)
{
tree[id].change=;
tree[id].s.reset();
tree[id].s[v]=;
}
else
{
pushdown(id);
int mid=(tree[id].l+tree[id].r)>>;
if(r<=mid) update(id<<,l,r,v);
else if(l>mid) update(id*+,l,r,v);
else
{
update(id<<,l,mid,v);
update(id*+,mid+,r,v);
}
tree[id].s=tree[id*].s|tree[id*+].s;
}
} bitset<> query(int id,int l,int r)
{
if(tree[id].l == l && tree[id].r==r )
return tree[id].s;
else
{
pushdown(id);
int mid=(tree[id].l+tree[id].r)>>;
bitset<>ret;
if(r<=mid) ret=ret|query(id*,l,r);
else if(l>mid) ret=ret|query(id*+,l,r);
else
{
ret=ret|query(id*,l,mid);
ret=ret|query(id*+,mid+,r);
}
return ret;
}
}
int main(void)
{
cin>>n>>m;
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,,n);
int q;
cin>>q;
while(q--)
{
char c;
c=getchar();
while(c==' ' || c=='\n')
c=getchar();
if(c=='M')
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
update(,l,r,v);
}
else
{
int l,r,num=;
scanf("%d%d",&l,&r);
bitset<> temp=query(,l,r);
for(int i=;i<=m;i++)
if(temp.test(i))
num++;
printf("%d\n",num);
}
}
return ;
}

cdojQ - 昊昊爱运动 II的更多相关文章

  1. CDOJ 1259 昊昊爱运动 II 线段树+bitset

    昊昊爱运动 II 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r ...

  2. UESTC-1259 昊昊爱运动 II

    昊昊爱运动 II Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)     昊昊喜 ...

  3. CDOJ 1259 昊昊爱运动 II bitset+线段树

    题目链接 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了 ...

  4. UESTC 1256 昊昊爱运动 Map

    昊昊爱运动 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他N天 ...

  5. cdoj 1256 昊昊爱运动 预处理/前缀和

    昊昊爱运动 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1256 Descr ...

  6. cdoj 1256 昊昊爱运动 预处理

    昊昊爱运动 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他NN ...

  7. bzoj 3704 昊昊的机油之GRST 贪心dp,思维

    昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MBSubmit: 80  Solved: 33[Submit][Status][Discuss] ...

  8. bzoj 3704 昊昊的机油之GRST - 贪心

    题目传送门 传送门 题目大意 给定一个数组$a$和数组$b$,每次操作可以选择$a$的一个子区间将其中的数在模4意义下加1,问把$a$变成$b$的最少操作次数. 首先求$b - a$,再差分,令这个数 ...

  9. bzoj 3704: 昊昊的机油之GRST【贪心+脑洞】

    脑洞题大概 首先处理出每个位置需要操作的次数c,假设第一次达到目标就不能再走,这样的操作次数是c差分后值的正数和,就想成分治每一段然后同减最小值然后从0处断开 然后考虑能一圈一圈走的情况,连续一段多走 ...

随机推荐

  1. scheme 中的宏使用

    #lang scheme ( define-syntax my-when     ( syntax-rules ()       [ ( _ pred body ... )         ( if ...

  2. DMSFrame 之查询表达式用法(一)

    where条件 WhereClip<Adm_User> where = new WhereClip<Adm_User>(q => q.DeleteFlag == fals ...

  3. (转)java synchronised关键字

    转自:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html Java 多线程(六) synchronized关键字详解 Java ...

  4. Android--推断文本文件编码

    方法1:利用windows文本文件编码特点. windows下.Unicode.Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,各自是FF.FE(Unicode) ...

  5. ChemDraw在苹果电脑上能不能用

    很多ChemDraw 15.1 Pro用户都Windows操作系统用户,近年来随着苹果公司的影响力越来越大,使用苹果电脑的朋友越来越多.一些ChemDraw用户可能会使用苹果电脑,因此特别的关注在苹果 ...

  6. 【转】Android横竖屏重力自适应

    通常我们的应用只会设计成横屏或者竖屏,锁定横屏或竖屏的方法是在manifest.xml文件中设定属性android:screenOrientation为"landscape"或&q ...

  7. HTTP请求的过程&HTTP/1.0和HTTP/1.1的区别&HTTP怎么处理长连接

    http://www.cnblogs.com/GumpYan/p/5821193.html

  8. Eclipse虚拟内存不足【Eclipse中虚拟内存设置】

    Eclipse最近在做J2EE项目中 发现老是出现虚拟内存不足的提示 前2天去加了根内存 问题同样存在 为了让我在写代码时 不在出现那讨厌的内存不足的提示 也为了 不让那破机器再卡住 今天找到了解决方 ...

  9. winsxs清理

    win7的网友经常问:C:Windowswinsxs文件夹下是什么文件,可以删除吗? 答案是不建议你删除的,如果你特别想删除的话我推荐你一个工具. 本人亲测系统正常运行. 可以为C盘剩下将近4G空间 ...

  10. less-符号之逗号,空格,父级选择器

    Less符号 逗号 example: .test() { box-shadow+: inset 0 0 10px #555; } .study { .test(); box-shadow+: 0 0 ...