Codeforces 1462F The Treasure of The Segments
题意
给\(n(1\leq n\leq 2*10^5)\)个线段$[l_i,r_i] (1≤l_i≤r_i≤10^9) $,问最少删除几个线段,使得剩下线段中,有至少一个线段与所有线段相交。
分析
对于线段相交且在线段端点数据范围很大的情况下,第一想法是离散化。
如果枚举一个线段和其他所有线段判交,时间复杂度是\(O(n^2)\),显然是无法接受的,考虑如何优化。
对于一个左端点为\(l_i\),右端点为\(r_i\)的线段,我们可以考虑,若有另一个具有相同左端点,右端点为\(r\),且\(r>r_i\)的线段,取另一个线段作为交线段更优。
那么我们可以考虑枚举左端点,以上述最大的\(r\)为右端点判交,但若是还与其他所有线段判交,时间复杂度仍然是\(O(n^2)\)。
再次考虑优化,由于我们做法是枚举左端点\(i\),那么随着左端点增大,相交的线段也会变化,我们考虑这个变化量,将线段排序,这样可以保证在右端点增大时,新增线段在数组中是连续的,这样即可考虑双指针。
在之前的所取集合中,大部分线段是仍然可以与当前线段相交的,而无法相交的是右端点为\(i-1\)的线段,所以当一条线段加入集合中,在其\(r_i\)上做一个标记,遍历到时减去数字即可。
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define ull unsigned long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
#define rep(z, x, y) for(int z=x;z<=y;++z)
#define repd(z, x, y) for(int z=x;z>=y;--z)
#define com bool operator<(const node &b)const
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
const int maxn = (ll) 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
int T = 1;
int sum[maxn];
pii a[maxn];
int r[maxn];
void solve() {
int n;
cin >> n;
vector<int> v;
rep(i, 1, n) {
cin >> a[i].first >> a[i].second;
v.push_back(a[i].first);
v.push_back(a[i].second);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
rep(i, 0, v.size())r[i] = sum[i] = 0;
rep(i, 1, n) {
a[i].first = lower_bound(v.begin(), v.end(), a[i].first) - v.begin() + 1;
a[i].second = lower_bound(v.begin(), v.end(), a[i].second) - v.begin() + 1;
r[a[i].first] = max(r[a[i].first], a[i].second);
}
sort(a + 1, a + n + 1);
int now = 0;
int ans = 1;
int pos = 1;
rep(i, 0, v.size()) {
now -= sum[i - 1];
while (pos <= n) {
if (a[pos].first <= r[i]) {
++sum[a[pos].second];
++pos;
++now;
} else
break;
}
ans = max(ans, now);
}
cout << n - ans << '\n';
}
signed main() {
start;
cin >> T;
while (T--)
solve();
return 0;
}
Codeforces 1462F The Treasure of The Segments的更多相关文章
- Educational Codeforces Round 6 F. Xors on Segments 暴力
F. Xors on Segments 题目连接: http://www.codeforces.com/contest/620/problem/F Description You are given ...
- CodeForces:#448 div2 B. XK Segments
传送门:http://codeforces.com/contest/895/problem/B B. XK Segments time limit per test1 second memory li ...
- Educational Codeforces Round 112 E、Boring Segments
原题网址 https://codeforces.com/contest/1555/problem/E 题目大意 有n个区间.每个区间是[1,m]的子区间.从a可以一步走到b的充要条件是存在区间同时覆盖 ...
- CodeForces 289A Polo the Penguin and Segments (水题)
题意:给你 n 段区间,而且还是不相交的,然后你只能向左扩展左端点,或者向右扩展右端点,然后扩展最少的步数让整数总数能够整除 k. 析:很简单么,只要在记录算一下数量,然后再算出 k 的倍数差多少就行 ...
- 【Codeforces 494A】Treasure
[链接] 我是链接,点我呀:) [题意] 让你把"#"用至少一个右括号代替 使得整个括号序列合法 [题解] 首先我们不要考虑井号 考虑最简单的括号序列 并且把左括号看成1,右括号看 ...
- 【Codeforces 979B】Treasure Hunt
[链接] 我是链接,点我呀:) [题意] 每次你可以将一个字符变成一个不同于本身的字符. 每个人需要改变n次(且不能不改变) 设每个人的字符串中出现次数最多的字符出现的次数为cnt[0~2] 问你谁的 ...
- CodeForces - 1214D D. Treasure Island
题目链接:https://vjudge.net/problem/2728294/origin 思路:可以抽象成管道,先试试能不能找到一个通道能通到终点, 如果可以则封锁这个通道,一个石头即可, 再试试 ...
- CF1462-F. The Treasure of The Segments
题意: 给出n个线段组成的集合,第i个线段用 \(\{l_i, r_i\}\) 表示线段从坐标轴的点\(l_i\)横跨到点\(r_i\).现在你可以删除其中的一些线段,使得剩下的线段组成的集合中至少存 ...
- D - Nested Segments CodeForces - 652D (离散化+树桩数组)
D - Nested Segments CodeForces - 652D You are given n segments on a line. There are no ends of some ...
- Codeforces Round #690 (Div. 3)
第一次 ak cf 的正式比赛,不正式的是寒假里 div4 的 Testing Round,好啦好啦不要问我为什么没有 ak div4 了,差一题差一题 =.= 不知不觉已经咕了一个月了2333. 比 ...
随机推荐
- 【故障公告】博客站点一台阿里云负载均衡被DDoS攻击
13:06 收到阿里云的电话与邮件通知,博客站点的一台阿里云负载均衡因被 DDoS 攻击被关进黑洞(所有访问被屏蔽),部分用户的访问受影响,由此给您带来麻烦,请您谅解. 您的IP:x.x.x.x 实例 ...
- upload-labs 第一关 前端验证绕过!
打开靶场发现只能上传jpg png gif 的文件格式的文件,我们想要上传上去的文件格式为php文件格式,首先在Notepad++里面打开图片,会出现很多乱码,我们在最后面添加漏洞语句<?php ...
- 入门 Python GUI 开发的第一个坑
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 使用 Anaconda 3(conda 4.5.11)的 tkinter python 包(c ...
- STL-priority_queue(ACM)
1.无法访问v.front().v.back() 2.是一个 堆,默认为大根堆,改造后为小根堆 大根堆 重构函数(默认)(大根堆) priority_queue<int> v; 基本操作 ...
- Python实现猜拳小游戏的多种方式
简介 猜拳小游戏是一个经典的小游戏项目,也是初学者学习编程的必要练手题目之一.在 Python 中,我们可以使用多种方式来实现一个简单的猜拳小游戏. 本文将依次介绍六种Python实现猜拳小游戏的方法 ...
- .Net7矢量化的性能优化
前言 矢量化是性能优化的重要技术,也是寄托硬件层面的优化技术.本篇来看下. 概括 一:矢量化支持的问题: 矢量化的System.Runtime.Intrinsics.X86.Sse2.MoveMask ...
- 从n个不同元素中有放回的取出r个且不计顺序,有多少种不同的取法?
从n个不同元素中有放回的取出r个且不计顺序,有多少种不同的取法? 答案是:\(C_{n+r-1}^r\) 解析 因为是有放回地取出,所以同一个元素可能会被取多次,并且取出的元素是不计顺序的,那么如果我 ...
- AGC019F Yes or No
题意 有 \(N+M\) 个问题,其中有 \(N\) 个问题的答案是 YES,\(M\) 个问题的答案是 NO.当你回答一个问题之后,会知道这个问题的答案,求最优策略下期望对多少.答案对 \(9982 ...
- Terraform 系列-使用 for-each 对本地 json 进行迭代
系列文章 Terraform 系列文章 Grafana 系列文章 概述 前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terr ...
- php屏蔽非正常访问和检测用户登录检测
<?phpnamespace Manage\Controller;use Common\Controller\DefaultController;class BaseController ext ...