试题来源

  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. phoenixframe自己主动化測试平台对div弹出框(如弹出的div登陆框)的处理

    package org.phoenix.cases; import java.util.LinkedList; import org.phoenix.action.WebElementActionPr ...

  2. jabberNet 发送出席信息

    没代码我说个J8: public void Presence(User.EStatus status) { string statustxt = ""; //说明文字.比如,离开的 ...

  3. Codeforces Round #332 (Div. 2)C. Day at the Beach 树状数组

    C. Day at the Beach   One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortuna ...

  4. 【数据结构】链式向前星知识点&代码

    代码: struct NODE{ int to; int nxt; int c; }node[MM];//链式向前星 ; void add(int a,int b,int c){ node[lcnt] ...

  5. LMDB中的mmap、Copy On Write、MVCC深入理解——讲得非常好,常来看看!

    LMDB基本架构 lmdb的基本架构如下:  lmdb的基本做法是使用mmap文件映射,不管这个文件存储实在内存上还是在持久存储上.lmdb的所有读取操作都是通过mmap将要访问的文件只读的映射到虚拟 ...

  6. warning: here-document at line 7 delimited by end-of-file (wanted `rui')

  7. React.js初探

    React.js 菜鸟官方解释: React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图). React 起源 ...

  8. MySQL 数据的增删改查

    一.数据库的增删改 一. 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 1.使用INSERT实现数据的插入 2.UPDATE实现数据的更新 3.使用DELETE实现数 ...

  9. C - Alice, Bob and Chocolate(贪心)

    Problem description Alice and Bob like games. And now they are ready to start a new game. They have ...

  10. MySql c#通用类 转

    using System;using System.Data;using System.Configuration;using System.Collections.Generic;using Sys ...