专栏文章

题解:P11512 [ROIR 2017 Day 2] 力场

P11512题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqkt4ca
此快照首次捕获于
2025/12/04 06:26
3 个月前
此快照最后确认于
2025/12/04 06:26
3 个月前
查看原文

外话

比赛时思考许久,赛后一看,求的是面积交,不是面积并,同时一百分。

正题

1.性质

      \ \ \ \ \ \ 观察样例可以发现,面积并实际上是min(xi)min(yi)min(x_i)*min(y_i)

2.思路

      \ \ \ \ \ \ 根据这个性质,我们可以将xx从大到小排序,以此枚举min(xi)min(x_i)。这时,只有xmin(xi)x\ge min(x_i)的矩形才能选,然后在这些矩形中选前kk大的yy(此时的min(yi)min(y_i)就是第kk大的yy)。这时问题已经转化为动态维护第kk大。

3.维护方法

      \ \ \ \ \ \ 用一个小根堆,先将前kk个数插进去,插入一个数时直接pushpush进小根堆,再把此时的最小值删去,这时的堆顶就是第kk小。

4.代码

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200005;
struct node{
	int x,y;
} a[N];
bool cmp(node a,node b){
	return a.x>b.x;
}
priority_queue<int,vector<int>,greater<int> > q;
signed main(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=k;i++) q.push(a[i].y);//前k个数入堆
	int ans=a[k].x*q.top();
	for(int i=k+1;i<=n;i++){//枚举min(xi)
		q.push(a[i].y);
		q.pop();
		ans=max(ans,a[i].x*q.top());//累计答案
	}
	cout<<ans;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...