数颜色 题解
时间:2020-05-17
本文章向大家介绍数颜色 题解,主要包括数颜色 题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- http://www.lydsy.com/JudgeOnline/problem.php?id=2120
- http://www.lydsy.com/JudgeOnline/problem.php?id=2453
- https://www.luogu.com.cn/problem/P1903
没想到吧,我大莫队也能修改!
对于每次询问,按左端点所在块为第一关键字,右端点所在块为第二关键字,影响它的上一个询问为第三关键字进行排序。
在每次处理询问时,同时对时间戳进行移动,将修改的贡献算出来。
#include <bits/stdc++.h>
using namespace std;
inline long long read() {
long long ans = 0;
char last = ' ', ch = getchar();
while (ch < '0' || ch > '9') last = ch, ch = getchar();
while (ch >= '0' && ch <= '9') ans = ans * 10 + ch -'0', ch = getchar();
if (last == '-') return -ans;
return ans;
}
void write(int x) {
if (x > 9) write(x / 10);
putchar(x%10 + '0');
}
const int N=133333+10;
int n,m;
int pos[N],co[N],len;
struct query {
int l,r,pre,id;
} q[N];
struct change {
int x,y;
} c[N];
int qn,cn;
char opt;
void build() {
for(int i=1; i<=n; i++)
pos[i]=(i-1)/len+1;
}
bool cmp(query _,query __) {
return (_.l/len)==(__.l/len)?_.r<__.r:(_.l/len)<(__.l/len);
}
int ans,L=1,R,now,cnt[1000010],tans[N];
void add(int x) {
if(++cnt[x]==1)
ans++;
//printf("use add %d\n",ans);
}
void del(int x) {
if(--cnt[x]==0)
ans--;
//printf("use del %d\n",ans);
}
void work(int t,int i) {
if(c[t].x<=q[i].r&&c[t].x>=q[i].l) {
if(--cnt[co[c[t].x]]==0)
ans--;
if(++cnt[c[t].y]==1)
ans++;
}
swap(co[c[t].x],c[t].y);
//printf("%d use change %d: %d to %d,ans change to %d\n",i,t,c[t].x,c[t].y,ans);
}//计算每个修改对答案的影响
int main() {
n=read(),m=read();
len=pow(n,2.0/3);
build();
for(int i=1; i<=n; i++)
co[i]=read();
for(int i=1; i<=m; i++) {
cin>>opt;
if(opt=='Q') {
++qn;
q[qn].l=read(),q[qn].r=read();
q[qn].pre=cn,q[qn].id=qn;
//printf("%d %d\n",q[qn].l,q[qn].r);
} else if(opt=='R') {
++cn;
c[cn].x=read(),c[cn].y=read();
}
}
//printf("%d\n",q[1].id);
sort(q+1,q+qn+1,cmp);
//printf("%d\n",q[1].id);
for(int i=1; i<=qn; i++) {
//printf("%d\n",q[i].id);
while (L < q[i].l) ans -= !--cnt[co[L++]];
while (L > q[i].l) ans += !cnt[co[--L]] ++;
while (R < q[i].r)ans += !cnt[co[++R]] ++;
while (R > q[i].r) ans -= !--cnt[co[R --]];//从某位大佬那里学来的操作
while(now<q[i].pre) work(++now,i);
while(now>q[i].pre) work(now--,i);//六个 while 循环,前四个是普通莫队,后两个是带修专属
tans[q[i].id]=ans;
//puts("");
}
for(int i=1; i<=qn; i++)
write(tans[i]),puts("");
return 0;
}
原文地址:https://www.cnblogs.com/lajiccf/p/12903987.html
- 图(Graph)的常用代码集合
- 我差不多,哦不我已经是个废人了No.4
- 将Gradle项目发布到Jcenter和Maven Central
- FLAnimatedImage -ios gif图片加载框架介绍
- linux学习第八篇:文件或目录权限chmod,更改所有者和所属组chown,umask,隐藏权限lsattr_chattr
- linux学习第九篇:特殊权限set_uid,set_gid,stick_bit以及软连接文件,硬链接文件
- C#事件(event)的一个实例
- linux学习第十篇:find命令,文件名后缀
- linux学习第十一篇:linux和Windows互传文件,用户配置文件和密码配置文件,用户组管理以及用户管理
- linux学习第十二篇:usermod命令,用户密码管理,mkpasswd命令
- 一斤代码深入理解系列(三):微信小程序和服务器通信
- C#CreateGraphics方法的三种实现方式
- 一斤代码深入理解系列(四):微信小程序和服务器通信-WebSocket
- linux学习第十四篇:查看磁盘,文件大小命令:df,du;磁盘分区
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring 基于 XML 的 AOP
- SpringBoot 集成 Apache Camel FTP 实现文件同步
- Spring 基于 XML 的 IOC
- 初识 Spring
- Leetcode 55. 跳跃游戏 (贪心)
- SpringBoot 报 No operations allowed after connection closed 异常解决办法
- Leetcode 15 三数之和(双指针,去重)
- 洛谷 P1886 滑动窗口 /【模板】单调队列 (单调队列、线段树、RMQ(ST表))
- SpringBoot 整合 JMSTemplate
- Leetcode 3. 无重复字符的最长子串 (滑动窗口+HashMap)
- MQ 系列之 JMSTemplate
- Leetcode 76. 最小覆盖子串 (双指针,map)
- ExpiringMap,一个可以用于缓存的 Map
- Leetcode 121. 买卖股票的最佳时机 (DP,模拟)
- MQ 系列之初识消息中间件