CodeForces 863E Turn Off The TV 思维,扫描线
Posted 掉血菜鸡煮熟中
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 863E Turn Off The TV 思维,扫描线相关的知识,希望对你有一定的参考价值。
题意:有 n 台电视,每台电视会在 [li, ri] 时间段工作。要你找出一台空闲的电视,空闲定义:设有任意一台电视在工作的总时间为 sum,把第 i 台电视删去, sum 不会减少,则第 i 台电视是空闲的。
tags:想不出来,看了题解。。还是挺有意思的题
要找一台空闲的电视,反过来想这台电视如果不空闲,那么在它的工作时间段内至少要有一个时间点是只被一个区间覆盖的。
所以,我们先离散化处理一下,再类似扫描线处理出每个要用到的时间点被多少个区间覆盖了。
然后再用一个前缀数组 pre[] 处理出只被一个区间覆盖的点的前缀情况,具体处理是: pre[i] = pre[i-1] + (第 i 个时间点是否只被一个区间覆盖) 。
坑点: 对于区间 [l, r] ,点 l-1, r+1 都要用到,也要加上。 数组要最少要开到 4 倍。
另记: vector 去重, ve.erase(unique(ve.begin(), ve.end()), ve.end());
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 1000005; vector<int > ve; int n, l[N], r[N], il[N], ir[N]; int sum[N], pre[N]; int main() { scanf("%d", &n); rep(i,1,n) { scanf("%d%d", &l[i], &r[i]); ve.PB(l[i]); ve.PB(r[i]); ve.PB(l[i]-1); ve.PB(r[i]+1); } sort(ve.begin(), ve.end()); ve.erase(unique(ve.begin(), ve.end()), ve.end()); int sz = ve.size(); rep(i,1,n) { il[i] = lower_bound(ve.begin(), ve.end(), l[i]) - ve.begin() + 1; ir[i] = lower_bound(ve.begin(), ve.end(), r[i]) - ve.begin() + 1; ++sum[il[i]]; --sum[ir[i]+1]; } rep(i,1,sz) { sum[i] += sum[i-1]; pre[i] = pre[i-1] + (sum[i]==1); } rep(i,1,n) if(pre[ir[i]]-pre[il[i]-1] == 0) { return 0*printf("%d\n", i); } puts("-1"); return 0; }
以上是关于CodeForces 863E Turn Off The TV 思维,扫描线的主要内容,如果未能解决你的问题,请参考以下文章
E. Turn Off The TV Educational Codeforces Round 29
JPEG NSData of phototurn UIImage turn JPEG is完全不同的大小
Codeforces 872B:Maximum of Maximums of Minimums(思维)
CodeForces 625B War of the Corporations
(KMPdp)Codeforces Educational Codeforces Round 21 G-Anthem of Berland