UVA 12345 Dynamic len(带修莫队)
Dynamic len
【题目链接】Dynamic len
【题目类型】带修莫队
&题解:
莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字.
之后循环离线的时候,先暴力时间指针(oi大佬说的),之后l,和r就随便了.还有要会用vis数组.
【时间复杂度】\(O(n^{\frac{5}{3}})\)
&代码:
#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
const int maxn = 5e4 + 7;
struct nt {
int l, r, id, ts;
} ask[maxn];
struct nd {
int x, pre, v;
} p[maxn];
int n, m, an[maxn], c[maxn], pos[maxn], num[maxn * 20], last[maxn], ans;
bool vis[maxn];
char s[9];
bool cmp(nt a, nt b) {
return pos[a.l] < pos[b.l] ||
pos[a.l] == pos[b.l] && pos[a.r] < pos[b.r] ||
pos[a.l] == pos[b.l] && pos[a.r] == pos[b.r] && a.ts < b.ts;
}
void update(int x) {
if(vis[x]) {
if(!--num[c[x]]) --ans;
}
else if(++num[c[x]] == 1) ans++;
vis[x] ^= 1;
}
void change(int x, int v) {
if(vis[x]) {
update(x); c[x] = v; update(x);
}
else c[x] = v;
}
int main() {
//("E:1.in", "r", stdin);
scanf("%d%d", &n, &m);
int x, y, tot = 0, top = 0;
int bk = sqrt(n);
for(int i = 1; i <= n; i++) {
scanf("%d", &c[i]);
last[i] = c[i];
pos[i] = i / bk;
}
for(int i = 1; i <= m; i++) {
scanf("%s%d%d", s, &x, &y);
x++;
if(s[0] == 'Q') {
//[++tot].id必须要赋为tot. 而且这句话必须在第一位写
ask[++tot].id = tot;
ask[tot].l = x, ask[tot].r = y, ask[tot].ts = top;
}
else {
p[++top].x = x, p[top].v = y, p[top].pre = last[x];
last[x] = y;
}
}
sort(ask + 1, ask + 1 + tot, cmp);
int now = 0, pl = 1, pr = 0;
for(int i = 1; i <= tot; i++) {
if(now < ask[i].ts) {
for(int j = now + 1; j <= ask[i].ts; j++)
change(p[j].x, p[j].v);
}
else {
for(int j = now; j >= ask[i].ts + 1; j--)
change(p[j].x, p[j].pre);
}
if(pr < ask[i].r) {
for(int j = pr + 1; j <= ask[i].r; j++)
update(j);
}
else {
for(int j = pr; j >= ask[i].r + 1; j--)
update(j);
}
if(pl < ask[i].l) {
for(int j = pl; j <= ask[i].l - 1; j++)
update(j);
}
else {
for(int j = pl - 1; j >= ask[i].l; j--)
update(j);
}
pl = ask[i].l, pr = ask[i].r, now = ask[i].ts;
an[ask[i].id] = ans;
}
for(int i = 1; i <= tot; i++) {
printf("%d\n", an[i]);
}
return 0;
}
UVA 12345 Dynamic len(带修莫队)的更多相关文章
- LG4074【WC2013】糖果公园 【树上莫队,带修莫队】
题目描述:给出一棵 \(n\) 个点的树,点有颜色 \(C_i\),长度为 \(m\) 的数组 \(V\) 和长度为 \(n\) 的数组 \(W\).有两种操作: 将 \(C_x\) 修改为 \(y\ ...
- P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]
P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- BZOJ2120 数颜色 莫队 带修莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...
- BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)
4129: Haruna’s Breakfast Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 835 Solved: 409[Submit][St ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
随机推荐
- AT&T汇编指令
GAS中每个操作都是有一个字符的后缀,表明操作数的大小. C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4 f ...
- FastJSON 设置默认参数,全局配置方式 和 一些使用方式、坑
如果要被序列化的对象含有一个date属性或者多个date属性按照相同的格式序列化日期的话,那我们可以使用下面的语句实现: 在应用的的Main方法体里配置全局参数: JSONObject.DEFFAUL ...
- linux下vi或vim操作Found a swap file by the name的原因及解决方法
在linux下用vi或vim打开Test.java文件时 [root@localhost tmp]# vi Test.java出现了如下信息: E325: ATTENTION Found a s ...
- Java字符串连接的多种实现方法及效率对比
JDK 1.8(Java 8)里新增String.join()方法用于字符串连接.本文基于<Java实现String.join()和效率比较>一文,分析和比较四种自定义实现与String. ...
- mysql按位的索引判断位的值
DELIMITER $$ DROP FUNCTION IF EXISTS `value_of_bit_index`$$/*计算数字的某个位的值*/CREATE FUNCTION `value_of_b ...
- 二进制样式的字符串与byte数组互转函数示例
开发时用到的方法,记录下: /// <summary> /// 测试方法 /// </summary> private void TestFun() { Response.Wr ...
- Golang etcd服务注册与发现
//sevice.go package discovery import ( "context" "errors" "sync" " ...
- 清理docker容器的日志大小
Docker容器日志清理 date :2019-04-08 13:57:40 1. 问题 docker容器日志导致主机磁盘空间满了.docker logs -f container_name 发现大 ...
- Java 一致性Hash算法的学习
目前我们很多时候都是在做分布式系统,但是我们需把客户端的请求均匀的分布到N个服务器中,一般我们可以考虑通过Object的HashCodeHash%N,通过取余,将客户端的请求分布到不同的的服务端.但是 ...
- linux软链接的创建、删除和更新
大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作.同样的,在系统级别也有.在Windows系列中,我们称其为快捷方式,在Linux中我们称其为链接(基本上都差不多了,其中可能有 ...