博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Gym101505G:Orchard Division(扫描线+线段树第k大)
阅读量:5055 次
发布时间:2019-06-12

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

题意

给出一个m*m的地图,上面有n个点,现在需要用一个自定义面积的矩形笼罩住恰好n/2个点,并且这个矩形需要有一个点在至少一个角落上,问这个矩形最小的面积是多少。

思路

有点类似于扫描线。将y坐标离散化,沿着x轴扫过去,边加点边查找,注意这里一定要每次加一列(即x相同的时候要全加进去,不然找第k大的时候可能出错),每次查找的时候就找恰好第n/2大的y坐标,然后就可以得到面积了。

考虑到四个角都需要判定,一开始我写了四个又长又臭的函数,后来队友写了一个挺妙的Rotate()函数。

#include 
using namespace std;typedef long long LL;const int INF = 0x3f3f3f3f;const int N = 1e6 + 11;const LL inf = 2e18;#define lson l, m, rt<<1#define rson m + 1, r, rt<<1|1struct Node { int x, y;} p[N];int yy[N], cy, tree[N<<2], n, m, x, y;LL ans;bool cmp(const Node &a, const Node &b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x;}void Rotate() { for(int i = 1; i <= n; i++) { x = p[i].x; p[i].x = m - p[i].y + 1; p[i].y = x; }}void build(int l ,int r, int rt) { tree[rt] = 0; if(l == r) return ; int m = (l + r) >> 1; build(lson); build(rson);}void update(int id, int w, int l, int r, int rt) { tree[rt] += w; if(l == r) return ; int m = (l + r) >> 1; if(id <= m) update(id, w, lson); else update(id, w, rson);}int query(int k, int l, int r, int rt) { if(tree[rt] < k) return -1; if(l == r) return tree[rt] == k ? yy[l] : -1; int m = (l + r) >> 1; if(tree[rt<<1] >= k) return query(k, lson); else return query(k - tree[rt<<1], rson);}void solve() { cy = 0; for(int i = 1; i <= n; i++) yy[++cy] = p[i].y; sort(yy + 1, yy + 1 + cy); cy = unique(yy + 1, yy + 1 + cy) - yy - 1; sort(p + 1, p + 1 + n, cmp); build(1, cy, 1); for(int i = 1; i <= n; ) { for(x = p[i].x ; i <= n && p[i].x == x; i++) { y = lower_bound(yy + 1, yy + 1 + cy, p[i].y) - yy; update(y, 1, 1, cy, 1); } if(i < n / 2) continue; int now = query(n / 2, 1, cy, 1); if(now == -1) continue; ans = min(ans, 1LL * x * now); } Rotate();}int main() { while(~scanf("%d%d", &m, &n)) { for(int i = 1; i <= n; i++) { scanf("%d%d", &p[i].x, &p[i].y); p[i].x++; p[i].y++; } if(n & 1) { puts("-1"); continue; } ans = inf; for(int i = 0; i < 4; i++) solve(); if(ans == inf) ans = -1; printf("%lld\n", ans); } return 0;}

转载于:https://www.cnblogs.com/fightfordream/p/7615381.html

你可能感兴趣的文章
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>