[luogu3939][数颜色]
思路
对于每一种颜色都建立一个动态开点线段树。然后每次查询的时候就去这个颜色的线段树上查询就行了。修改之后不要忘记交换颜色。
这个题目数据有点强。抄了个比较快的读入优化才卡过去。
代码
/*
* @Author: wxyww
* @Date: 2018-12-13 08:59:51
* @Last Modified time: 2018-12-13 09:56:16
*/
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 600000;
#include <sys/mman.h>
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#define Finline __inline__ __attribute__ ((always_inline))
struct io{
char *s;
io():s((char*)mmap(0, 1<<26, PROT_READ, MAP_PRIVATE, fileno(stdin), 0)) {}
inline operator int()
{
register int x=0;
for(;*s<48;++s);
for(;*s>47;)x=x*10+*s++-48;
return x;
}
}io;
int TR[N * 20],a[N],ls[N * 20],rs[N * 20];
int tot,root[N];
inline void update(int &cur,int l,int r,int pos,int c) {
if(!cur) cur = ++tot;
if(l == r) {
TR[cur] += c;
return;
}
TR[cur] += c;
int mid = (l + r) >> 1;
if(pos <= mid) update(ls[cur],l,mid,pos,c);
else update(rs[cur],mid + 1,r,pos,c);
}
inline int query(int cur,int l,int r,int L,int R) {
if(L <= l && R >= r) return TR[cur];
int mid = (l + r) >> 1,ans = 0;
if(L <= mid) ans += query(ls[cur],l,mid,L,R);
if(R > mid) ans += query(rs[cur],mid + 1,r,L,R);
return ans;
}
int main() {
int n = io,m = io;
for(int i = 1;i <= n;++i) {
a[i] = io;
update(root[a[i]],1,n,i,1);
}
while(m--) {
int opt = io;
if(opt == 1) {
int l = io,r = io,c = io;
printf("%d\n",query(root[c],1,n,l,r));
}
else {
int x = io;
update(root[a[x]],1,n,x,-1);
update(root[a[x]],1,n,x + 1,1);
update(root[a[x + 1]],1,n,x + 1,-1);
update(root[a[x + 1]],1,n,x,1);
swap(a[x],a[x + 1]);
}
}
return 0;
}
[luogu3939][数颜色]的更多相关文章
- BZOJ 2120: 数颜色
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3623 Solved: 1396[Submit][Status][Discuss] ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- BZOJ 2120 数颜色(带修改的莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 3478 Solved: 1342 [Submit][Status][Discus ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 2645 Solved: 1039[Submit][Status][Discuss] ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- Luogu 1903 数颜色 | 分块
Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...
- P3939 数颜色
目录 题目 思路1(待修莫队) 思路2(vector+二分) 代码1 代码2 题目 P3939 数颜色 思路1(待修莫队) 哇,这不是莫队模板题吗 3e5,TLE45分 不行 我有信仰啊 pow(n, ...
随机推荐
- CLOUD添加自定义基础数据
1.打开bos平台,文件-新建-复制-基础资料 2.新建目标对象 3.发布 4.开始新增对象 5.明细维护,完成 6.添加成功
- Chrome---谷歌浏览器修改用户缓存文件夹 如何设置缓存路径
1.首先我们在电脑上打开chrome浏览器,然后地址栏输入chrome://Version,然后按下回车键,找到个人资料路径一项. 2.接下来我们选中个人资料路径后面所有的信息,右键点击信息后选择“复 ...
- 防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机
现象:刚装的centos6.6,配置好网络却发现ping不通主机,主机却ping通虚拟机: 解决方法: 1.最简单的方法就是:关闭防火墙.但一直关闭防火墙也不是个办法,会遇到很多安全问题,建议下一个方 ...
- java学习之—链表(3)
/** * 使用链表实现队列 * Create by Administrator * 2018/6/19 0019 * 下午 4:37 **/ public class Link { public l ...
- Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战
一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...
- vue-resource: jsonp请求百度搜索的接口
1. yarn add vue-resource 2. main.js引入vue-resource import Vue from 'vue' import MintUI from 'mint-ui' ...
- ADO.NET工具类(三)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 官网下载旧版本jdk,老版本jdk,jdk1.7,jdk1.8
1.进入中文oracle官网(不是国内官网下载速度超级慢): http://www.oracle.com/technetwork/cn/indexes/downloads/index.html 2.进 ...
- CSS查漏补缺【未完】
1.层叠次序 当同一个 HTML 元素被不止一个样式定义时,会使用哪个样式呢? 一般而言,所有的样式会根据下面的规则层叠于一个新的虚拟样式表中,其中数字 4 拥有最高的优先权. 浏览器缺省设置 外部样 ...
- Codeforces Round #472 Div. 1
A:某个格子被染黑说明该行和该列同时被选中,使用并查集合并,最后看每个集合中是否有未被染黑的格子即可. #include<iostream> #include<cstdio> ...