3110: [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询
https://lydsy.com/JudgeOnline/problem.php?id=3110
分析:
整体二分+线段树。
两种操作:区间加入一个数,区间询问第k大值。
如果只有一种操作,我们可以二分答案x,然后把大于x的都加入到线段树中去(区间[l,r]整体+1),然后查询这次询问的区间有多少数(区间[l,r]求和)。
多种操作的话整体二分就行了,注意到有时间顺序,所以可以按照时间顺序加入和查询。
注意一下要开longlong。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define Root 1, n, 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int ans[N], n, m;
struct Que{
int ty, l, r, v, id;
bool operator < (const Que &A) const {
return id < A.id;
}
}A[N], tl[N], tr[N];
struct SegmentTree{
LL sum[N << ], tag[N << ];
void pushup(int rt) { sum[rt] = sum[rt << ] + sum[rt << | ]; }
void pushdown(int rt,int len) {
sum[rt << ] += 1ll * (len - len / ) * tag[rt];
sum[rt << | ] += 1ll * (len / ) * tag[rt];
tag[rt << ] += tag[rt];
tag[rt << | ] += tag[rt];
tag[rt] = ;
}
void update(int l,int r,int rt,int L,int R,int v) {
if (L <= l && r <= R) {
tag[rt] += v, sum[rt] += (r - l + ) * v; return ;
}
if (tag[rt]) pushdown(rt, r - l + );
int mid = (l + r) >> ;
if (L <= mid) update(lson, L, R, v);
if (R > mid) update(rson, L, R, v);
pushup(rt);
}
LL query(int l,int r,int rt,int L,int R) {
if (L <= l && r <= R) return sum[rt];
if (tag[rt]) pushdown(rt, r - l + );
int mid = (l + r) >> ; LL res = ;
if (L <= mid) res += query(lson, L, R);
if (R > mid) res += query(rson, L, R);
return res;
}
}T; void solve(int l,int r,int Head,int Tail) {
if (Head > Tail) return ;
if (l == r) {
for (int i = Head; i <= Tail; ++i)
if (A[i].ty == ) ans[A[i].id] = l;
return ;
}
int mid = (l + r + ) >> , cl = , cr = ;
for (int i = Head; i <= Tail; ++i) {
if (A[i].ty == ) {
if (A[i].v >= mid) T.update(Root, A[i].l, A[i].r, ), tr[++cr] = A[i];
else tl[++cl] = A[i];
}
else {
LL t = T.query(Root, A[i].l, A[i].r);
if (t >= A[i].v) tr[++cr] = A[i];
else A[i].v -= t, tl[++cl] = A[i];
}
}
for (int i = Head; i <= Tail; ++i) if (A[i].ty == && A[i].v >= mid) T.update(Root, A[i].l, A[i].r, -);
for (int i = ; i <= cl; ++i) A[i + Head - ] = tl[i];
for (int i = ; i <= cr; ++i) A[i + Head + cl - ] = tr[i];
solve(l, mid - , Head, Head + cl - );
solve(mid, r, Head + cl, Tail);
}
int main() {
n = read(), m = read(); int Q = ;
for (int i = ; i <= m; ++i) {
A[i].ty = read(), A[i].l = read(), A[i].r = read(), A[i].v = read(), A[i].id = ;
if (A[i].ty == ) A[i].id = ++Q;
}
solve(, n, , m);
for (int i = ; i <= Q; ++i) printf("%d\n",ans[i]);
return ;
}
3110: [Zjoi2013]K大数查询的更多相关文章
- 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][ ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
- BZOJ 3110 [Zjoi2013]K大数查询 (CDQ分治+树状数组)
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】
题目链接: BZOJ - 3110 题目分析 这道题是一道树套树的典型题目,我们使用线段树套线段树,一层是区间线段树,一层是权值线段树.一般的思路是外层用区间线段树,内层用权值线段树,但是这样貌似会很 ...
- bzoj 3110 [Zjoi2013]K大数查询——线段树套线段树(标记永久化)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 第一道线段树套线段树! 第一道标记永久化! 为什么为什么写了两个半小时啊…… 本想线段 ...
随机推荐
- antlr-2.7.6.jar的作用
项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误
- Ping服务
什么是Ping服务 ping是基于XML_RPC标准协议的更新通告服务,用于博客把内容更新快速通知给百度,以便百度及时进行抓取和更新. Ping服务使用方法 你可以采取手动通知和自动通知两种方式使用p ...
- 6、Android---运用手机多媒体(待完成)
6.1.程序运行在手机上 6.2.使用通知 通知是Android中比较由特色的一个功能 当某个应用程序需要向用户发出一些提示信息时 而该程序由不在前台的显示 就可以借助通知来实现 6.2.1.通知的基 ...
- 错误的另一个常见原因是默认的安全组规则。default security group默认情况下不允许ICMP(ping命令使用的协议)
可以在openstack horizon界面中添加ICMP和ssh(TCP)规则,也可以通过命令行.命令行方式给默认安全组添加规则的方法如下: $ nova secgroup-add-rule def ...
- [java之设计模式]策略模式
策略模式(strategy pattern) 定义>> 将一系列的算法封装到一些列的类里面,并且可以相互替换 作用>> 将算法的变化独立于客户端,将算法的指责和算法的行为分开, ...
- ES6读书笔记(二)
前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,现在为第二篇,本篇内容包括: 一.数组扩展 二.对象扩展 三.函数扩展 四.Set和Map数据结构 五.Reflect 本文 ...
- PLSQL Developer 12 注册码
PLSQL Developer 12 注册码product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number:226959 password ...
- Request和Response中文乱码问题的解决方案和区分
首先,在刚接触这个中文乱码问题的时候,还是比较混乱的,因为针对request和response各自都有自己的解决方案,而且思路相似,方法也很相似,又针对get和post两种提交方式,分两种解决中文乱码 ...
- 洛谷P1501 [国家集训队]Tree II(LCT)
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 025-026
满课一天,做25的时候还疯狂WA,进度可以说是很慢了 哭泣 ------------------------------------------------L1-025---------------- ...