题意:
给你几个tv的l,r。让你找有么有去掉这个tv,这个区间还是有tv在播放。
求出任意一个即可,或者没有输出-1。
POINT:
离散化,离散化要加点。
化线成点。把线化成两个端点,cnt[l]++,cnt[r+1]--。
那么cnt前缀和就代表这一个点重复了几次。
用pre再来一个前缀和,一个点只存在一次的时候,+1.
那么区间和就代表这个区间有几个只存在一次的点。
如果是0,则可以去掉这个区间。
否则继续往下找。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn = 1000000;
int cnt[maxn];
int s[maxn];
struct node
{
int l,r;
}len[maxn];
int main()
{
int n;
scanf("%d",&n);
int num=0;
for(int i=1;i<=n;i++){
scanf("%d %d",&len[i].l,&len[i].r);
s[++num]=len[i].l;
s[++num]=len[i].r;
s[++num]=len[i].l-1;
s[++num]=len[i].r+1;
}
sort(s+1,s+1+num);
int m=1;
for(int i=2;i<=num;i++){
if(s[i-1]!=s[i]) s[++m]=s[i];
}
for(int i=1;i<=n;i++){
len[i].l=(int)(lower_bound(s+1,s+1+m,len[i].l)-s);
len[i].r=(int)(lower_bound(s+1,s+1+m,len[i].r)-s);
cnt[len[i].l]++;
cnt[len[i].r+1]--;
}
int pre[maxn];
for(int i=1;i<=m;i++){
cnt[i]+=cnt[i-1];
}
for(int i=1;i<=m;i++){
pre[i]+=pre[i-1]+(cnt[i]==1);
}
int ans=0;
for(int i=1;i<=n;i++){
int l=len[i].l;
int r=len[i].r;
int flag=pre[r]-pre[l-1];
if(!flag){
ans=i;
break;
}
}
if(ans) printf("%d\n",ans);
else printf("-1\n");
}