\(des\)

给出长度为 \(n\) 的序列,全局变量 \(t\),\(m\) 次询问,询问区间 \([l, r]\) 内出现次数为 \(t\) 的数的个数

\(sol\)

弱化问题:求区间 \([l, r]\) 内只出现一次的数的个数

对于一个右端点 \(r\),从 \(r\) 向左扫

每次遇到新出现的字符就对该点的点值 +1,

每第二次遇到出现的字符就对该点的点值 -1;

否则不进行任何改变

这样的话,对于区间 \([l, r]\) 内只出现一次的数权值都为 1

线段树或树状数组维护区间加减与区间求和

现在来看这个问题

本质上这两个问题是完全一样的

对于每个右端点 \(r\)

依旧从 \(r\) 向左扫

每遇到第 \(t\) 次出现的字符就对该点的点值 +1,

第 \(t + 1\) 次出现的字符就对该点的点值 -1

实际操作

首先题目不要求在线,这样的话就离线操作

对所有的询问按照右端点进行排序

每个 \(r\) 向前扫时都可以集成上一个 \(r\)

这样的话总的时间复杂度为 \(O(nlogn)\)

今天都快睡着了,没想这题尽然没怎么调试,只调了一下导致死循环的边界

\(code\)

#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 10;

#define gc getchar()
#define Rep(i, a, b) for(int i = a; i <= b; i ++) #define gc getchar()
inline int read() {
int x = 0; char c = gc;
while(c < '0' || c > '9') c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
return x;
} int n, m, k, t;
int Col[N];
struct Node {
int l, r, id;
bool operator < (const Node a) const {
return this-> r == a.r ? this-> l > a.l : this-> r < a.r;
}
} Ask[N];
int Nxt[N], Pre[N], Which_t[N], Which_t2[N];
int Js[N], Leftest[N], rightest[N]; int Ans[N]; struct Node_ {
int Tree[N]; inline int Lowbit(int x) {return x & -x;} void Add(int x, int num) {
for(; x <= n; x += Lowbit(x)) Tree[x] += num;
} int Calc(int x) {
if(x == 0) return 0;
int ret = 0;
for(; x; x -= Lowbit(x)) ret += Tree[x];
return ret;
}
} Bit; int have_use; int main() {
n = read(), m = read(), k = read(), t = read();
Rep(i, 1, n) Col[i] = read();
Rep(i, 1, m) {Ask[i].l = read(), Ask[i].r = read(); Ask[i].id = i;}
sort(Ask + 1, Ask + m + 1);
int L = 1; Ask[1].r + 1;
Rep(i, 1, m) {
while(L <= Ask[i].r) {
Js[Col[L]] ++;
if(Js[Col[L]] != 1) {
Pre[L] = rightest[Col[L]];
Nxt[rightest[Col[L]]] = L;
rightest[Col[L]] = L;
}
if(Js[Col[L]] == 1) {
rightest[Col[L]] = L;
Leftest[Col[L]] = L;
}
if(Js[Col[L]] == t + 2) {
Bit.Add(Which_t2[Col[L]], 1);
Bit.Add(Which_t[Col[L]], -2);
Bit.Add(Nxt[Which_t[Col[L]]], 1);
Which_t2[Col[L]] = Which_t[Col[L]];
Which_t[Col[L]] = Nxt[Which_t[Col[L]]];
Js[Col[L]] --;
L ++;
continue;
} else if(Js[Col[L]] == t + 1) {
Bit.Add(Which_t[Col[L]], -2);
Bit.Add(Nxt[Which_t[Col[L]]], 1);
Which_t2[Col[L]] = Which_t[Col[L]];
Which_t[Col[L]] = Nxt[Which_t[Col[L]]];
} else if(Js[Col[L]] == t) {
Which_t[Col[L]] = Leftest[Col[L]];
Bit.Add(Which_t[Col[L]], 1);
}
L ++;
}
for(int j = have_use + 1; j <= m; j ++) {
if(Ask[j].r != Ask[have_use + 1].r) {
have_use = j - 1; break;
}
Ans[Ask[j].id] = Bit.Calc(Ask[j].r) - Bit.Calc(Ask[j].l - 1);
if(j == m) have_use = m;
}
i = have_use;
}
Rep(i, 1, m) printf("%d\n", Ans[i]); return 0;
}

noi.ac #44 链表+树状数组+思维的更多相关文章

  1. 【BZOJ2434】阿狸的打字机(AC自动机,树状数组)

    [BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自 ...

  2. 【BZOJ2434】【NOI2011】阿狸的打字机(AC自动机,树状数组)

    [BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自 ...

  3. 【BZOJ3295】【块状链表+树状数组】动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  4. 【BZOJ4548】小奇的糖果 set(链表)+树状数组

    [BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...

  5. Codeforces 163E(ac自动机、树状数组)

    要点 显然ac自动机的板子就可以暴力一下答案了 为了优化时间复杂度,考虑套路fail树的dfs序.发现本题需要当前这个尾点加上所有祖先点的个数,考虑使用树状数组差分一下,在父点+1,在子树后-1,每次 ...

  6. 【树状数组 思维题】luoguP3616 富金森林公园

    树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...

  7. BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2434 题解: 我写的是离线做法,不知道有没有在线做法. 转化一波题意,\(x\)在AC ...

  8. BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)

    吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...

  9. Bzoj4548 小奇的糖果(链表+树状数组)

    题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...

随机推荐

  1. bootstrap Modal或者 bootbox弹窗时,页面混动至顶部

    bootstrap使用Modal时,页面自动滚动至了最顶部, 调用bootbox时,也是如此 查了半天资料,最后参考下述帖子,解决问题 https://stackoverflow.com/questi ...

  2. MGR并行复制从节点复制线程死锁

    1.故障现象 20191113-22:32 datax全量同步t_shop_info表到 eorder所在的实例,t_shop_info表有两个唯一约束.总数据量不超过1w行,同步完成后MGR从库复制 ...

  3. 使用lxml解析HTML代码

    做个参考,转自:https://blog.csdn.net/qq_42281053/article/details/80658018

  4. 方法2:使用Jenkins构建Docker镜像 --SpringCloud

    前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...

  5. NIO(2):Channel

    Channel可以理解为铁轨,Buffer是铁轨上的火车.铁轨的两端连接这文件描述符或者说文件的缓冲区和程序运行时的内存.借助NIO是一种更加符合OS底层文件系统的调用方式,使用NIO可以用更小的开销 ...

  6. C#通用公共类库ZXNetStandardDepot.Common

    总结了一下写项目中遇到的各种方法,总结前辈们的经验,生成了该类库,引用net standard类库,支持net core/net framework. 使用方法 1.nuget 搜索 ZXNetSta ...

  7. iOS 播放系统自带铃声

    播放声音代码例子 https://github.com/baitongtong/git-.git 给一个国外网址,苹果系统铃声以及自定义铃声免登陆免费下载:http://www.zedge.net/r ...

  8. 浅谈javascript中的递归和闭包

    递归和闭包作为js中很重要的一环,几乎在前端的面试中都会涉及,特别闭包.今天前端组的组长冷不丁的问了我一下,粗略的回答了一下,感觉不太满足,于是重新学习了一下,写下本篇. 在说这个两个概念之前,我们先 ...

  9. 尚硅谷MySQL基础学习笔记

    目录 写在前面 MySQL引入 数据库的好处 数据库的相关概念 数据库存储数据的特点 MySQL服务的启动和停止 MySQL服务端的登录和退出 MySQL的常用命令 MySQL语法规范 DQL(Dat ...

  10. spring的Autowired、Resource、Inject的使用

    基本知识:spring最底层使用的是Map,id是bean的id,value是bean的class或者是实例. 1:bean的加载顺序. @Bean("testDao") publ ...