轻院校赛

//zzuli 1877
//关于区间覆盖很巧妙地一种用法, 这是参考一位大牛的博客写的, 目前本人还是处于菜鸟阶段。。。
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<ctype.h> #include<algorithm> using namespace std; #define N 100100 #define INF 0x3f3f3f3f int a[N]; int l[N], r[N]; int vis[N], num[N], sum[N]; int ans[N]; int main() { int T, n, m, cnt, k; scanf("%d", &T); while(T--) { memset(a, 0, sizeof(a)); memset(vis, 0, sizeof(vis)); memset(num, 0, sizeof(num)); memset(sum, 0, sizeof(sum)); scanf("%d%d", &n, &m); for(int i=0; i<m; i++) { scanf("%d%d", &l[i], &r[i]); vis[l[i]]++; vis[r[i]+1]--; } int s=0; for(int i=0; i<=n; i++) { s+=vis[i]; num[i]=s; } for(int i=0; i<=n; i++) { if(num[i]>=2) sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]; } cnt=0; k=0; for(int i=0; i<m; i++) if(sum[r[i]]-sum[l[i]-1]==r[i]-l[i]+1) { cnt++; ans[k++]=i+1; } printf("%d ", cnt); for(int i=0; i<k; i++) printf("%d%c", ans[i], i==k-1 ? ' ' : ' '); } return 0; }
原文地址:https://www.cnblogs.com/9968jie/p/5407941.html