题意:

      给你一个n*n的棋盘,让你在棋盘上放n个棋子,要求是所有棋子不能相互攻击(同行或者同列就会攻击),并且每个棋子都有一个限制,那就是必须在给定的矩形r[i]里,输出每个棋子的位置,special Jude。

思路:

      看完后第一反应就是匈牙利(哎!惭愧啊。)结果想着怎么建图,想了一会呵呵了,果断想别的方法,其实这个题目设计到一个小思想非常好,那就是把整体分解,这个题目说的是什么?是每个棋子都限制了一个矩形范围,矩形范围又是什么?是不是就是xl<=x<=xr&&rl<=y<=yr,其实x和y我们可以分开考虑,可以分开的原因就是x和y之间没有限制因素,也不会相互影响,就像是中学时学的速度分解一样,这个就是这个题目的关键点,想到这个AC的可能性就很大了,分解后我们要处理的就是给你一些区间限制,然后在每个区间内都必须选择一个点放东西,最后要求同一个点不能放两个东西,也就是本题目的同一行或者一列不能放两个其子一样,然后就是贪心了,怎么贪心呢?我们可以把每个区间都按照右端点从小到大排序,然后我们从前往后贪心,右端点越小的“自由性”越小,所以要先处理,所以放在前面,对于每一断,我们就从这个段的做端点开始找,找第一个没被占用的点,占用上就行了,如果都找到右端点了还没找到可以用的点,那么就直接没解了,x和y都是这么处理的,找的时候我用的是set容器总的时间复杂度是O(n*log(n)),如果不想用set直接暴力找也应该不会超时,时间复杂度是O(n*n).

#include<set>

#include<stdio.h>

#include<algorithm>

#define N 5000 + 10

using namespace std;

typedef struct

{

   int l ,r ,id;

}EDGE;

int AnsX[N] ,AnsY[N];

EDGE X[N] ,Y[N];

set<int>set1 ,set2;

bool camp(EDGE a ,EDGE b)

{

   return a.r < b.r;

}

int main ()

{

   int i ,n;

   int x1 ,x2 ,y1 ,y2;

   while(~scanf("%d" ,&n) && n)

   {

      set1.clear() ,set2.clear();

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2);

         X[i].l = x1 ,X[i].r = x2;

         Y[i].l = y1 ,Y[i].r = y2;

         X[i].id = Y[i].id = i;

         set1.insert(i);

         set2.insert(i);

      }

      set1.insert(10000000);

      set2.insert(10000000);

      sort(X + 1 ,X + n + 1 ,camp);

      sort(Y + 1 ,Y + n + 1 ,camp);

      int mk = 0;

      for(i = 1 ;i <= n && !mk ;i ++)

      {

         int tmpx = *set1.lower_bound(X[i].l);

         if(tmpx > X[i].r) mk = 1;

         AnsX[X[i].id] = tmpx;

         set1.erase(tmpx);

         

         int tmpy = *set2.lower_bound(Y[i].l);

         if(tmpy > Y[i].r) mk = 1;

         AnsY[Y[i].id] = tmpy;

         set2.erase(tmpy);

      }

      

      if(mk)

      {

         puts("IMPOSSIBLE");

         continue;

      }

      for(i = 1 ;i <= n ;i ++)

      printf("%d %d\n" ,AnsX[i] ,AnsY[i]);

   }

   return 0;

}

   

      

      

最新文章

  1. 数据库基础,表及SQL语句
  2. 学习 MySQL-DBA常用SQL汇总
  3. android之MP3播放器(1)
  4. Eclipse:Cannot complete the install because of a conflicting dependency.问题解决
  5. Behavior Designer中Wait节点的坑
  6. Steam和Byte[]之间进行输换
  7. Java—面向对象—构造方法及相关思维导图
  8. cocos2d-x 3.0正式版 环境搭建 (解决载入失败,未能载入XXX包)
  9. 安卓 eclipse项目创建
  10. php --with-mysql=mysqlnd
  11. 基于Spring DM管理的Bundle获取Spring上下文对象及指定Bean对象
  12. SpringMvc 关于 EXCEL
  13. delphi各种错
  14. VUE 安装及项目创建
  15. BOM 浏览器对象模型_window 对象的常见 window.属性_window.方法
  16. DDD 之 Multiple Canonical Models
  17. Command Analyze failed with a nonzero exit code
  18. sqlserver创建表
  19. 安卓项目R,java文件不能自动更新,clean之后,R.java消失 (转自 Cynosure鱼)
  20. Hadoop源码阅读-HDFS-day2

热门文章

  1. Hadoop的常用命令
  2. 从零学脚手架(三)---webpack属性详解
  3. vue 折线柱状图
  4. CF1149C Tree Generator™
  5. CSS盒子的尺寸
  6. Html5分页显示Table
  7. springboot集成swagger实战(基础版)
  8. warpperspective 透视变化的opencv实现
  9. NetCore的缓存使用详例
  10. 「HTML+CSS」--自定义按钮样式【004】