博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1105: [POI2007]石头花园SKA
阅读量:6567 次
发布时间:2019-06-24

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

题意

二维平面上有\(n(2 \le n \le 1000000)\)个点,可以花费\(w_i\)交换第\(i\)个点的横纵坐标。求在满足能覆盖所有点的最小矩阵周长最短的情况下花费最小。

分析

这题太神了。有一个结论是,所有点都会交换到\(y=x\)线的同一侧。

题解

所以我们暴力就行辣。

#include 
using namespace std;inline int getint() { int x=0, c=getchar(); for(; c<48||c>57; c=getchar()); for(; c>47&&c<58; x=x*10+c-48, c=getchar()); return x;}const int N=1000005;bool ok[N], vi[N];int n, x[N], y[N], w[N], ans=~0u>>1;void go(int lx, int rx, int ly, int ry) { int temp=0; for(int i=1; i<=n; ++i) { if(lx<=x[i] && x[i]<=rx && ly<=y[i] && y[i]<=ry) { vi[i]=0; } else if(lx<=y[i] && y[i]<=rx && ly<=x[i] && x[i]<=ry) { vi[i]=1; temp+=w[i]; } else { return; } } if(temp
>1, ly=lx, rx=-lx, ry=rx; for(int i=1; i<=n; ++i) { x[i]=getint(), y[i]=getint(), w[i]=getint(); int a=min(x[i], y[i]), b=max(x[i], y[i]); lx=min(lx, a); rx=max(rx, a); ly=min(ly, b); ry=max(ry, b); } printf("%lld ", 2ll*(rx-lx+ry-ly)); go(lx, rx, ly, ry); go(lx, ry, ly, rx); go(ly, rx, lx, ry); go(ly, ry, lx, rx); printf("%d\n", ans); for(int i=1; i<=n; ++i) { putchar('0'+ok[i]); } return 0;}

转载地址:http://wdpjo.baihongyu.com/

你可能感兴趣的文章
【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】
查看>>
编程之美初赛第一场
查看>>
安卓APK瘦身
查看>>
java操作impala
查看>>
将jsp页面转pdf
查看>>
python 字典的系列操作
查看>>
如何计算两个文档的相似度(一)
查看>>
第一课:数据结构的基本概念和术语
查看>>
php缓存技术
查看>>
.NET开发必备网址
查看>>
jQuery 闭包
查看>>
Early Z Culling
查看>>
QTableView中使用Delegate方式来实现对特定列的文本进行换行
查看>>
JS打字效果的动态菜单代码分享
查看>>
20175317 《Java程序设计》第一周学习总结
查看>>
轮询 长轮询 websocket
查看>>
屏幕取色工具
查看>>
spring包自动扫描声明
查看>>
Xen之初体验:HA(额外附加)
查看>>
Python学习笔记(八)—使用正则获取网页中所需要的信息。
查看>>