Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并
Pavel is going to make a game of his dream. However, he knows that he can't make it on his own so he founded a development company and hired n workers of staff. Now he wants to pick n workers from the staff who will be directly responsible for developing a game.
Each worker has a certain skill level vi. Besides, each worker doesn't want to work with the one whose skill is very different. In other words, the i-th worker won't work with those whose skill is less than li, and with those whose skill is more than ri.
Pavel understands that the game of his dream isn't too hard to develop, so the worker with any skill will be equally useful. That's why he wants to pick a team of the maximum possible size. Help him pick such team.
The first line contains a single integer n (1 ≤ n ≤ 105) — the number of workers Pavel hired.
Each of the following n lines contains three space-separated integers li, vi, ri (1 ≤ li ≤ vi ≤ ri ≤ 3·105) — the minimum skill value of the workers that the i-th worker can work with, the i-th worker's skill and the maximum skill value of the workers that the i-th worker can work with.
In the first line print a single integer m — the number of workers Pavel must pick for developing the game.
In the next line print m space-separated integers — the numbers of the workers in any order.
If there are multiple optimal solutions, print any of them.
4
2 8 9
1 4 7
3 6 8
5 8 10
3
1 3 4
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18+1LL;
const double Pi = acos(-1.0);
const int N = 5e5+, M = 2e5+, mod = 1e9+, inf = 2e9; int n;
int tag[N*],mx[N*];
void push_up(int i) {
mx[i] = max(mx[ls],mx[rs]);
}
void push_down(int i,int ll,int rr) {
if(tag[i] != && ll != rr) {
tag[ls] += tag[i];
tag[rs] += tag[i];
mx[ls] += tag[i];
mx[rs] += tag[i];
tag[i] = ;
}
}
void update(int i,int ll,int rr,int l,int r,int v)
{
push_down(i,ll,rr);
if(l == ll && r == rr) {
tag[i] += v;
mx[i] += v;
return ;
}
if(r <= mid) update(ls,ll,mid,l,r,v);
else if(l > mid) update(rs,mid+,rr,l,r,v);
else {
update(ls,ll,mid,l,mid,v);
update(rs,mid+,rr,mid+,r,v);
}
push_up(i);
} int query(int i,int ll,int rr,int x) {
push_down(i,ll,rr);
if(ll == rr) return ll;
if(mx[ls] == x) return query(ls,ll,mid,x);
else return query(rs,mid+,rr,x);
push_up(i);
}
struct ss{
int l,r,h,in;
ss(int l = , int r = , int h = ,int in = ) : l(l), r(r), h(h),in(in) {}
bool operator < (const ss & b) const {
return h < b.h || h == b.h && in > b.in;
}
}p[N],P[N];
int main() {
scanf("%d",&n);
for(int i = ; i <= n; ++i) {
int l,v,r;
scanf("%d%d%d",&l,&v,&r);
p[i] = ss(l,v,v,);
p[i+n] = ss(l,v,r,-);
P[i] = ss(l,r,v,);
}
int m = n << ;
sort(p+,p+m+);
int ans = ,x,y;
for(int i = ; i <= m; ++i) {
int l = p[i].l, r = p[i].r;
update(,,,l,r,p[i].in);
if(mx[] > ans) {
ans = mx[];
x = query(,,,mx[]);
y = p[i].h;
}
}
printf("%d\n",ans);
for(int i = ; i <= n; ++i) {
if(P[i].l <= x && P[i].r >= y && P[i].h >= x && P[i].h <= y) printf("%d\n",i);
}
return ;
}
Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并的更多相关文章
- Codeforces Round #222 (Div. 1) D. Developing Game
D - Developing Game 思路:我们先枚举左边界,把合法的都扣出来,那么对于这些合法的来说值有v 和 r两维了,把v, r看成线段的两端, 问题就变成了,最多能选多少线段 使得不存在这样 ...
- Codeforces Round #603 (Div. 2) E. Editor(线段树)
链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...
- Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq
B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...
- Codeforces Round #530 (Div. 2) F (树形dp+线段树)
F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...
- Codeforces Round #222 (Div. 1) D. Developing Game 扫描线
D. Developing Game 题目连接: http://www.codeforces.com/contest/377/problem/D Description Pavel is going ...
- Codeforces Round #546 (Div. 2) E 推公式 + 线段树
https://codeforces.com/contest/1136/problem/E 题意 给你一个有n个数字的a数组,一个有n-1个数字的k数组,两种操作: 1.将a[i]+x,假如a[i]+ ...
- Codeforces Round #275 Div.1 B Interesting Array --线段树
题意: 构造一个序列,满足m个形如:[l,r,c] 的条件. [l,r,c]表示[l,r]中的元素按位与(&)的和为c. 解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的 ...
- Codeforces Round #271 (Div. 2) F. Ant colony 线段树
F. Ant colony time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Codeforces Round #406 (Div. 2) D. Legacy (线段树建图dij)
D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
随机推荐
- C#之字符串篇
大杂烩 一.类型转换 字符串转整形: int a = int.Parse(""); //不能转换null int b = Convert.ToInt32("&quo ...
- 使用n2n在没有公网IP条件下访问树莓派
实现:在树莓派2和客户机都没有公网IP条件下实现远程访问控制 不足:暂时没实现网页代理 因为校园网环境没有公网IP,无法直接访问树莓派.之前有想过SSH反向代理:使用VPN,ddns(花生壳.no-i ...
- LoadRunner 函数之 web_add_cookie
简单示例: Action() { // 添加cookie web_add_cookie("is_login=True;path=/;domain=10.1.102.75"); // ...
- python Windows下的android设备截图工具
目录 界面版 命令行版 界面版 利用python的wx库写个ui界面,用来把android设备的截图输出到电脑屏幕,前提需要安装adb,涉及到的python库也要安装.代码如下: #!/usr/bin ...
- [Nhibernate]对象状态
目录 写在前面 文档与系列文章 对象状态 瞬时态(Transient) 持久态(Persistent) 托管态(Detached) 对象状态转换 总结 写在前面 前面两篇文章介绍了SchemaExpo ...
- asp.net core 使用EF7 Code First 创建数据库,同时使用命令创建数据库
1.首先下载vs2015的Asp.Net Core(RC2)的插件工具(https://www.microsoft.com/net/core#windows)2.创建一个asp.net Core的项目 ...
- Bash 中的 _ 是不是环境变量
首先,我们想到的会是 export(等价于 declare -x)命令: $ export | grep 'declare -x _=' 没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则 ...
- 【译文】Java Logging
本文讲Java内置的java.util.logging软件包中的 api.主要解释怎样使用该api添加logging到你的application中,怎样加配置它等.但是本文不谈你应该把什么东西写到日志 ...
- 编译器 cc、gcc、g++、CC 的区别
gcc 是GNU Compiler Collection,原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C.C++.Objective-C.Ada.Fort ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...