博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【杂题】codeforces 200A. Cinema
阅读量:5093 次
发布时间:2019-06-13

本文共 1581 字,大约阅读时间需要 5 分钟。

http://codeforces.com/problemset/problem/200/A

       好题,虽然我又没独立想出来=。=。。给一个n*m的点矩阵,询问K次,每个输入一个坐标x,y,寻找一个于该坐标曼哈顿距离最小且未被占有的点,并占有它。

      做法是每次询问从x开始往左右暴力枚举横坐标,直到横坐标绝对值差已经大于当前答案。可以保证第i个询问,最多只需要向两边枚举sqrt(i)次。同时可以利用并查集,对于每个横坐标O(1)求出最接近的点。。最后当n比m大很多时候算法会退化,此时可以通过交换横竖坐标来解决。

View Code
1 //By Lin 2 #include
3 #include
4 #include
5 #define maxn 2005 6 #define inf 0x7fffffff 7 using namespace std; 8 9 bool flag = false;10 int n,m,K;11 int up[maxn][maxn],down[maxn][maxn];12 int Find(int p[],int x){13 return p[x] != x?p[x]=Find(p,p[x]):x;14 }15 16 void check(int x,int y,int i,int &g,int &h ,int &L ){17 if ( i < 1 || i > n ) return;18 int j;19 j = Find(up[i],y);20 if ( j != 0 ) {21 int d = abs(x-i)+abs(y-j);22 if ( d < L || d == L && ( !flag&&(i
m ) {36 swap(n,m); 37 flag = true;38 }39 for (int i = 1; i<=n; i++) 40 for (int j = 0; j<=m+1; j++) up[i][j] = down[i][j] = j; 41 while ( K -- ){42 int x , y; 43 scanf("%d%d", &x, &y );44 if ( flag ) swap(x,y);45 int g = -1 , h = -1 , L = inf; 46 for (int i = 0; i<=L; i++){47 check( x , y , x-i , g , h , L );48 check( x , y , x+i , g , h , L );49 }50 up[g][h] = h-1;51 down[g][h] = h+1;52 if ( flag ) swap(g,h);53 printf("%d %d\n" , g , h );54 }55 return 0;56 }

 

转载于:https://www.cnblogs.com/lzqxh/archive/2012/12/28/2837250.html

你可能感兴趣的文章
Java集合---ConcurrentHashMap原理分析
查看>>
解决在IE下“JSON”未定义的有关问题
查看>>
C++ map的基本操作和使用
查看>>
LeetCode "Wildcard Matching"
查看>>
LeetCode "Zigzag Iterator"
查看>>
Merge Two Sorted Lists Leetcode
查看>>
Ajax基本结构
查看>>
Day6 function
查看>>
Easyui的numberbox无法输入以0开头的数字编号(转载)
查看>>
DN安卓2014版(5-9)
查看>>
[SCOI2010]连续攻击游戏
查看>>
glib 编译
查看>>
JAVA编程规范-命名规范
查看>>
iOS 开发中常见的设计模式
查看>>
mac上设置新版chrome浏览器跨域
查看>>
登陆系统的设计1 - 设计用户数据表
查看>>
Html中锚点的使用【转】
查看>>
Makefile--基本规则(零)
查看>>
汇编语言基本语句
查看>>
判断圆和矩形是否相交C - Rectangle and Circle
查看>>