博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cdojQ - 昊昊爱运动 II
阅读量:4988 次
发布时间:2019-06-12

本文共 3144 字,大约阅读时间需要 10 分钟。

地址:

题目:

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 (1N1051≤N≤105 , 1M1001≤M≤100 );

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

输入一个数QQ (1Q1051≤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 31 2 3 2 34Q 1 4Q 2 4M 5 5 2Q 1 5
323

 

思路:

区间覆盖,区间查询

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

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

 

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

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 14 #define PI acos((double)-1) 15 #define E exp(double(1)) 16 #define K 100000 17 using namespace std; 18 int n,m; 19 int a[K+5]; 20 struct node 21 { 22 bitset<110>s; 23 int change,l,r; 24 }; 25 struct node tree[4*K+5]; 26 27 void pushdown(int id) 28 { 29 if(!tree[id].change) 30 return ; 31 tree[id*2+1].s=tree[id*2].s=tree[id].s; 32 tree[id*2+1].change=tree[id*2].change=1; 33 tree[id].change=0; 34 } 35 void build(int id,int l,int r) 36 { 37 tree[id].l=l;tree[id].r=r;tree[id].change=0; 38 if(l==r) 39 tree[id].s[a[l]]=1; 40 else 41 { 42 int mid=(tree[id].l+tree[id].r)>>1; 43 if(r <= mid) build(id*2,l,r); 44 else if(l > mid) build(id*2+1,l,r); 45 else 46 { 47 build(id<<1,l,mid); 48 build(id*2+1,mid+1,r); 49 } 50 tree[id].s=tree[id*2].s|tree[id*2+1].s; 51 } 52 } 53 void update(int id,int l,int r,int v) 54 { 55 if(tree[id].l==l && tree[id].r==r) 56 { 57 tree[id].change=1; 58 tree[id].s.reset(); 59 tree[id].s[v]=1; 60 } 61 else 62 { 63 pushdown(id); 64 int mid=(tree[id].l+tree[id].r)>>1; 65 if(r<=mid) update(id<<1,l,r,v); 66 else if(l>mid) update(id*2+1,l,r,v); 67 else 68 { 69 update(id<<1,l,mid,v); 70 update(id*2+1,mid+1,r,v); 71 } 72 tree[id].s=tree[id*2].s|tree[id*2+1].s; 73 } 74 } 75 76 bitset<110> query(int id,int l,int r) 77 { 78 if(tree[id].l == l && tree[id].r==r ) 79 return tree[id].s; 80 else 81 { 82 pushdown(id); 83 int mid=(tree[id].l+tree[id].r)>>1; 84 bitset<110>ret; 85 if(r<=mid) ret=ret|query(id*2,l,r); 86 else if(l>mid) ret=ret|query(id*2+1,l,r); 87 else 88 { 89 ret=ret|query(id*2,l,mid); 90 ret=ret|query(id*2+1,mid+1,r); 91 } 92 return ret; 93 } 94 } 95 int main(void) 96 { 97 cin>>n>>m; 98 for(int i=1;i<=n;i++) 99 scanf("%d",&a[i]);100 build(1,1,n);101 int q;102 cin>>q;103 while(q--)104 {105 char c;106 c=getchar();107 while(c==' ' || c=='\n')108 c=getchar();109 if(c=='M')110 {111 int l,r,v;112 scanf("%d%d%d",&l,&r,&v);113 update(1,l,r,v);114 }115 else116 {117 int l,r,num=0;118 scanf("%d%d",&l,&r);119 bitset<110> temp=query(1,l,r);120 for(int i=1;i<=m;i++)121 if(temp.test(i))122 num++;123 printf("%d\n",num);124 }125 }126 return 0;127 }
View Code

 

转载于:https://www.cnblogs.com/weeping/p/5456159.html

你可能感兴趣的文章
bzoj4034: [HAOI2015]树上操作(树剖)
查看>>
${sessionScope.user}的使用方法
查看>>
WCF开发框架形成之旅---结合代码生成工具实现快速开发
查看>>
Spring事务管理
查看>>
linux下mysql配置文件my.cnf详解
查看>>
SublimeText快捷键操作
查看>>
Python开发 基礎知識 (未完代補)
查看>>
08ssm三大框架整合以前步骤
查看>>
R语言学习笔记之八
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>
layui中的html怎样接收后台的值,layui框架与SSM前后台交互的方法
查看>>
Skulpt在线模拟运行Python工具
查看>>
287.软件测试概述
查看>>
297.白盒测试
查看>>
新闻客户端的突破与创新
查看>>
网络通信引擎ICE的使用
查看>>
js滚动事件实现滚动触底加载
查看>>
架构妄想:AJAX + REST
查看>>