[国家集训队][bzoj2120] 数颜色 [带修改莫队]

题面:

传送门

思路:

这道题和SDOI2009的HH的项链很像,只是多了一个修改

模板套上去呀

莫队学习请戳这里:莫队

Code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 inline int read(){
 8     int re=0,flag=1;char ch=getchar();
 9     while(ch>‘9‘||ch<‘0‘){
10         if(ch==‘-‘) flag=-1;
11         ch=getchar();
12     }
13     while(ch>=‘0‘&&ch<=‘9‘) re=(re<<1)+(re<<3)+ch-‘0‘,ch=getchar();
14     return re*flag;
15 }
16 int n,m,cnt[1000010],tot=0,x[50010],cur[50010];
17 int curl,curr,curc,block,ans[200010],cntq,cntc;
18 struct query{
19     int l,r,i,ch;
20 }a[200010];
21 struct ch{
22     int pos,to,from;
23 }c[200010];
24 bool cmp(query l,query r){
25     if(l.l/block!=r.l/block) return (l.l/block)<(r.l/block);
26     else{
27         if(l.r!=r.r) return l.r<r.r;
28         else return l.ch<r.ch;
29     }
30 }
31 void add(int i){
32     cnt[x[i]]++;if(cnt[x[i]]==1) tot++;
33     //cout<<"add "<<i<<" "<<x[i]<<" "<<cnt[x[i]]<<" "<<tot<<"\n";
34 }
35 void erase(int i){
36     cnt[x[i]]--;if(!cnt[x[i]]) tot--;
37     //cout<<"erase "<<i<<" "<<x[i]<<" "<<cnt[x[i]]<<" "<<tot<<"\n";
38 }
39 void change(int l,int r,int i){
40     //cout<<"***change "<<l<<" "<<r<<" "<<i<<" "<<x[c[i].pos]<<"\n";
41     if(l<=c[i].pos&&c[i].pos<=r) erase(c[i].pos);
42     x[c[i].pos]=c[i].to;
43     if(l<=c[i].pos&&c[i].pos<=r) add(c[i].pos);
44 }
45 void back(int l,int r,int i){
46     //cout<<"***back "<<l<<" "<<r<<" "<<i<<"\n";
47     if(l<=c[i].pos&&c[i].pos<=r) erase(c[i].pos);
48     x[c[i].pos]=c[i].from;
49     if(l<=c[i].pos&&c[i].pos<=r) add(c[i].pos);
50 }
51 int main(){
52     // freopen("testdata.in","r",stdin);
53     int i,t1,t2;char s[10];
54     n=read();m=read();
55     for(i=1;i<=n;i++) x[i]=cur[i]=read();
56     for(i=1;i<=m;i++){
57         scanf("%s",s);t1=read();t2=read();
58         if(s[0]==‘Q‘)
59             a[++cntq].l=t1,a[cntq].r=t2,a[cntq].i=cntq,a[cntq].ch=cntc;
60         else
61             c[++cntc].pos=t1,c[cntc].from=cur[t1],cur[t1]=c[cntc].to=t2;
62     }
63     block=sqrt(n);
64     sort(a+1,a+cntq+1,cmp);
65
66     curl=a[1].l;curr=a[1].r;
67     for(i=a[1].l;i<=a[1].r;i++) add(i);
68     while(curc<a[1].ch) change(a[1].l,a[1].r,++curc);
69     ans[a[1].i]=tot;
70
71     for(i=2;i<=m;i++){
72         while(curl<a[i].l) erase(curl++);
73         while(curl>a[i].l) add(--curl);
74         while(curr<a[i].r) add(++curr);
75         while(curr>a[i].r) erase(curr--);
76         while(curc<a[i].ch) change(a[i].l,a[i].r,++curc);
77         while(curc>a[i].ch) back(a[i].l,a[i].r,curc--);
78         ans[a[i].i]=tot;
79         //cout<<"now "<<curl<<" "<<curr<<"\n";
80     }
81     for(i=1;i<=cntq;i++) printf("%d\n",ans[i]);
82 }
83 

原文地址:https://www.cnblogs.com/dedicatus545/p/8503760.html

时间: 2024-10-11 00:13:43

[国家集训队][bzoj2120] 数颜色 [带修改莫队]的相关文章

BZOJ2120数颜色(带修改莫队)

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 7384  Solved: 2998[Submit][Status][Discuss] Description 墨 墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要

【国家集训队】 数颜色 - 莫队

题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 为了满足墨墨的要求,你知道你需要干什么了吗? 输入输出格式 输入格式: 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数. 第2行N个整数,分别代表初始画笔排中第i支画笔的颜色. 第3行到第2+M行,每行分别代表墨墨会做的一件事

【Luogu】P1903数颜色(带修改莫队)

题目链接 带修改莫队模板. 加一个变量记录现在是第几次修改,看看当前枚举的询问是第几次修改,改少了就改过去,改多了就改回来. 话说我栈用成队列了能过样例?!!!! 从此深信一句话:样例是出题人精心设计的,绞尽脑汁才设计出一个能让错误代码通过的数据qwqqqqq #include<cstdio> #include<cstdlib> #include<cctype> #include<algorithm> #include<cstring> #inc

cogs 1901. [国家集训队2011]数颜色

Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题描述] 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔.2. R P Col 把第P支画笔替换为

F. Machine Learning (带修改莫队)

https://codeforces.com/contest/940/problem/F 题意  给出n个数字,q个询问: 每次询问有两种类型,一种是询问区间,一种是单体修改: 询问区间是询问区间内最小的没用到的大于0的整数: 比如我有一串数字是 1 1 2 2 2 3    那么有两个1 三个2,一个3   出现次数分别有 两 三 一,  那么次数最小的没在区间内出现的是4: 对于这道题,除带修改莫队的模板之外,我们多加两个数组 vis cnt vis数组用来记录某个数出现的频率,cnt用来记

[bzoj2453]维护队列_带修改莫队

维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话,我们就正常按照莫队一样左右移动区间即可. 有了修改操作的话,我们把块变成$n^{\frac{2}{3}}$,关键字变成:左端点所在块.右端点所在块和时间戳. 然后暴力就行了. Code: #include <iostream> #include <cstdio> #include &

[UOJ #58][WC2013]糖果公园(树上带修改莫队)

Description Solution 树上带修改莫队…!VFK的题解写得很清楚啦 (我的程序为什么跑得这么慢…交的时候总有一种自己在卡测评的感觉…) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 100005 typedef long l

[BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)

Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了一棵 树上,每个结点都有一样食材,Shimakaze要考验一下她. 每个食材都有一个美味度,Shimakaze会进行两种操作: 1.修改某个结点的食材的美味度. 2.对于某条链,询问这条链的美味度集合中,最小的未出现的自然数是多少.即mex值. 请你帮帮Haruna吧. Solution 树上带修改莫队 统计答案的时候也分块查询,找到第一个没满的块开始一个一个找 #include<i

BZOJ.2453.维护队列([模板]带修改莫队)

题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是否在当前区间内修改即可. 块大小取\(O(n^{\frac{2}{3}})\),排序依次按左端点所在块.右端点所在块.修改次数(时间) 复杂度为\(O(n^{\frac{5}{3}})\) (证明在这) #include <cmath> #include <cstdio> #inclu