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(带修莫队)的更多相关文章

  1. LG4074【WC2013】糖果公园 【树上莫队,带修莫队】

    题目描述:给出一棵 \(n\) 个点的树,点有颜色 \(C_i\),长度为 \(m\) 的数组 \(V\) 和长度为 \(n\) 的数组 \(W\).有两种操作: 将 \(C_x\) 修改为 \(y\ ...

  2. P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]

    P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...

  3. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  4. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  5. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  6. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  7. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

  8. BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)

    4129: Haruna’s Breakfast Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 835  Solved: 409[Submit][St ...

  9. BZOJ 2120 数颜色 (带修莫队)

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

随机推荐

  1. Linux shell去除字符串中所有空格

    Linux shell去除字符串中所有空格 echo $VAR | sed 's/ //g'

  2. 微信小程序,图片居中显示,适配不同机型

    <view style='width:100%;height:100%;text-align:center;' class="picture-2">   <ima ...

  3. 关系数据库(RDBMS)小记

    关系数据库三个范式 三个范式: 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性 这里说的不可拆分通常是放在业务背景下而言的,是否可拆分视业务需求而定 ...

  4. Android 解析未知格式的json数据

    1.递归一有的时候我们需要解析未知的json.或者说是动态的json.那么我们并不知道key具体是多少,或者说key不是固定的.这时候就需要解析动态key的方法. 这个方法是我在实现解析前台传入的js ...

  5. CDN 服务域名解析配置

    记录类型请选择为CNAME: 主机记录即加速域名的前缀,例如:   如果您的加速域名为... 前缀为... testcdn.aliyun.com testcdn www.aliyun.com www ...

  6. 并发编程基础之ThreadLocal

    一:概念 在多线程并发访问的情况下,为了解决线程安全,一般我们会使用synchronized关键字,如果并发访问量不是很大,可以使用synchronized, 但是如果数据量比较大,我们可以考虑使用T ...

  7. 从头配置,开发 cocos2dx 3.14.1

    要使用cocos2dx写一个麻将测试工具. 配置流程如下: 1. 下载安装最新版本的VS(VS2017): https://www.visualstudio.com/zh-hans/downloads ...

  8. Centos7 启动脚本

    Centos7 启动脚本 启动脚本.如果进程已存在,输出错误信息后退出: #! /bin/bash PIDS=`ps -ef | grep '/usr/bin/node ./index.js' | g ...

  9. Windows下JDK多版本切换

    根据需要,我们可以在一台电脑上安装多个不同的JDK版本,在使用的过程中,可能需要进行版本质检的切换.下面简单说明在切换过程中需要注意的问题.(个人本机是部署了1.8和1.7版本的,安装目录均在C:\P ...

  10. win PowerCmd命令行工具安装

    官网:http://www.powercmd.com/ 下载地址:http://www.powercmd.com/Install_PowerCmd.exe 版本信息: 输入注册码: PowerCmd ...