Too Many Segments (hard version) 贪心+set使用

mac2025-01-15  44

题目链接 ---> https://codeforces.com/contest/1249/problem/D2

大致题意:给n条线段,每条线段都覆盖他们所包含的点。问最少删除掉几条线段以至所有点中没有被覆盖的次数大于k的点

题解:遍历每个点,如果某个点被覆盖次数大于k了,那么便将覆盖该点的最长的多余条数删去即可。

#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; const int mx=2e5+20; struct node{ int y, id; }ans[mx]; vector<node>v[mx]; set<node>s; bool operator < (node a, node b){ if(a.y == b.y) return a.id < b.id; return a.y < b.y; } int a[mx]; int main(){ int n, k; scanf("%d%d",&n,&k); for(int i=1; i<=n; i++){ node t; int a, b; scanf("%d%d",&a,&b); t.id = i; t.y = b; v[a].push_back(t); } int cnt=0; for(int i=1; i<mx; i++){ while(s.size()&&(*s.begin()).y<i) s.erase(*s.begin()); for(int j=0; j<v[i].size(); j++) s.insert(v[i][j]); while(s.size()>k){ ans[++cnt] = *s.rbegin(); s.erase(*s.rbegin()); } } printf("%d\n",cnt); for(int i=1; i<=cnt; i++){ printf("%d%c",ans[i].id,i==cnt?'\n':' '); } return 0; }

 

最新回复(0)