题意:

有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在)

特别的,询问的时候l和p合起来是一个递增序列

1<=l,r<=1e9;1<=val<=1e6; 1<=k<=1e9

思路:

因为l和p总体是递增的,第i个询问的p一定大于i之前所有操作的l,而前面能影响到i的答案的只有r>=p的线段。由此可以想到将l,r,p合起来离散化,从左往右扫描,遇到l,就在权值线段树上插入对应的val,遇到r就删除对应的val,而遇到询问时,当前的线段树必然对应了P点的所有线段,求一下全局第k小就能得到答案。

全局第k小除了利用权值线段树外,还能通过二分树状数组求得,复杂度比线段树多logn,但是实际测试好像还是树状数组快。

权值线段树

#include <bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int maxn=2e5+5;//离散化值可能有两倍
struct node {
int opt,p,val,id;
operator<(node b) {
if(p!=b.p)
return p<b.p;
else if(opt==2)
return true;
else if(b.opt==2)
return false;
else
return id<b.id;
}
} P[maxn];
int cnt=0,n;
int T[maxn<<2];
inline void push_now(int k){
T[k]=T[k<<1]+T[k<<1|1];
}
void add(int rt,int l,int r,int p,int val){//[l,r]
if(l==r){
T[rt]+=val;
return;
}
int mid=(l+r)>>1;
if(p<=mid) add(lson,l,mid,p,val);
if(p>mid) add(rson,mid+1,r,p,val);
push_now(rt);
}
int query(int rt,int l,int r,int k){
if(T[rt]<k) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(T[lson]>=k)
return query(lson,l,mid,k);
else
return query(rson,mid+1,r,k-T[lson]);
}
int lisan[maxn],tot=0;
int ans[maxn],acnt=0;
int main() {
int t,E;
cin>>t;
for(int kase=1; kase<=t; kase++) {
scanf("%d",&E);
tot=0;acnt=0;cnt=0;
for(int i=1; i<=E; i++)
T[i]=0;
int x,val,y,opt;
for(int i=1; i<=E; i++) {
scanf("%d%d%d",&opt,&x,&val);
if(opt==1) {
lisan[++tot]=val;
scanf("%d",&y);
P[++cnt]= {1,x,val,i};
P[++cnt]= {-1,y,val,i};
} else {
P[++cnt]= {2,x,val,i};
}
}
sort(lisan+1,lisan+1+tot);
n=unique(lisan+1,lisan+1+tot)-(lisan+1);
for(int i=1; i<=cnt; i++) {
if(P[i].opt!=2)
P[i].val=lower_bound(lisan+1,lisan+1+n,P[i].val)-lisan;
}
sort(P+1,P+1+cnt);
for(int i=1; i<=cnt; i++) {
if(P[i].opt!=2) {
add(1,1,n,P[i].val,P[i].opt);
}
else {
int temp=query(1,1,n,P[i].val);
if(temp==-1)
ans[++acnt]=-1;
else
ans[++acnt]=lisan[temp];
}
}
printf("Case %d:\n",kase);
for(int i=1; i<=acnt; i++) {
printf("%d\n",ans[i]);
}
}
}

树状数组+二分

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;//离散化值可能有两倍
struct node {
int opt,p,val,id;
operator<(node b) {
if(p!=b.p)
return p<b.p;
else if(opt==2)
return true;
else if(b.opt==2)
return false;
else
return id<b.id;
}
} P[maxn];
int cnt=0,n;
int T[maxn];
int lowbit(int x) {
return x&(-x);
}
int getsum(int p) {
int res=0;
while(p>0) {
res+=T[p];
p-=lowbit(p);
}
return res;
}
void add(int p,int val) {
while(p<=n) {
T[p]+=val;
p+=lowbit(p);
}
}
int query(int x) {
int l=0,r=n,mid;
while(r-l>1) {
mid=(r+l+1)/2;
if(getsum(mid)>=x)
r=mid;
else
l=mid;
}
return r;
}
int lisan[maxn],tot=0;
int ans[maxn],acnt=0;
int main() {
int t,E;
cin>>t;
for(int kase=1; kase<=t; kase++) {
scanf("%d",&E);
tot=0;
acnt=0;
cnt=0;
for(int i=1; i<=E; i++)
T[i]=0;
int x,val,y,opt;
for(int i=1; i<=E; i++) {
scanf("%d%d%d",&opt,&x,&val);
if(opt==1) {
lisan[++tot]=val;
scanf("%d",&y);
P[++cnt]= {1,x,val,i};
P[++cnt]= {-1,y,val,i};
} else {
P[++cnt]= {2,x,val,i};
}
}
sort(lisan+1,lisan+1+tot);
n=unique(lisan+1,lisan+1+tot)-(lisan+1);
for(int i=1; i<=cnt; i++) {
if(P[i].opt!=2)
P[i].val=lower_bound(lisan+1,lisan+1+n,P[i].val)-lisan;
}
sort(P+1,P+1+cnt);
for(int i=1; i<=cnt; i++) {
if(P[i].opt!=2) {
add(P[i].val,P[i].opt);
}
else {
int temp=query(P[i].val);
if(getsum(n)<P[i].val)
ans[++acnt]=-1;
else
ans[++acnt]=lisan[temp];
}
}
printf("Case %d:\n",kase);
for(int i=1; i<=acnt; i++) {
printf("%d\n",ans[i]);
}
}
}

The Stream of Corning 2( 权值线段树/(树状数组+二分) )的更多相关文章

  1. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  2. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  3. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  4. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  5. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  6. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

  7. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  8. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  9. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

随机推荐

  1. Linux终端下简单的登录程序 密码不回显

    在Linux进行登录是输入密码不会被回显,所以我也写了个简单的登入程序,使得在输入密码时不再进行回显. #include <stdio.h> #include <stdlib.h&g ...

  2. [未解决]报错: crawlab启动失败

    拉取镜像 docker pull tikazyq/crawlab:latest 一键启动 docker-compose up 报错提示:

  3. 0x3f3f3f3f 0xbfbfbfbf 等的原理及应用

    原理 0x的意思其实是十六进制,后面加的数其实就是一个十六进制数. 在十六进制中,我们知道a代表10,b代表11,c代表12,d代表13,e代表14,f代表15. 所以3f3f3f3f这个数用十进制数 ...

  4. CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC

    /**  * CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC  *  * Vitaly Nikolenko  * http://ha ...

  5. 2019 Multi-University Training Contest 1 - 1012 - NTT

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=6589 题解连接: https://www.cnblogs.com/xusirui/p/1122945 ...

  6. grep命令用关系或查询多个字符串

    bcmsh ps | grep -E 'port|ge2 ' bcmsh ps | grep 'port\|ge2 ' 我的目的是筛选出含有 ‘port’ 或者含有 ‘ge2 ’ 的行,上面的第一行参 ...

  7. JavaScript —— 正则表达式元字符

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. Ajax —— 服务器端发送JSON数据

    重点需要解决的问题:服务器端如何构建JSON数据 思考:JavaBean转JSON数据,集合转JSON数据,普通java对象(String,Number)转JSON数据 一.Gson开源jar包   ...

  9. App.Config操作

    public class ConfigUtils { public static string filename = System.Windows.Forms.Application.StartupP ...

  10. 【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构

    那么在前四章我们已经把数据的表示和运算,存储系统和指令系统都已经给大家讲完了.那么从这一章开始,我们将要讲解中央处理器的内容.那么这一部分内容我们就进入到我们计算机组成原理的一个深水区,它是我们计算机 ...