题目

带修莫队题。

在询问上多加一个变量,记录是在那次修改之后的。

然后暴力修改。

就没了。

不过有一些修改的小技巧

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int manx=50010;
int read()//千万不要用快读
{
char c=getchar();
int res=0;
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9')
{
res=(res<<3)+(res<<1)+c-'0';
c=getchar();
}
return res;
}
bool judge()//我是贞德毒瘤
{
char c=getchar();
while(c<'A'||c>'Z') c=getchar();
if(c=='Q') return false;
return true;
}
struct node
{
int l,r;
int t;//哪一次修改之后
int pos;
};
int qua;
bool compare(const node &a,const node &b)
{
return a.l/qua==b.l/qua ? a.r<b.r : a.l < b.l;
}
node query[manx];
int cha[manx][2],t1,t2;//t1为修改次数,t2为询问次数
int base[manx];
int cont[manx<<5];
int ans[manx];
int l=1,r=0;
int answer;//简单的莫队一些所需要的
void osc(int t)//调整时间
{
while(t1<t)
{
t1++;
if(cha[t1][0]>=l&&cha[t1][0]<=r)
{
cont[cha[t1][1]]+=1,cont[base[cha[t1][0]]]-=1;//如果在当前莫队的区间内,就要单独处理
if(cont[cha[t1][1]]==1) answer+=1;
if(cont[base[cha[t1][0]]]==0) answer-=1;
}
swap(cha[t1][1],base[cha[t1][0]]);//这里便是一个小技巧,直接交换,我们可以自己稍微模拟一下233,这样是不改变正确性的。
}
while(t1>t)//删除同理,很具有对称性
{
swap(cha[t1][1],base[cha[t1][0]]);
if(cha[t1][0]>=l&&cha[t1][0]<=r)
{
cont[cha[t1][1]]-=1,cont[base[cha[t1][0]]]+=1;
if(cont[cha[t1][1]]==0) answer-=1;
if(cont[base[cha[t1][0]]]==1) answer+=1;
}
t1--;
}
return ;
}
void add(int pos)
{
if(!cont[base[pos]]) answer+=1;
cont[base[pos]]+=1;
return;
}//简单的单点修改
void del(int pos)
{
cont[base[pos]]-=1;
if(!cont[base[pos]]) answer-=1;
return ;
}
int main()
{
int n=read(),m=read();
qua=pow(n,0.5);
for(int i=1;i<=n;i++)
base[i]=read();
int a,b;
for(int i=1;i<=m;i++)
{
bool f=judge();
a=read(),b=read();
if(f)
cha[++t1][0]=a,cha[t1][1]=b;
else
query[++t2].l=a,query[t2].r=b,query[t2].t=t1,query[t2].pos=t2;
}
sort(query+1,query+t2+1,compare);
t1=0;
for(int i=1;i<=t2;i++)
{
osc(query[i].t);//除了这一句和上面录入数据不一样,其他和普通莫队就是一样了233
while(r<query[i].r)
add(++r);
while(r>query[i].r)
del(r--);
while(l<query[i].l)
del(l++);
while(l>query[i].l)
add(--l);
ans[query[i].pos]=answer;
}
for(int i=1;i<=t2;i++)
printf("%d\n",ans[i]);
}

P1903 数颜色的更多相关文章

  1. [bzoj2120] [洛谷P1903] 数颜色

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

  2. 洛谷P1903 数颜色 [国家集训队] 莫队

    正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...

  3. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

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

    题目链接 带修改莫队模板. 加一个变量记录现在是第几次修改,看看当前枚举的询问是第几次修改,改少了就改过去,改多了就改回来. 话说我栈用成队列了能过样例?!!!! 从此深信一句话:样例是出题人精心设计 ...

  5. bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)

    P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...

  6. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

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

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

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

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

  9. BZOJ 2120: 数颜色

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 3623  Solved: 1396[Submit][Status][Discuss] ...

随机推荐

  1. 使用 Fetch完成AJAX请求

    使用 Fetch完成AJAX请求 写在前面 无论用JavaScript发送或获取信息,我们都会用到Ajax.Ajax不需要刷新页面就能发送和获取信息,能使网页实现异步更新. 几年前,初始化Ajax一般 ...

  2. loadrunner学习--基础知识

    性能测试相关术语: 1.响应时间:指系统从发出请求开始到客户端接受到所有数据所消耗的时间. 2.并发用户:指同一时刻与服务器进行数据交互的所有用户数量.计算公式F=Nvu x R/T 其中F表示吞吐量 ...

  3. html-3

    <hr> 下划线实体:想在页面显示被浏览器解析的内容为表格添加标题<caption>跟tr同级,只在<table>下 <link> 为页面加小图标 在& ...

  4. Perf -- Linux下的系统性能调优工具,第 2 部分 特殊用法以及内核调优示例

    https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ 本文内容简介 之前介绍了 perf 最常见的一些用法,关注于 Linux 系统上应用程序 ...

  5. poj1092. To Buy or Not to Buy (20)

    1092. To Buy or Not to Buy (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  6. jq回到顶部效果分析

    在浏览网页时,超出屏幕高度就会出现提上点击回到顶部的图标,点击即可回到页面顶部. 用到的知识点如下: 1.首先控制图标的显示和隐藏,先要获取浏览器的高度. var wHeight = $(window ...

  7. mysql 使用 unix 方式显示日期和时间

    1.UNIX中文为时间戳.该方式显示从1970年1月1日开始经过的秒数. 2.函数 UNIX_TIMESTAMP() 返回时间戳格式的时间, FROM_UNIXTIME() 将时间戳格式的时间转换为普 ...

  8. Spring课程 Spring入门篇 4-2 Spring bean装配(下)之Autowired注解说明1

    课程链接: 1 解析 2 代码演练 1 解析 1.1 @Required注解 该注解适用于bean属性的set方法 1.2 @Autowired 作用: 是为了把依赖的对象,自动的注入到bean里 使 ...

  9. 企业工商营业执照副本模板PSD源文件素材下载

    企业工商营业执照副本PSD模板下载地址: http://www.qijieworld.com/thread-1911181-1-1.html 模板为psd格式内容可编辑修改,需使用 Photoshop ...

  10. Kindeditor单独调用多图上传

    html代码: <input type="button" id="J_selectImage" value="图片上传" />& ...