Luogu 3332 [ZJOI2013]K大数查询
BZOJ 3110
很早就想写的试炼场题。
不会整体二分啊呜呜呜,只能写写树套树。
有一个trick就是外层使用一个权值线段树,把位置作为下标的线段树放在内层,这样子的话我们在查询$k$大的时候就可以直接在外层线段树上一边走一边二分。
注意我们查询的是第$k$大不是第$k$小,所以我们在走的时候要观察右子树的权值和$k$的关系。
内层可以动态开点防mle,注意在打标记下传的时候要先给左右儿子赋值。
挺卡常的。
时间复杂度$O(nlog^2n)$。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll; const int N = 5e4 + ; int n, qn, mn, tot = ;
ll val[N]; struct Querys {
int type, l, r;
ll k;
} q[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} namespace SegT {
struct Node {
int lc, rc, tag;
ll sum;
} s[N * ]; int root[N << ], nodeCnt = ; #define lc(p) s[p].lc
#define rc(p) s[p].rc
#define sum(p) s[p].sum
#define tag(p) s[p].tag
#define mid ((l + r) >> 1) inline void up(int p) {
if(!p) return;
sum(p) = sum(lc(p)) + sum(rc(p));
} inline void down(int p, int l, int r) {
if(!tag(p)) return;
if(!lc(p)) lc(p) = ++nodeCnt;
if(!rc(p)) rc(p) = ++nodeCnt;
sum(lc(p)) += 1LL * tag(p) * (mid - l + ), tag(lc(p)) += tag(p);
sum(rc(p)) += 1LL * tag(p) * (r - mid), tag(rc(p)) += tag(p);
tag(p) = ;
} void ins(int &p, int l, int r, int x, int y) {
if(!p) p = ++nodeCnt;
if(x <= l && y >= r) {
++tag(p);
sum(p) += 1LL * (r - l + );
return;
} down(p, l, r);
if(x <= mid) ins(lc(p), l, mid, x, y);
if(y > mid) ins(rc(p), mid + , r, x, y);
up(p);
} ll getSum(int p, int l, int r, int x, int y) {
if(!p) return 0LL;
if(x <= l && y >= r) return sum(p); down(p, l, r); ll res = 0LL;
if(x <= mid) res += getSum(lc(p), l, mid, x, y);
if(y > mid) res += getSum(rc(p), mid + , r, x, y);
return res;
} void modify(int p, int l, int r, int x, int y, int v) {
ins(root[p], , n, x, y);
if(l == r) return; if(v <= mid) modify(p << , l, mid, x, y, v);
else modify(p << | , mid + , r, x, y, v);
} int query(int p, int l, int r, int x, int y, ll k) {
if(l == r) return l; ll now = getSum(root[p << | ], , n, x, y);
if(now >= k) return query(p << | , mid + , r, x, y, k);
else return query(p << , l, mid, x, y, k - now);
} } using namespace SegT; int main() {
read(n), read(qn);
for(int i = ; i <= qn; i++) {
read(q[i].type), read(q[i].l), read(q[i].r), read(q[i].k);
if(q[i].type == ) val[++tot] = q[i].k;
} sort(val + , val + tot + );
tot = unique(val + , val + + tot) - val - ;
mn = tot; for(int i = ; i <= qn; i++) {
if(q[i].type == ) {
int v = lower_bound(val + , val + + tot, q[i].k) - val;
modify(, , mn, q[i].l, q[i].r, v);
} else printf("%lld\n", val[query(, , mn, q[i].l, q[i].r, q[i].k)]);
} return ;
}
Luogu 3332 [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大数查询_整体二分+树状数组
		
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
 - P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)
		
P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...
 - 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询
		
[BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...
 - 3110: [Zjoi2013]K大数查询
		
3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...
 
随机推荐
- 如何选择MySQL数据库的安装方式
			
MySQL数据库安装有yum安装,rpm安装,二进制编译安装,cmake,或者make安装,但是选择什么样的安装方式则全看实际应用场景. 下为网友总结安装方式选择: 若是对数据库要求不太高的场景 ...
 - C#  如何将对象写入文件
			
http://wenku.baidu.com/link?url=QwDRlO1TeoubnmtUOitXXTRa-eZ6QFKvEuyXyzLXD9c0qCRUV5TL9Fq7_HqvxrMcwsAL ...
 - 使用Python和OpenCV通过网址URL获取图片
			
在OpenCV中通过图片的URL地址获取图片: # -*- coding: utf-8 -*- import numpy as np import urllib import cv2 # URL到图片 ...
 - loj #161 子集卷积
			
求不相交集合并卷积 sol: 集合并卷积?看我 FWT! 交一发,10 以上的全 T 了 然后经过参考别人代码认真比对后发现我代码里有这么一句话: rep(s, , MAXSTATE) rep(i, ...
 - ACM学习历程—Hihocoder 1139 二分·二分答案(bfs)
			
http://hihocoder.com/problemset/problem/1139 这题提示上写的是二分,但是感觉不二分应该也可以,至少题目是AC的... 二分的思想就是二分答案的值,看能不能在 ...
 - hashmap&linkedlist
			
import java.util.HashMap; import java.util.Iterator; public class hashmap1 { public static void main ...
 - Directx 9 VS2015环境搭建
			
安装好Directx9 sdk和vs2015后 打开vs,新建项目 --> c++项目 -->win32控制台应用程序-->空项目 创建项目后,右键项目属性, 包含目录 D:\Pr ...
 - linux下安装composer
			
在linux下使用comoser命令,但是提示composer command not found 那么就是当前环境中没有composer 学习源头: https://blog.csdn.net/gb ...
 - Nginx报错 connect() failed (111: Connection refused) while connecting to upstream 的解决方法
			
今天访问公司的网站突然报错,抛出一些英文,提示看一下Nginx的error.log日志: cd /usr/local/nginx/logs/ 看到了error.log ,下一步 tail -n 2 ...
 - C++11 引用叠加规则和模板参数类型推导规则
			
http://zm8.sm-img2.com/?src=http%3A%2F%2F***%2FArticle%2F38320&uid=57422b713ac761e653af7b327bfd9 ...