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为根节点的子 ...
随机推荐
- LeetCode(114): 二叉树展开为链表
Medium! 题目描述: 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路: 这 ...
- java易错题----静态方法的调用
class A{ public static String s="A.s"; } class B extends A{ public static String s="B ...
- cf1110E 思维
/* Ci'=Ci+1 + Ci-1 -Ci Ci+1 - Ci' = Ci - Ci-1 Ci' - Ci-1 = Ci+1 - Ci; 即求一次Ci’等价于交换Ci和Ci-1 与 Ci+1和Ci的 ...
- js中的“==”和“===”的区别
简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...
- Java+selenium之WebDriver定位页面元素(二)
Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法: 单个对象的定位方法,多个对象的定位方法和层级定位 1. 定位单个元素 // 对于元素的属性包含 id 的情况适用,推 ...
- Controller中方法返回值其他类型需要添加jackson依赖
第一个 第二个: 第三个 https://www.cnblogs.com/codejackanapes/p/5569013.html:json的博客园 springmvc默认的是:2.Jackson: ...
- SpringMVC之使用ResponseEntity,java接口返回HttpStatus
Post请求 一般情况下,在非必须的情况下,使用Jquery实现post请求,而后台返回一般都需要手动封装ResponseUtil,和使用@ResponseBody注解来实现返回.然而我们书上学到的关 ...
- css解决td单元格内文字溢出
<table>标签加样式:table-layout:fixed;(一定要加,否则下面定义的td的样式都不起作用了) <td>加样式:overflow:hidden;text-o ...
- 有道词典Linux版下载安装
http://cidian.youdao.com/index-linux.html Ubuntu http://codown.youdao.com/cidian/linux/youdao-dict_1 ...
- vi不保存退出
To quit the vi editor without saving any changes you've made If you are currently in insert or appen ...