Cinema

感觉这个题好神啊。。。

首先如果 n 比 m 大, 我们先旋转90度。

我们要加入一个(x, y)的时候, 我们枚举答案所在的行离 x 的距离 g , 然后对于x + g 行来说

我们找到(x + g, y)左边的第一个和右边的第一个未被占的位置,更新答案, 如果 g > 答案 退出。

左边和右边第一个未被占的可以用并查集维护, 把连续占了的并成一个联通块, 维护最小值和最大值。

对于 2000 * 2000的图来说, 对于每一次, 最多sqrt( n )就能找到答案, 因为最坏情况下所有点都在一个点,

最后的图是sqrt(n) * sqrt(n)的矩形。

#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define fio ios::sync_with_stdio(false); cin.tie(0);using namespace std;const int N = 2000 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const double PI = acos(-1);template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;}struct DSU {int fa[N], L[N], R[N];bool used[N];void init() {for(int i = 0; i < N; i++) {fa[i] = i;L[i] = i;R[i] = i;}}int getRoot(int x) {return fa[x] == x ? x : fa[x] = getRoot(fa[x]);}void Merge(int u, int v) {int x = getRoot(u);int y = getRoot(v);chkmin(L[x], L[y]);chkmax(R[x], R[y]);fa[y] = x;}
} dsu[N];int n, m, k;int main() {scanf("%d%d%d", &n, &m, &k);if(n <= m) {for(int i = 1; i <= n; i++) dsu[i].init();while(k--) {pair<int, PII> ans = mk(inf, mk(inf, inf));int x, y; scanf("%d%d", &x, &y);for(int g = 0; g <= ans.fi; g++) {if(x + g <= n) {if(!dsu[x + g].used[y]) {chkmin(ans, mk(g, mk(x + g, y)));} else {int Rt = dsu[x + g].getRoot(y);pair<int, PII> retL = mk(inf, mk(inf, inf));pair<int, PII> retR = mk(inf, mk(inf, inf));if(dsu[x + g].L[Rt] - 1 > 0) retL = mk(g + y - dsu[x + g].L[Rt] + 1, mk(x + g, dsu[x + g].L[Rt] - 1));if(dsu[x + g].R[Rt] + 1 <= m) retR = mk(g + dsu[x + g].R[Rt] + 1 - y, mk(x + g, dsu[x + g].R[Rt] + 1));chkmin(ans, retL);chkmin(ans, retR);}}if(x - g >= 1) {if(!dsu[x - g].used[y]) {chkmin(ans, mk(g, mk(x - g, y)));} else {int Rt = dsu[x - g].getRoot(y);pair<int, PII> retL = mk(inf, mk(inf, inf));pair<int, PII> retR = mk(inf, mk(inf, inf));if(dsu[x - g].L[Rt] - 1 > 0) retL = mk(g + y - dsu[x - g].L[Rt] + 1, mk(x - g, dsu[x - g].L[Rt] - 1));if(dsu[x - g].R[Rt] + 1 <= m) retR = mk(g + dsu[x - g].R[Rt] + 1 - y, mk(x - g, dsu[x - g].R[Rt] + 1));chkmin(ans, retL);chkmin(ans, retR);}}}if(dsu[ans.se.fi].used[ans.se.se - 1]) dsu[ans.se.fi].Merge(ans.se.se, ans.se.se - 1);if(dsu[ans.se.fi].used[ans.se.se + 1]) dsu[ans.se.fi].Merge(ans.se.se, ans.se.se + 1);dsu[ans.se.fi].used[ans.se.se] = true;printf("%d %d\n", ans.se.fi, ans.se.se);}} else {for(int i = 1; i <= m; i++) dsu[i].init();while(k--) {pair<int, PII> ans = mk(inf, mk(inf, inf));int x, y; scanf("%d%d", &x, &y);for(int g = 0; g <= ans.fi; g++) {if(y + g <= m) {if(!dsu[y + g].used[x]) {chkmin(ans, mk(g, mk(x, y + g)));} else {int Rt = dsu[y + g].getRoot(x);pair<int, PII> retL = mk(inf, mk(inf, inf));pair<int, PII> retR = mk(inf, mk(inf, inf));if(dsu[y + g].L[Rt] - 1 > 0) retL = mk(g + x - dsu[y + g].L[Rt] + 1, mk(dsu[y + g].L[Rt] - 1, y + g));if(dsu[y + g].R[Rt] + 1 <= n) retR = mk(g + dsu[y + g].R[Rt] + 1 - x, mk(dsu[y + g].R[Rt] + 1, y + g));chkmin(ans, retL);chkmin(ans, retR);}}if(y - g >= 1) {if(!dsu[y - g].used[x]) {chkmin(ans, mk(g, mk(x, y - g)));} else {int Rt = dsu[y - g].getRoot(x);pair<int, PII> retL = mk(inf, mk(inf, inf));pair<int, PII> retR = mk(inf, mk(inf, inf));if(dsu[y - g].L[Rt] - 1 > 0) retL = mk(g + x - dsu[y - g].L[Rt] + 1, mk(dsu[y - g].L[Rt] - 1, y - g));if(dsu[y - g].R[Rt] + 1 <= n) retR = mk(g + dsu[y - g].R[Rt] + 1 - x, mk(dsu[y - g].R[Rt] + 1, y - g));chkmin(ans, retL);chkmin(ans, retR);}}}if(dsu[ans.se.se].used[ans.se.fi - 1]) dsu[ans.se.se].Merge(ans.se.fi, ans.se.fi - 1);if(dsu[ans.se.se].used[ans.se.fi + 1]) dsu[ans.se.se].Merge(ans.se.fi, ans.se.fi + 1);dsu[ans.se.se].used[ans.se.fi] = true;printf("%d %d\n", ans.se.fi, ans.se.se);}}return 0;
}/*
*/

转载于:https://www.cnblogs.com/CJLHY/p/10891712.html

Codeforces 200A Cinema 并查集 + 思维 (看题解)相关推荐

  1. CodeForces - 468B Two Sets(并查集+思维)

    题目链接:点击查看 题目大意:现在给出两个集合A和B,再给出两个数a和b,现在规定在集合A中的数x必须满足x和a-x同时在集合a中,而在集合B中的数x也同样需要满足x和b-x同时在集合B中,现在给出一 ...

  2. gym:Problem A Artwork(并查集思维题)

    20162017-acmicpc-nordic-collegiate-programming-contest-ncpc-2016 Problem A Artwork 题目链接 http://codef ...

  3. Secret Passwords CodeForces - 1263D(并查集)

    One unknown hacker wants to get the admin's password of AtForces testing system, to get problems fro ...

  4. Codeforces 437D 贪心+并查集

    这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij ...

  5. Codeforces 103B - Cthulhu(并查集 找环和块)

    传送门:https://codeforces.com/problemset/problem/103/B 题意: 给一个n个结点,m条边的无向图 判断给定图是否满足以下条件: 能被表示为有3个及以上的有 ...

  6. 小希的迷宫 HDU - 1272---并查集+思维

    上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...

  7. Rumor CodeForces - 893C(并查集)

    Vova promised himself that he would never play computer games- But recently Firestorm - a well-known ...

  8. All men are brothers(并查集+思维 好题!!!)

    链接:https://ac.nowcoder.com/acm/contest/889/E 来源:牛客网 Amy asks Mr. B problem E. Please help Mr. B to s ...

  9. Mahmoud and a Dictionary CodeForces - 766D 种类并查集

    题意 给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES 然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出 ...

最新文章

  1. 【每周CV论文推荐】 初学者必须精读的5篇深度学习优化相关文章
  2. 提高项目执行力的六板斧
  3. 在eclipse上Checkstyle的安装和使用
  4. 笔记本html怎么插入图片,将图像嵌入到jupyter笔记本中并导出为HTML
  5. 计算机网络信息安全理论与实践教程-蒋建春
  6. 你真的会用Vue-cli脚手架和Element-ui进行项目创建吗?
  7. 面向机器学习的特征工程 六、降维:用 PCA 压缩数据集
  8. 数据结构与计算机网络参考书,2019计算机考研:数据结构参考书及复习重点
  9. jupyter in vscode python语法不高亮 单元格语言格式CVE
  10. 推荐10款最佳的App安全测试工具
  11. 25.HTTP协议和WEB服务器APACHE
  12. Skip Locked——跳过加锁行
  13. 如何正确利用肢体语言表达自己
  14. NASA锂电池容量增量数据处理
  15. 啤酒每罐2.3元,饮料每罐1.9元
  16. mysql 2038年问题_当前系统在2038年之后datetime类也无法获取当前时间的解决
  17. 【HTTP协议其实很简单】03.自己写一个微型静态Web服务器
  18. ZooKeeper安装教程
  19. 怎么用js抽取身份证号中的年份?
  20. 读《穷爸爸 富爸爸》

热门文章

  1. LeetCode题解(0657):根据操作列表判断机器人是否能回到原点(Python)
  2. 上海人工智能开发者大会AmazonDeepRacer自动驾驶赛车嘉年华圆满落
  3. Opencv简单介绍
  4. 《Android Studio实战 快速、高效地构建Android应用》--二、在Android Studio中编程
  5. VMware安装银河麒麟V10桌面版虚拟机
  6. 美团联盟怎么实现用户订单跟单功能
  7. 【二叉树的前序、中序、后序遍历的python写法】借助栈的实现,效率媲美递归~
  8. Github标星 8K+,免费又好用的Redis客户端工具!
  9. google/Chrome浏览器如何查看保存在网页上的密码
  10. 双12来临,解密淘宝小二都在用的“电商神器”——阿里云RPA(机器人流程自动化)