Codeforces Round #595 (Div. 3)D2 . Too Many Segments (hard version)
题意:给定n个区间,问你最少删去几个区间,使得这些线段叠加的起来不超过k,请你输出删去的区间的数量和编号
思路:我们想要删去最少的区间,那么就要优先删去长区间。因为长区间影响的范围广。但是单纯的短区间优先又不行,因为可能一个短区间在中间,而两个不想交的长区间在两边,这样的话需要优先删去短区间
实现:从左往右遍历点,把所有影响某个点的区间,全部放到set里,然后优先把右区间最远的删去,因为这个区间对后面的点,影响最多。结尾把以该点为结尾的区间删去
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#define pii pair<int,int>
using namespace std;
const int maxn=2e5+5,INF=0x3f3f3f3f;
int n,k;
vector<pii> row[maxn];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
{
int l,r;
scanf("%d%d",&l,&r);
row[l].push_back({r,i});
}
set<pii> s;
vector<int> ans;
for(int i=1;i<=2e5;++i)
{
for(auto j : row[i])
s.insert(j);
while(s.size()>k)
{
auto it=s.rbegin();
ans.push_back(it->second);
s.erase(*it);
}
while(s.begin()->first==i)
s.erase(s.begin());
}
printf("%d\n",(int)ans.size());
for(auto i: ans)
printf("%d ",i);
return 0;
}
D. Alice and the Doll Codeforces Round #593 (Div. 2)
思路:模拟跑环
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#define ll long long
using namespace std;
const int maxn=1e5+5,INF=0x3f3f3f3f;
const int mod=1e9+7;
int n,m,k;
set<int> row[maxn],col[maxn];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;++i)
{
int x,y;
scanf("%d%d",&x,&y);
row[x].insert(y);
col[y].insert(x);
}
for(int i=1;i<=n;++i)
row[i].insert(0),row[i].insert(m+1);
for(int j=1;j<=m;++j)
col[j].insert(0),col[j].insert(n+1);
int x=1,y=1,dir=0;
ll cnt=1;
int min_row=1,max_row=n;
int min_col=1,max_col=m;
while(1)
{
int nx=x,ny=y;
if(dir==0)
{
nx=x;
auto it=row[x].lower_bound(y);
ny=min(*it-1,max_col);
min_row=x+1;
}
else if(dir==1)
{
ny=y;
auto it=col[y].lower_bound(x);
nx=min(*it-1,max_row);
max_col=y-1;
}
else if(dir==2)
{
nx=x;
auto it=row[x].lower_bound(y);
ny=max(*(--it)+1,min_col);
max_row=x-1;
}
else if(dir==3)
{
ny=y;
auto it=col[y].lower_bound(x);
nx=max(*(--it)+1,min_row);
min_col=y+1;
}
cnt+=1ll*abs(nx-x)+1ll*abs(ny-y);
if(nx==x&&ny==y)
{
if(!(x==1&&y==1&&dir==0))
break;
}
dir=(dir+1)%4;
x=nx,y=ny;
}
if(cnt+k==1ll*n*m)
printf("Yes\n");
else
printf("No\n");
return 0;
}