ZOJ 3953:Intervals(优先队列+思维)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5572
题意:给出n个线段,问最少删除几个线段可以使得任意一个点不会被三个以上的线段覆盖。
思路:首先离散化坐标。
然后想着按右端点从小到大排序后直接O(n)扫的贪心,但是后面发现错误了。
应该按左端点从小到大排序,然后用一个优先队列(按右端点从大到小排序)。
开始扫坐标,当有与该坐标相同的点的左端点就进队,用ed[]记录右端点的位置。
用cnt记录当前这个点有多少个区间覆盖,当cnt>=3的时候就出队更新。
#include <bits/stdc++.h>
using namespace std;
#define N 50010
struct node {
int l, r, id;
node () {}
node (int l, int r, int id) : l(l), r(r), id(id) {}
bool operator < (const node &rhs) const {
if(r != rhs.r) return r < rhs.r;
return l < rhs.l;
}
} seg[N];
vector<int> ans;
priority_queue<node> que;
int ed[N*], p[N*];
bool cmp(const node &a, const node &b) {
if(a.l != b.l) return a.l < b.l;
return a.r < b.r;
}
int main() {
int t; scanf("%d", &t);
while(t--) {
int n, u, v; scanf("%d", &n);
ans.clear(); memset(ed, , sizeof(ed));
while(!que.empty()) que.pop();
int cnt = , now = , num = ;
for(int i = ; i < n; i++) scanf("%d%d", &u, &v), seg[i] = node(u, v, i + ), p[cnt++] = u, p[cnt++] = v;
sort(seg, seg + n, cmp); sort(p, p + cnt);
cnt = unique(p, p + cnt) - p;
for(int i = ; i < n; i++)
seg[i].l = lower_bound(p, p + cnt, seg[i].l) - p,
seg[i].r = lower_bound(p, p + cnt, seg[i].r) - p; for(int i = ; i < cnt && now < n; i++) {
while(seg[now].l == i && now < n) {
num++;
ed[seg[now].r + ]++; // 线段的终点
que.push(seg[now++]);
}
num -= ed[i]; // 离开了某线段的范围
while(num >= ) {
node tmp = que.top(); que.pop();
num--; ed[tmp.r + ]--; // 这个线段被删除
ans.push_back(tmp.id);
}
}
printf("%d\n", ans.size()); sort(ans.begin(), ans.end());
for(int i = ; i < ans.size(); i++) printf("%d%c", ans[i], i + == ans.size() ? '\n' : ' ');
}
return ;
}
ZOJ 3953:Intervals(优先队列+思维)的更多相关文章
- ZOJ - 3953 Intervals 【贪心】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3953 题意 给出N个区间,求去掉某些区间,使得剩下的区间中,任何 ...
- ZOJ 3953 Intervals
线段树,排序. 按照$R$从小到大排序之后逐个检查,如果$L$,$R$最大值不超过$2$,那么就把这个区间放进去,区间$+1$,否则不能放进去. #include<bits/stdc++.h&g ...
- Intervals ZOJ - 3953 (区间贪心)
Chiaki has n intervals and the i-th of them is [li, ri]. She wants to delete some intervals so that ...
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals(差分约束+spfa 求最长路径)
题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...
- POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra
传送门: http://poj.org/problem?id=1511 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1008 ...
- ZOJ 4124 拓扑排序+思维dfs
ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感 ...
- ZOJ 3865 Superbot(优先队列--模板)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5477 主要思路:1.从一个点(cur)到它相邻的点(next),所需 ...
- zoj 3778 Talented Chef(思维题)
题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...
- ZOJ 649 Rescue(优先队列+bfs)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- Plupload上传实例《模仿微云上传实例》,带源码
Plupload上传实例<模仿微云上传实例>,带源码,作者:鱼塘总裁 如有疑问,加群交流:646104701 一.实例截图 1.上传过程 2.上传成功 3.上传失败 4.最小化 二.所需文 ...
- ARC forbids explicit message send of'retain'解决办法
项目中导入一些开源的类库,里面会爆出一些ARC forbids explicit message send of'retain' 这种问题 解决方法: 点击项目Target -> 找到" ...
- iOS-HTTP浅析
HTTP原理 什么是URL URL中常见的几种协议 什么是HTTP协议 HTTP是做什么的 为什么要使用HTTP协议 HTPP协议的通信过程介绍 HTTP请求 HTTP响应 HTTP请求的选择 两种发 ...
- 匹配中文字符的正则表达式: [/u4e00-/u9fa5]
原文:匹配中文字符的正则表达式: [/u4e00-/u9fa5] 这里是几个主要非英文语系字符范围(google上找到的): 2E80-33FFh:中日韩符号区.收容康熙字典部首.中日韩辅助部首.注音 ...
- C#图片保存与读取,以及图片另存
照片的保存与读取 /// <summary> /// 图片转二进制 /// </summary> /// <param name="imgPhoto" ...
- Mac OS启动服务优化高级篇(launchd tuning)禁用某些服务
http://kenwublog.com/mac-os-launchd-tuning Mac下的启动服务主要有三个地方可配置:1,系统偏好设置->帐户->登陆项2,/System/Libr ...
- Unicode对象
什么是Unicode对象呢? 你可以认为unicode对象就是一个Python字符串,它可以处理上百万不同类别的字符——从古老版本的Latin字符到非Latin字符,再到曲折的引用和艰涩的符号. 普通 ...
- 改善C#程序的建议8:避免锁定不恰当的同步对象
原文:改善C#程序的建议8:避免锁定不恰当的同步对象 在C#中让线程同步的另一种编码方式就是使用线程锁.所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源.可以用下面这句不是那么 ...
- UWP ListView嵌套ListView
要求:加载全部的订单,每个订单里面有一个或者多个产品,在列表中要展现出来, 1. xaml界面 步骤:1.这里使用的是x:bind绑定所以要引入实体类命名空间(OrderList集合中类的命名空间): ...
- Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)
Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机 ...