D - Developing Game

思路:我们先枚举左边界,把合法的都扣出来,那么对于这些合法的来说值有v 和 r两维了,把v, r看成线段的两端,

问题就变成了,最多能选多少线段 使得不存在这样两条(l1 r1)  (l2 r2) l2 > r1,我们把线段l1 r1 看成二维平面内的点(l1, r1)

那么答案就变成了分别在(1, 1),  (2, 2),  (3, 3),  (4, 4), ....., (n, n)的左上的点的个数的最大值,我们用这个建

线段树然后就变成了区间加减问题。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = 3e5 + ;
const int M = 1e7 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = ; int n;
struct segmentTree {
int mx[N << ], lazy[N << ], id[N << ]; void pushdown(int rt) {
if(lazy[rt]) {
lazy[rt << ] += lazy[rt];
lazy[rt << | ] += lazy[rt];
mx[rt << ] += lazy[rt];
mx[rt << | ] += lazy[rt];
lazy[rt] = ;
}
} void pushup(int rt) {
if(mx[rt << ] >= mx[rt << | ]) {
mx[rt] = mx[rt << ];
id[rt] = id[rt << ];
} else {
mx[rt] = mx[rt << | ];
id[rt] = id[rt << | ];
}
} void build(int l, int r, int rt) {
mx[rt] = lazy[rt] = ;
if(l == r) {
id[rt] = l;
return;
}
int mid = l + r >> ;
build(l, mid, rt << );
build(mid + , r, rt << | );
pushup(rt);
} void update(int L, int R, int val, int l, int r, int rt) {
if(l >= L && r <= R) {
mx[rt] += val;
lazy[rt] += val;
return;
}
int mid = l + r >> ;
pushdown(rt);
if(L <= mid) update(L, R, val, l, mid, rt << );
if(R > mid) update(L, R, val, mid + , r, rt << | );
pushup(rt);
}
} seg; struct node {
int l, v, r, id;
bool operator < (const node &rhs) const {
return l < rhs.l;
}
} a[N]; int main() {
seg.build(, , );
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d%d%d", &a[i].l, &a[i].v, &a[i].r), a[i].id = i;
sort(a + , a + + n); int ans = , ret1, ret2;
priority_queue<PII, vector<PII>, greater<PII> > que;
for(int i = , j = ; i <= ; i++) { while(j <= n && a[j].l <= i) {
int x = a[j].v, y = a[j].r;
que.push(mk(x, y));
seg.update(x, y, , , , );
j++;
} while(!que.empty() && que.top() < mk(i, )) {
PII now = que.top(); que.pop();
seg.update(now.fi, now.se, -, , , );
} if(ans < seg.mx[]) {
ans = seg.mx[];
ret1 = i;
ret2 = seg.id[];
}
} vector<int> vec;
for(int i = ; i <= n; i++) {
if(a[i].l <= ret1 && a[i].v >= ret1 && a[i].v <= ret2 && a[i].r >= ret2)
vec.push_back(a[i].id);
} sort(vec.begin(), vec.end());
printf("%d\n", vec.size());
for(int i = ; i < vec.size(); i++)
printf("%d ", vec[i]);
puts("");
return ;
} /*
*/

Codeforces Round #222 (Div. 1) D. Developing Game的更多相关文章

  1. Codeforces Round #222 (Div. 1) D. Developing Game 扫描线

    D. Developing Game 题目连接: http://www.codeforces.com/contest/377/problem/D Description Pavel is going ...

  2. Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并

    D. Developing Game   Pavel is going to make a game of his dream. However, he knows that he can't mak ...

  3. Codeforces Round #322 (Div. 2) C. Developing Skills 优先队列

    C. Developing Skills Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/p ...

  4. Codeforces Round #222 (Div. 1) C. Captains Mode 对弈+dp

    题目链接: http://codeforces.com/contest/378/problem/E 题意: dota选英雄,现在有n个英雄,m个回合,两支队伍: 每一回合两个选择: b 1,队伍一ba ...

  5. Codeforces Round #222 (Div. 1) C. Captains Mode 状压

    C. Captains Mode 题目连接: http://codeforces.com/contest/377/problem/C Description Kostya is a progamer ...

  6. Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树

    B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...

  7. Codeforces Round #222 (Div. 1) A. Maze dfs

    A. Maze 题目连接: http://codeforces.com/contest/377/problem/A Description Pavel loves grid mazes. A grid ...

  8. Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)

    题目链接:http://codeforces.com/problemset/problem/377/A 题解: 有tot个空格(输入时统计),把其中k个空格变为wall,问怎么变才能使得剩下的空格依然 ...

  9. Codeforces Round #222 (Div. 1) (ABCDE)

    377A Maze 大意: 给定棋盘, 保证初始所有白格连通, 求将$k$个白格变为黑格, 使得白格仍然连通. $dfs$回溯时删除即可. #include <iostream> #inc ...

随机推荐

  1. openstack身份认证与API请求流程

    一.概况 1. 请求认证token时,需发送的认证信息包括: 2. 如果认证成功,会获得认证token 3. 在发送的API请求中将认证token填入X-Auth-Token字段.可以一直使用这个认证 ...

  2. Linux下打包压缩war和解压war包 zip和jar

    ============jar================= 把当前目录下的所有文件打包成game.warjar -cvfM0 game.war ./ -c   创建war包-v   显示过程信息 ...

  3. jdbc:oracle:thin:@localhost:1521:orcl和jdbc:oracle:thin:@localhost:1521/orcl的区别

      Oracle Thin JDBC Driver 驱动程序包名:ojdbc14.jar.ojdbc6.jar 驱动程序类名: oracle.jdbc.driver.OracleDriver JDBC ...

  4. codevs 1491 取物品

    1491 取物品 http://codevs.cn/problem/1491/  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description 现在有n个物品(有可能 ...

  5. 用Matlab实现字符串分割(split)

    用Matlab实现字符串分割(split)Posted on 2011/08/08 Matlab的字符串处理没有C#强大,本身又没有提供OO特性,需要依赖别的手段完成这项任务. 我们在这里借助正则表达 ...

  6. 【STSRM13】绵津见

    [算法]扫描线:差分+树状数组 [题意]转化模型后:求每个矩形覆盖多少点和每个点被多少矩形覆盖.n<=10^5. [题解]经典的扫描线问题(二维偏序,二维数点). 数点问题 将所有询问离线并离散 ...

  7. 原创:HTML 头像截取上传 JS+PHP 整合包~

    关于: 关于头像上传这个东西,网上一搜乱七八糟的一堆然而很少很少有自己中意的插件一怒之下就自己写一个... 用法: <!DOCTYPE html> <html lang=" ...

  8. String类的一些常用操作方法

    package com.liveyc.framework.util; import java.io.UnsupportedEncodingException; import java.net.URLD ...

  9. Spring Boot微服务框架的搭建

    (1)spring boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  10. c++刷题(6/100)最长上升子序列

    题目一:区间子数组个数 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = ...