试题来源

  2011中国国家集训队命题答辩

题目描述

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令:

1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。

2、 R P Col 把第P支画笔替换为颜色Col。

为了满足墨墨的要求,你知道你需要干什么了吗?

输入输出格式

输入格式:

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。

第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。

第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

输出格式:

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

输入输出样例

输入样例#1:

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
输出样例#1:

4
4
3
4

说明

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。

来源:bzoj2120

本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。

吐槽

  这题A得不容易啊!从前一天晚上开始敲,但是第一次敲,对于原理理解不足,许多细节出了实现偏差差错,交到洛谷上,洛谷自造数据特性太平均全部爆零,洛谷还不提供数据,不得已搬到其他OJ上交,BZOJ不用说了,结果就一个WA,codevs没收这题,COGS(提供许多数据下载)交上去找不到输出文件,最后终于找到了清橙,虽然也不提供数据下载,但清橙的数据分布合理啊——

  不像其他OJ,没有达到我查错的目的。我在清橙上交了一堆60,于是把差错范围锁定到了颜色更换的部分,长乐一中集训DAY3一整天挤出时间,一点点改错(前一天晚上写的简直是混乱不堪啊),终于在去华莱士吃完晚饭回来后AC了这题华莱士吼啊。

——————————————————2019年3月23日11:21:28更新————————————————

  重新学习

2019年3月25日00:31:58  洛谷上的数据范围变成五倍了

解题思路

  待修改的莫队只需要在四个更改区间左右端点的四重循环前加上两重更新颜色的循环即可。

  另外极其重要的一点是注意莫队的初始化,初始左右端点之间的颜色要先统计了。一定要注意如果要修改的颜色不在统计范围内,那么改颜色即可,不必改颜色种数(事后说起来好简单啊,调的时候就是改不出来)

源代码

#include<math.h>
#include<cstdio>
#include<cstring>
#include<algorithm> int n,m;
int color[]={};
int last []={};
int f[]={};//离散化后颜色统计
bool vis[]={};
struct query{
int id,l,pos,r;
int t;//上一个修改的change_cnt
int ans;
}an[];
int query_cnt=;
int aa[]={};
int cmp(const query & a,const query& b)
{
if(a.pos==b.pos)
{
if(a.r==b.r)
return a.t<b.t;
return a.r<b.r;
}
return a.pos<b.pos;
} void add(int & sum,int pos)
{
f[color[pos]]++;
if(f[color[pos]]==) sum++;
vis[pos]=;
}
void del(int & sum,int pos)
{
f[color[pos]]--;
if(!f[color[pos]]) sum--;
vis[pos]=;
} struct Change{
int t,pos,qian,hou;
}ch[];
int change_cnt=; int main()
{
//freopen("nt2011_color1.in","r",stdin);//在cogs上提交的记号
//freopen("nt2011_color1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&color[i]);
last[i]=color[i];
}
for(int i=,x,y,kuai=pow(n,2.0/3.0);i<=m;i++)
{
char c;
scanf("\n%c %d %d",&c,&x,&y);
if(c=='Q')
query_cnt++,an[query_cnt]={query_cnt,x,x/kuai,y,change_cnt,};
else
change_cnt++,ch[change_cnt]={change_cnt,x,last[x],y},last[x]=y;
}
std::sort(an+,an+query_cnt+,cmp);
f[color[]]++;vis[]=;
for(int i=,l=,r=,sum=;i<=query_cnt;i++)
{
for(int j=an[i-].t+;j<=an[i].t;j++)
{
if(vis[ch[j].pos])
{
del(sum,ch[j].pos);
color[ch[j].pos]=ch[j].hou;
add(sum,ch[j].pos);
}
else color[ch[j].pos]=ch[j].hou;
}
for(int j=an[i-].t;j>an[i].t;j--)
{
if(vis[ch[j].pos])
{
del(sum,ch[j].pos);
color[ch[j].pos]=ch[j].qian;
add(sum,ch[j].pos);
}
else color[ch[j].pos]=ch[j].qian;
} while(r<an[i].r) r++,add(sum,r);
while(l<an[i].l) del(sum,l),l++;
while(r>an[i].r) del(sum,r),r--;
while(l>an[i].l) l--,add(sum,l);
an[i].ans=sum;
}
for(int i=;i<=query_cnt;i++)
aa[an[i].id]=an[i].ans;
for(int i=;i<=query_cnt;i++)
printf("%d\n",aa[i]);
return ;
}

洛谷 P1903 BZOJ 2120 清橙 A1274【模板】分块/带修改莫队(数颜色)(周奕超)的更多相关文章

  1. 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)

    莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...

  2. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

  3. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  4. P1903 【模板】分块/带修改莫队(数颜色)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  5. AC日记——【模板】分块/带修改莫队(数颜色) 洛谷 P1903

    [模板]分块/带修改莫队(数颜色) 思路: 带修改莫队: (伏地膜xxy): 代码: #include <bits/stdc++.h> using namespace std; #defi ...

  6. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  7. bzoj 3052: [wc2013]糖果公园【树上带修改莫队】

    参考:http://blog.csdn.net/lych_cys/article/details/50845832 把树变成dfs括号序的形式,注意这个是不包含lca的(除非lca是两点中的一个) 然 ...

  8. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  9. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

随机推荐

  1. poj 2288 Islands and Bridges ——状压DP

    题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...

  2. 逻辑回归 C++

    #include <iostream>#include <string>#include <fstream>#include <sstream>#inc ...

  3. 利用递归分割(Split)字符串

    利用递归分割(Split)字符串 SqlServer 递归 工作需要将表里的某个字段分割之后再插入到另一个表中,其实数据量不大,直接用游标一行一行的取,再利用循环来分割之后再实现数据的插入应该可以直接 ...

  4. java jdk 管理工具

    官网:http://www.jenv.be/ 安装: Linux / OS X $ git clone https://github.com/gcuisinier/jenv.git ~/.jenv M ...

  5. AMD 与 CMD 区别

    作者:玉伯链接:https://www.zhihu.com/question/20351507/answer/14859415来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  6. Struts和Spring MVC的比较(非原创)

    文章大纲 一.Spring MVC项目例子二.Struts项目例子三.Struts和Spring MVC对比四.参考文章   一.Spring MVC项目例子 https://www.jianshu. ...

  7. BZOJ 2406 二分+有上下界的网络流判定

    思路: 求出每行的和  sum_row 每列的和   sum_line 二分最后的答案mid S->i  流量[sum_row[i]-mid,sum_row[i]+mid] i->n+j ...

  8. POJ 3264 线段树 ST

    题意:给你一个数列,从中挑一段,问你这段数的最大值减最小值是多少. 思路:线段树. // by Sirius_Ren #include <cstdio> #include <algo ...

  9. JavaScript 进阶 常用内置对象

    一.常用内置对象 所谓内置对象就是ECMAscript提供出来的一些对象,我们知道对象都是有相应的属性和方法 数组Arry 1.数组的创建方式 字面量方式创建(推荐使用,简单粗暴) var color ...

  10. MySQL实现递归查询

    DROP FUNCTION IF EXISTS queryChildrenCaseInfo;CREATE FUNCTION queryChildrenCaseInfo(cId INT)RETURNS ...