试题来源

  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. Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学

    D. Spongebob and Squares   Spongebob is already tired trying to reason his weird actions and calcula ...

  2. luogu2577 [ZJOI2005] 午餐 贪心

    题目大意 THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭.每个人打完饭后立刻开始吃,所有人都吃 ...

  3. Realm Update failed - Android

    Realm Update failed - Android Ask Question up vote 0 down vote favorite I'm using realm for my andro ...

  4. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  5. 96.extjs 页面

    1.登录js /** * @author sux * @desc 登录 */ Ext.onReady(function(){ Ext.QuickTips.init(); //错误信息显示必须 var ...

  6. scrollTop,scrollHeight,clientTop,clientHeight,offsetTop,offsetHeight实际意义 及 计算方式 附实例说明

    一.滚动距离.高度 scrollTop scrollLeft scrollHeight scrollWidth 二.相对位置.距离 offsetTop offsetLeft offsetHeight ...

  7. POJ 3083 BFS+DFS 40行

    题意:给你一个迷宫. 先输出当左转优先的时候走的路程长度,再输出当右转优先时走的路程长度,最后输出从起点到终点的最短路程长度. 嗯嗯 奴哥活跃气氛的题.随便写了写.. 此题 知道了思路以后就是水题了. ...

  8. Java 精度控制

    四舍五入,保留两位小数 (找了很多种方法,都有问题,测试得出下面这种方式是可用的) String str="0.235"; String.format("%.2f&quo ...

  9. Bootstrap栅格系统&媒体查询

    bootstrap中几乎所有元素的盒子模型为IE下的盒模型,通俗点说就是box-sizing设置成了:border-box.   栅格系统 媒体查询 媒体查询是非常别致的"有条件的 CSS ...

  10. [转]深入javascript——构造函数和原型对象

    对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模 ...