座位安排(seat)

题目描述

费了一番口舌,wfj_2048终于成功地说服了n∗mn∗m个妹子来陪自己看电影。

为了这次声势浩大,wfj_2048包下了一座有n∗mn∗m个座位的电影院。 (wfj_2048坐哪?我也不知道。。。。。。) 电影院前门的坐标为(0,0)(0,0),后门的坐标为(0,m+1)(0,m+1)。有kk个妹子站在前门外,剩下的n∗m−kn∗m−k个站在后门外。

但是,问题来了:每个妹子都有一个不一定相同的忍耐值ss,若从她到达的门到座位的曼哈顿距离超过ss,她会感到不爽并离开,可wfj_2048不想错过任何一个妹子。于是,他想让你告诉他:是否存在一种方案,使得所有的妹子都能安排到合适的座位,且没有妹子会离开?

输入

第一行为nn和mm,意义如描述之所示

第二行一个整数kk,接着kk个整描述前门外的kk个妹子的ss值

第三行一个整数n∗m−kn∗m−k,接着n∗m−kn∗m−k个数描述后门外的妹子的ss值

输出

若存在合法的座位安排方案则输出YESYES,否则输出NONO。

样例输入

样例输入1
2 2
3 3 3 2
1 3
样例输入2
2 2
3 2 3 3
1 2

样例输出

样例输出1
YES
样例输出2
NO

提示

【数据范围】

子任务1:3030:n∗m≤10n∗m≤10

子任务2:3030:n∗m≤1000n∗m≤1000

子任务3:4040:n∗m≤100000n∗m≤100000

来源

长郡noip2017模拟2


solution

按忍耐度从小到大考虑前门的每一个妹子。

对于一个妹子,她能坐的范围应该是一个类似三角形的区域(x+y<=k).

把这些位置取出来,按位置到后门的距离放进堆里。每次取堆顶即可。

为什么这是对的呢?

首先我从小到大考虑忍耐度,不会出现忍耐度大的妹子占了位置而忍耐度小的妹子没位置坐。

也就是在尽量保证合法的情况下优化后门的方案。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 100005
using namespace std;
int nn,n,m,k1,k2,a[maxn],b[maxn];
struct node{
int v;
bool operator <(node T)const{
return T.v>v;
}
}t;
priority_queue<node>q;
int main()
{
freopen("seat.in","r",stdin);
freopen("seat.out","w",stdout);
scanf("%d%d%d",&n,&m,&k1);
int nn=n*m;
for(int i=1;i<=k1;i++)scanf("%d",&a[i]);
scanf("%d",&k2);
for(int i=1;i<=k2;i++)scanf("%d",&b[i]);
sort(a+1,a+k1+1);sort(b+1,b+k2+1);
int now=0;
for(int i=1;i<=k2;i++){
if(b[i]>now){
for(int j=now+1;j<=b[i];j++){
int o=min(j,n+1);
for(int x=max(1,j-m);x<o;x++){
int y=m+1-(j-x);
t.v=x+y;q.push(t);
}
}
now=b[i];
}
if(q.empty()){
puts("NO");return 0;
}
q.pop();
}
for(int j=now+1;j<=n+m;j++){
int o=min(j,n+1);
for(int x=max(1,j-m);x<o;x++){
int y=m+1-(j-x);
t.v=x+y;q.push(t);
}
}
for(int i=k1;i>=1;i--){
t=q.top();q.pop();
if(t.v>a[i]){puts("NO");return 0;}
}
puts("YES");
return 0;
}

座位安排(seat)的更多相关文章

  1. 洛谷——P2071 座位安排 seat.cpp/c/pas

    P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...

  2. 洛谷 P2071 座位安排 seat.cpp/c/pas

    P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...

  3. 【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas

    ∵每个座位可以坐俩人,所以拆点最大匹配. #include<cstdio> #include<vector> #include<cstring> using nam ...

  4. 洛谷P1386座位安排

    座位安排 今天,在机房里做了这道题目,我来整理一下思路. 首先读懂题意,这n个人是不需要按1到n来一次安排的,也就是说你可以先安排任意一个人. 那么有一种很好排除的情况,那就是对于大于等于i的作为的需 ...

  5. 【vijos】1286 座位安排(状压dp)

    https://vijos.org/p/1286 这题好神不会捉... 首先我们知道所有情况有C(n*m, k)种,这个好搞.但是两两不相邻这个有点难搞.. 原来是状压dp..sigh. 设状态f[i ...

  6. 座位安排(欧拉回路,高斯消元,bitset)

    题面 由于旋转大师 F r e n c h \rm French French 的离去, A r e x t r e \rm Arextre Arextre 光荣地承担了给全班换座位的重任. 由于这是 ...

  7. 洛谷P2071 座位安排

    题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...

  8. p2071 座位安排

    传送门 题目 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置. 输入格式: 第一行,一个正整数N. 第二行至第N*2+1行, ...

  9. luogu P2071 座位安排

    这个题可以被分为两部分 1.匈牙利算法(板子) 2.邻接表存图(好像这不能称为第二部分) 每一排能坐两个人,那就把一排拆成两个点, 用匈牙利算法求最大匹配 每个人都只想坐两排,说明每个人只会连四条边 ...

随机推荐

  1. 转:Python集合(set)类型的操作

    转自:http://blog.csdn.net/business122/article/details/7541486 python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系 ...

  2. display:inline-block解决文字有间隙问题

    定义:display:inline-block是使元素以块级元素的形式呈现在行内.意思就是说,让这个元素显示在同一行不换行,但是又可以控制高度和宽度,这相当于内联元素的增强. 但是display:in ...

  3. ZendFramework-2.4 源代码 - 关于MVC - View层 - 在模板内渲染子模板

    <?php // 方式一: // 1.在模板内直接编写如下内容即可 $viewModel = new ViewModel(); $viewModel->setTemplate('album ...

  4. Vue之简易的留言板功能

    今天我将带大家通过Vue的todolist案例来完成一个简易的网页留言板! LES'T GO! 首先我们需要在页面上搭建一个input文本输入框,并设置提交按钮,通过循环指令来完成输入框的信息提交! ...

  5. libevent源码分析1 ----evnet相关结构体分析

    位于代码event-internal.h中. event_base类似事件的集合,你创建一个事件,必须将该事件指定一个集合. struct event_base { 50     const stru ...

  6. 必须使用member initialization list来初始化的情况

    // member initialization #include <iostream> using namespace std; class Circle { double radius ...

  7. B - Sonya and Exhibition CodeForces - 1004B (思维题)

    B. Sonya and Exhibition time limit per test 1 second memory limit per test 256 megabytes input stand ...

  8. 菜鸟学Linux - Linux文件属性

    在Linux中,文件的属性是一个很重要的概念,用户或者用户组对一个文件所拥有的权限,都可以从文件的属性得知. 我们可以通过ls -al命令,列出某个文件夹下面的所有文件(包括以.开头的隐藏文件).下面 ...

  9. 【java】实体类中 Set<对象> 按照对象的某个字段对set排序

    Java利用hibernate进行一对多查询时,把另一张表作为一个属性存进这张表的字段中,返回的类型是set类型,要对返回的set类型进行排序 user表 package onlyfun.caterp ...

  10. Kinect安装

    在连接kinect机器前,需要先安装两个软件,而在安装这两个软件前需要有vs2010(专业版本和快速版),因为需要包含.net framework 4.0 kinect sdk http://www. ...