BZOJ 3110 [Zjoi2013]K大数查询 ——树套树
【题目分析】
外层区间线段树,内层是动态开点的权值线段树。
SY神犇说树套树注重的是内外层的数据结构的选择问题,果然很重要啊。
动态开点的实现方法很好。
【代码】
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> #include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue> using namespace std; #define mlog 16
#define inf (0x3f3f3f3f) unsigned Getunsigned()
{
unsigned x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f; } #define maxn 50005
#define F(i,j,k) for (unsigned i=j;i<=k;++i)
#define maxm maxn<<8 unsigned rt[maxn<<2],n,m,sum[maxm],le[maxm],ri[maxm],lazy[maxm];
unsigned c,L,R,cnt,opt; void push(unsigned &o,unsigned l,unsigned r)
{
if (!o) o=++cnt;
if (L<=l&&r<=R)
{
lazy[o]++;
sum[o]+=(r-l+1);
return;
}
unsigned mid=l+r>>1;
if (L<=mid) push(le[o],l,mid);
if (R>mid) push(ri[o],mid+1,r);
sum[o]=sum[le[o]]+sum[ri[o]]+lazy[o]*(r-l+1);
} void modi(unsigned o,unsigned l,unsigned r)
{
push(rt[o],1,n); if (l==r) return ;
unsigned mid=l+r>>1;
if (c<=mid) modi(o<<1,l,mid);
else modi(o<<1|1,mid+1,r);
} unsigned calc(unsigned o,unsigned l,unsigned r)
{
if (!o) return 0;
if (L<=l&&r<=R) return sum[o];
unsigned mid=l+r>>1,tmp=0;
if (L<=mid) tmp+=calc(le[o],l,mid);
if (R>mid) tmp+=calc(ri[o],mid+1,r);
return tmp+lazy[o]*(min(R,r)-max(L,l)+1);
} unsigned ask(unsigned o,unsigned l,unsigned r)
{
if (l==r) return l;
unsigned mid=l+r>>1,tmp=calc(rt[o<<1],1,n);
if (c<=tmp) return ask(o<<1,l,mid);
c-=tmp; return ask(o<<1|1,mid+1,r);
} int main()
{
n=Getunsigned();
m=Getunsigned();
F(i,1,m)
{
opt=Getunsigned(); L=Getunsigned();
R=Getunsigned(); c=Getunsigned();
if (opt==1) c=n-c+1,modi(1,1,n);
else printf("%u\n",n-ask(1,1,n)+1);
}
return 0;
}
BZOJ 3110 [Zjoi2013]K大数查询 ——树套树的更多相关文章
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- 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大数查询【树套树||整体二分】
树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
随机推荐
- React Native 手工搭建环境 之iOS篇
常识 React native 开发服务器 在开发时,我们的框架是这样的:  当正式发布进入到生产环境时,开发服务器上所有的js文件将会被编译成包的形式,直接嵌入到客户端内.这时,已经不再需要开发服 ...
- IOS之网络状态设和NSUserDefaults的synchronize
#pragma mark - check net status int apiCheckNetStatus() { Reachability *reachNet = [Reachability rea ...
- Windows系统下Android开发环境搭建
“工具善其事,必先利其器”.要想学好Android,搭建好Android开发环境是一个良好的开端. Windows系统下Android开发环境主要有4个大的步骤.分别是: 1.JDK的安装 2.ecl ...
- SQL 数学串函数
数学函数 ceiling 取上限 floor 取下限 round 四舍五入 len 长度 abs 绝对值 PI()圆周率 sqrt 开根号 qwuare 平方根 select 10 ...
- hdu 3555 Bomb 炸弹(数位DP,入门)
题意: 给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的. 思路: 2^64也顶多是十进制的20多位,那么按十进制位来分析更简单.如果能计算k位十进制数中分别 ...
- codevs 3344 迷宫
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A ...
- js获取当前时间的前一天/后一天
Date curDate = new Date();var preDate = new Date(curDate.getTime() - 24*60*60*1000); //前一天var nextDa ...
- objdump命令
0x00 objdump命令是Linux下的反汇编目标文件或者可执行文件的命令 0x01 objdump -f 显示test的文件头信息 $ objdump -f levellevel: file ...
- ueditor中FileUtils.getTempDirectory()找不到
2014-6-27 14:22:25 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() fo ...
- Java中的线程--Lock和Condition实现线程同步通信
随着学习的深入,我接触了更多之前没有接触到的知识,对线程间的同步通信有了更多的认识,之前已经学习过synchronized 实现线程间同步通信,今天来学习更多的--Lock,GO!!! 一.初时Loc ...