「ZJOI2013」K大数查询
「ZJOI2013」K大数查询
传送门
整体二分,修改的时候用线段树代替树状数组即可。
参考代码:
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
}
typedef long long LL;
const int _ = 5e4 + 5;
int n, m, q, res[_]; LL sum[_ << 2]; int tag[_ << 2];
struct node { int opt, l, r; LL c; int id; } t[_], tt1[_], tt2[_];
inline int lc(int p) { return p << 1; }
inline int rc(int p) { return p << 1 | 1; }
inline void pushup(int p) { sum[p] = sum[lc(p)] + sum[rc(p)]; }
inline void f(int p, int l, int r, int v) { sum[p] += 1ll * v * (r - l + 1), tag[p] += v; }
inline void pushdown(int p, int l, int r, int mid)
{ if (tag[p]) f(lc(p), l, mid, tag[p]), f(rc(p), mid + 1, r, tag[p]), tag[p] = 0; }
inline void update(int ql, int qr, int v, int p = 1, int l = 1, int r = n) {
if (ql <= l && r <= qr) return f(p, l, r, v);
int mid = (l + r) >> 1;
pushdown(p, l, r, mid);
if (ql <= mid) update(ql, qr, v, lc(p), l, mid);
if (qr > mid) update(ql, qr, v, rc(p), mid + 1, r);
pushup(p);
}
inline LL query(int ql, int qr, int p = 1, int l = 1, int r = n) {
if (ql <= l && r <= qr) return sum[p];
int mid = (l + r) >> 1; LL res = 0;
pushdown(p, l, r, mid);
if (ql <= mid) res += query(ql, qr, lc(p), l, mid);
if (qr > mid) res += query(ql, qr, rc(p), mid + 1, r);
return res;
}
inline void solve(int ql, int qr, int l, int r) {
if (ql > qr || l > r) return ;
if (l == r) { for (rg int i = ql; i <= qr; ++i) if (t[i].opt == 2) res[t[i].id] = l; return ; }
int mid = (l + r) >> 1, p1 = 0, p2 = 0;
for (rg int i = ql; i <= qr; ++i) {
if (t[i].opt == 1) {
if (t[i].c <= mid) tt1[++p1] = t[i]; else update(t[i].l, t[i].r, 1), tt2[++p2] = t[i];
} else {
LL cnt = query(t[i].l, t[i].r);
if (cnt < t[i].c) t[i].c -= cnt, tt1[++p1] = t[i]; else tt2[++p2] = t[i];
}
}
for (rg int i = 1; i <= p2; ++i) if (tt2[i].opt == 1) update(tt2[i].l, tt2[i].r, -1);
for (rg int i = 1; i <= p1; ++i) t[ql + i - 1] = tt1[i];
for (rg int i = 1; i <= p2; ++i) t[ql + p1 + i - 1] = tt2[i];
solve(ql, ql + p1 - 1, l, mid), solve(ql + p1, qr, mid + 1, r);
}
int main() {
read(n), read(m);
for (rg int i = 1; i <= m; ++i)
read(t[i].opt), read(t[i].l), read(t[i].r), read(t[i].c), t[i].id = t[i].opt == 2 ? ++q : 0;
solve(1, m, 0, n);
for (rg int i = 1; i <= q; ++i) printf("%d\n", res[i]);
return 0;
}
「ZJOI2013」K大数查询的更多相关文章
- 【BZOJ3110】【Zjoi2013】K大数查询 - 2
之前用权值线段树套区间线段树水过,现在再练习一下整体二分 原题:有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b ...
- 【ZJOI2013】k大数查询 BZOJ 3110
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ 3110 【Zjoi2013】 K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- 【BZOJ3110】【ZJOI2013】k大数查询
原题传送门 题意简析 给定一个区间,可以在这个区间上每个整数点插入若干个数(这些数数值可以重复)你需要支持2种操作: 1)在[a,b]间所有整数点插入c 2)查询[a,b]内第c大的数 解题思路 树套 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )
BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
随机推荐
- National Contest for Private Universities (NCPU), 2019 C Boxes(双向链表)
题目中的要求如果x在y的左边,不需要移动,x在y的右边,2操作不需要移动. 有一个问题是,如果x与y相邻,这时的swap操作变成了三个而不是四个,这点尤其需要注意,不然就会死循环.注意x是和y相邻,这 ...
- Java面向对象编程 -4.2
声明static定义方法 这个时候对于程序而言方法就有了两种:static方法 非static方法. 这两个方法之间在调用上就有了限制: static方法只允许调用static属性或static方法 ...
- Spring Security 源码分析 --- WebSecurity
概述 spring security 源码分析系列文章. 源码分析 我们想一下,我们使用 ss 框架的步骤是怎么样的. @Configuration @EnableWebSecurity @Enabl ...
- python manage.py shell
启动python有两种方式:python manage.py shell和python. 这两个命令 都会启动交互解释器,但是manage.py shell命令有一个重要的不同: 在启动解释器之前,它 ...
- 【JavaWeb】Spring相关错误记录
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: ...
- 前端必学---JavaScript数据结构与算法---简介
前端必学---JavaScript数据结构与算法---简介 1. 数据结构: 数据结构是相互之间存在一种或者多种特定关系的数据元素的集合.---<大话数据结构> 1.1 数据结构的分类 1 ...
- CentOS7安装jenkis
注意:终止运行Ctrl+c , 退回到shell命令Ctrl+d 一.先检查是否有java [root@huangyh huangyh]# rpm -qa |grep java 或 java 因为C ...
- WLC HA模式下的注意事项
管理控制器:1.控制器默认开启的是SSH (CLI),Secure Web/https (GUI)2.登录控制器的管理地址为Active设备所控制(主备的配置同步,所以管理地址一致)3.WLC HA状 ...
- 「JSOI2014」学生选课
「JSOI2014」学生选课 传送门 看到这题首先可以二分. 考虑对于当前的 \(mid\) 如何 \(\text{check}\) 我们用 \(f_{i,j}\) 来表示 \(i\) 对 \(j\) ...
- Redis数据库在windows系统下的安装及使用
1.下载 Redis官方是不支持windows的,但是Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,下载地址:https://github.com/ ...