Gym 102091K The Stream of Corning 2【线段树】
<题目链接>
题目大意:
进行两种操作:1.给定一个数的出现时间、价值、消失时间;
2.进行一次询问,问你当前时间,第K大的数的价值。
解题分析:
采用离线集中处理,将每个数的出现时间和它的消失时间分组存下,并且存下所有的询问。然后就是依次进行所有询问,将这些询问时间点之前的点插入,将已经消失的点删除。因为算了一下复杂度感觉能过,所以就没有用离散化,线段树的代表区间大小就是1~1e6,线段树的节点维护的信息就是这个节点所对应区间的有效节点个数。
#include <bits/stdc++.h>
using namespace std; const int N = 1e5+ , MAX = 1e6+; #define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
struct Node{
int time,val;
Node (int _time=,int _val=):time(_time),val(_val){}
bool operator < (const Node & tmp) const { return time<tmp.time; }
}node1[N],node2[N],d[N]; int tr[MAX<<]; template<typename T>
inline void read(T&x){
x=;int f=;char ch=getchar();
while(ch<'' ||ch>''){ if(ch=='-')f=-; ch=getchar(); }
while(ch>='' && ch<=''){ x=x*+ch-''; ch=getchar(); }
x*=f;
} inline void Pushup(int rt){ tr[rt]=tr[rt<<]+tr[rt<<|]; }
void update(int rt,int l,int r,int loc,int val){
if(l==r){ tr[rt]+=val;return; }
int mid=l+r>>;
if(loc<=mid)update(lson,loc,val);
if(loc>mid)update(rson,loc,val);
Pushup(rt);
}
int query(int rt,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>;
if(tr[rt<<]>=k)return query(lson,k);
else if(tr[rt<<]<k)return query(rson,k-tr[rt<<]); //左子树不够k个,则第k个一定在右子树
}
int main(){
int T,ncase=;scanf("%d",&T);
while(T--){
printf("Case %d:\n",++ncase);
int q;scanf("%d",&q);
int cnt1=,cnt2=,cnt3=;
while(q--){
int op;read(op);
if(op==){
int s,e,w;read(s);read(w);read(e);
cnt1++,cnt2++;
node1[cnt1]=Node(s,w); //node1记录开始时间
node2[cnt2]=Node(e,w); //node2记录结束时间
}else {
int now,k;read(now),read(k);
cnt3++;
d[cnt3].time=now,d[cnt3].val=k; //记录下询问数组
}
}
sort(node1+,node1++cnt1);sort(node2+,node2++cnt2); sort(d+,d++cnt3);
int p1=,p2=; //遍历‘建立’和‘删除’这两个数组的指针
memset(tr,,sizeof(tr)); //建树
for(int i=;i<=cnt3;i++){
int now=d[i].time,k=d[i].val;
while(p1<=cnt1 && node1[p1].time<=now){ //将当前时间前存活的的点插入线段树
update(,,MAX,node1[p1].val,);
p1++;
}
while(p2<=cnt2 && node2[p2].time<now){ //将当前时间前死亡的点删除线段树
update(,,MAX,node2[p2].val,-);
p2++;
}
if(tr[]<k){ puts("-1");continue; } //如果不足k个存活,直接输出-1
printf("%d\n",query(,,MAX,k));
}
}
}
Gym 102091K The Stream of Corning 2【线段树】的更多相关文章
- Gym 100507C Zhenya moves from parents (线段树)
Zhenya moves from parents 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/C Description Z ...
- The Stream of Corning 2( 权值线段树/(树状数组+二分) )
题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...
- 组队训练 K K - The Stream of Corning 2
K - The Stream of Corning 2 这个题目不是很难,因为给你的这个S是单调递增的,所以就用优先队列+权值线段树就可以很快的解决了. 这个+读入挂可以优化,不过不用也没关系. #i ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- Codeforces Gym 100513F F. Ilya Muromets 线段树
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- 【线段树】BAPC2014 E Excellent Engineers (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- K. Random Numbers(Gym 101466K + 线段树 + dfs序 + 快速幂 + 唯一分解)
题目链接:http://codeforces.com/gym/101466/problem/K 题目: 题意: 给你一棵有n个节点的树,根节点始终为0,有两种操作: 1.RAND:查询以u为根节点的子 ...
随机推荐
- Confluence 6 "Duplicate Key" 相关问题解决
如果你遇到了下面的错误信息,例如: could not insert: [bucket.user.propertyset.BucketPropertySetItem#bucket.user.prope ...
- Confluence 6 管理插件和组件
一个 组件(add-on)是与 Confluence 分开安装的功能,能够加强 Confluence 的功能和使用.插件(plugin)和 组件(add-on)这 2 个词通常是一起使用的. 一共有 ...
- Swift 中 insetBy(dx: CGFloat, dy: CGFloat) -> CGRect 用法详解
insetBy(dx: CGFloat, dy: CGFloat) -> CGRect 点击头文件进去 可以发现它是返回的一个CGRect insetBy方法是CGRect 的一个方法 dx后面 ...
- json字符串和字典的区别补充
json字符串和字典的区别:json:(JavaScript Object Notation)的首字母缩写,字面的意思是(javascript对象表示法),这里说的json指的是类似于javascri ...
- python Requests 的一些高级特性
会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能.所以 ...
- mysql中有多种存储引擎,每种引擎都有自己的特色
mysql中有多种存储引擎,每种引擎都有自己的特色. 用途: MyISAM:快读, Memory:内存数据, InnoDB:完整的事务支持 锁: MyISAM:全表锁定, Memory:全表锁定, I ...
- django配置一个网站建设
第一步: 安装数据库MySQL,也可以使用pycharm自带的数据库sqllite,大项目要使用数据库.安装请参考上篇. 数据库在pycharm中驱动设置,setting文件中修改驱动文件密码等信息. ...
- 打包谷歌浏览器 Chrome 已安装的插件
环境: OS - win7 64bit 旗舰版 Chrome - 37.0.2062.120 m 以 Smooth Gestures (一款鼠标手势插件)为例,在扩展程序面板 chrome://ext ...
- 页面布局之--Font Awesome+导航
页面布局之--Font Awesome+导航 Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果. 下载地址 ...
- 用C语言实现窗口抖动
#include "stdafx.h" #include <stdio.h> #include<Windows.h> int main() { ; //休眠 ...