ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

考试 彩色 离散化+类暴力

2019-05-08 23:40:25  阅读:256  来源: 互联网

标签:ch 暴力 int fix 彩色 ret 离散 color 矩形


快读没打符号,100->35(竟然还得了35)


 

彩色(color)

[题目描述]

  在直角坐标系上,有N个边平行于坐标轴的矩形。你的任务是把其中的K个矩形染色,使按次序放下后,可以看见的有色面积最大。可看见的意思就是这一部分没有被后面的矩形覆盖。

  你的答案是返回K个整数,表示你染色的是哪K个矩形。如果有多种答案,输出字典序最小的。

[数据范围]

  1<=N<=50; 1<=K<=N。

  每个坐标值为[-10000,10000]之间的整数。

[输入文件 color.in]

  第一行两个整数:N K

  后面有N行,每行4个整数: x1 y1 x2 y2, 分别表示先后各个矩形的左下角坐标和右上角坐标。

[输出文件 color.out]

  一行,K个整数:你的方案。

样例

输入

3  2

1 1 5 3

3 2 7 4

2 5 9 7

7  4

1 1 5 4

2 2 4 3

4 0 6 2

7 1 9 4

1 5 4 7

6 5 9 7

2 5 8 6

输出

1 2

0 2 3 6

样例解释:

 

 


 

我们可以用类似扫描线的思路:(有些暴力)
先将横坐标离散化,然后依次对离散化的每个区间:枚举每个包含这个区间的矩形,从上往下覆盖,记录已经被覆盖的纵坐标,那么就不能将这些已经被覆盖的点计算到下面的矩形的面积里。(线段树维护也是资瓷的)

 


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define R register int
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
struct node{int x1,x2,y1,y2;}a[55];
struct Node{int s,rk;
    bool operator <(const Node& y)const{return s==y.s?rk<y.rk:s>y.s;}
}ans[55];
int n,k,cnt,tot;
int xx[110],rw[110],anss[55];
bool vis[20010],*v=vis+10001;
signed main() { freopen("color.in","r",stdin); freopen("color.out","w",stdout);
    n=g(),k=g(); for(R i=1;i<=n;++i) 
        a[i].x1=g(),a[i].y1=g(),a[i].x2=g(),a[i].y2=g(),ans[i].rk=i-1;
    for(R i=1;i<=n;++i) xx[++cnt]=a[i].x1,xx[++cnt]=a[i].x2;
    sort(xx+1,xx+cnt+1); tot=unique(xx+1,xx+cnt+1)-xx-1; //cout<<"!!!cnt: "<<cnt<<" !!!tot:"<<tot<<endl;
    for(R i=1;i<=tot;++i) rw[i]=xx[i];//,cout<<xx[i]<<" "; cout<<endl;
    for(R i=1;i<tot;++i) { memset(vis,0,sizeof(vis));
        //for(R j=1,len=0;j<=n;++j,len=0) {if(a[j].x1<=rw[i]&&a[j].x2>=rw[i+1]) 
        for(R j=n,len=0;j>=1;--j,len=0) {if(a[j].x1<=rw[i]&&a[j].x2>=rw[i+1])
            for(R k=a[j].y1+1;k<=a[j].y2;++k) if(!v[k]) 
                ++len,v[k]=true;//cout<<"fasdjfasdff"<<k<<endl;
            ans[j].s+=len*(rw[i+1]-rw[i]);
        }
    } //for(R i=1;i<=n;++i) cout<<ans[i].s<<" "<<ans[i].rk<<endl;
    sort(ans+1,ans+n+1); for(R i=1;i<=k;++i) anss[i]=ans[i].rk;
    sort(anss+1,anss+k+1); for(R i=1;i<=k;++i) printf("%d ",anss[i]);
    //while(1);
}

2019.05.08 记住这回的耻辱

标签:ch,暴力,int,fix,彩色,ret,离散,color,矩形
来源: https://www.cnblogs.com/Jackpei/p/10835911.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有