zoukankan      html  css  js  c++  java
  • TCO SRM778 DIV1 KRECTANGLEINTERSECTION 贪心,最大矩形交,最大线段交

    TCO SRM778 DIV1 KRECTANGLEINTERSECTION

    题意

    给n个矩形(n<=200)选k个矩形求他们的交的面积,求最大面积

    思路

    一开始看错题写个扫描线过不了样例。。
    我们可以考虑在一维情况下的问题:选取k个线段使得线段的交最大如何实现。首先我们对于线段由左端点排序。对于一个左端点x来说,左端点小于等于它并且右端点大于等于它的所有线段,我们为了方便记为多重集合S,我们按照右端点对S进行排序,由于要取交,假设你选择对应x的右端点y来说,在集合S里面要选k个值是大于等于y的,要求把y最大化,如果最大化呢 只要取最大的k个里面最小的那一个就行了。这样我们从左到右扫一遍,维护一个大小为k的多重集合,就把问题解决了。
    那么对于该问题如何解决呢 ,我们可以看到 n只有200 ,那么我们可以枚举x轴的两点,并且把包含这两点所有矩形y轴看做一维情况下的线段,使用一维情况求得最长值,乘以x轴枚举的两点的线段长度就是答案了。

    注意: 枚举x轴左右端点我们可以直接分别枚举矩形的起点和终点,因为x轴选取的线段一定是某个的起点和某个的终点,因为是交,所以矩形集合里面的最小l和最小r就是他们的范围,所以一定一个是起点一个是终点。

    细节:维护队列的时候如果加入后超过了k个 要先删除一个,再进行求k个线段交 例如存在3个[1,10]当枚举到[3,9]的时候 ,先把9加入队列再把它删除虽然代码计算了[3,10],但是这是没有意义的,因为此时加入[3,9]后队列中有k+1个元素并且9是队列里面的最小右端点 那么加入前的k个元素的交肯定包含了[3,9]肯定比[3,9]大,至少是[3,未加入[3,9]时候队列的最小值],所以此时无意义,为了统一性可以先加9再删9,但是严谨来说其实可以判一下9和队列里面的最小值比如此时是10,9比10小,保留队列里面的k个是更优的,所以不加入,也不计算。

    如果先删会带来什么后果 例如3个[1,3] [1,3][1,100] 来了个[2,2]把[1,3]顶掉了变成[1,3][2,2][1,100]这不就炸了吗。。

    #include<bits/stdc++.h>
    using namespace std;
    
    struct KRectangleIntersection{
    	long long maxIntersection(vector <int>xl, vector <int>yl, vector <int>xr, vector <int>yr, int k){
    		long long ans=0;
    		int n=yr.size();
    			for(int st:xl){
    				for(int ed:xr){
    					if(st>=ed)continue;
    					vector<pair<int,int> >y;
    					for(int i=0;i<n;i++){
    						if(xl[i]<=st&&xr[i]>=ed)y.push_back(make_pair(yl[i],yr[i]));
    					}
    					if((int)y.size()<k)continue;
    					sort(y.begin(),y.end());
    					priority_queue<int,vector<int>,greater<int> >q;
    					int leny=0;
    					for(int i=0;i<y.size();i++){
    						q.push(y[i].second);
    						if((int)q.size()>k)q.pop();
    						if((int)q.size()==k){
    							leny=max(leny,q.top()-y[i].first);
    						}
    					}
    					ans=max(ans,1ll*(ed-st)*(leny));
    				}
    			}
    			return ans;
    	}
    };
    
  • 相关阅读:
    关于程序收到消息的顺序
    窗口过程
    消息循环
    解剖窗口程序
    开始了解窗口程序
    编码的规范
    汇编的除法和乘法
    Win32汇编--Win32汇编的高级语法
    H5-音频列表音乐切换
    移动端-ibokan
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/12424394.html
Copyright © 2011-2022 走看看