Description

Blue Mary是一个有名的石头收藏家。迄今为止,他把他的藏品全部放在他的宫殿的地窖中。现在,他想将他的藏品陈列在他的花园中。皇家花园是一个边长为1000000000单位的平行于坐标轴的正方形。对于每个石头,Blue Mary都有一个他想放置的坐标,然后将他告诉他的属下。不幸的是,他忘了告诉他们坐标的顺序(比如无法分辨(x,y)和(y,x))。属下们,就自己决定了每个石头的具体位置。为了保护他的藏品,Blue Mary决定建造一个篱笆来保护他们。为了美学的需要,篱笆也被设计为平行于坐标轴的矩形。如果花园的布局知道了,那么就可以知道最短长度的篱笆的布局。他的属下们需要变换石头的坐标使得篱笆的长度最少。每个石头只能从(x,y)变换为(y,x),由于每个石头的重量不一样。属下们希望他们移动的石头的重量和最少。

Input

第一行包含一个数n,表示石头的数量

接下来n行分别描述n个石头的初始坐标和重量\(x_i,y_i,m_i\)。

(0<=\(x_i,y_i\)<=1000000000,1<=\(m_i\)<=2000)

(2<=n<=1000000)

Output

一行包含两个数由一个空格分割。

最小的篱笆长度和最小的移动的石子的重量和

Sample Input

5

2 3 400

1 4 100

2 2 655

3 4 100

5 3 277

Sample Output

10 200

HINT


我们把所有的点扔到y=x这条函数的一侧会最优,至于证明,其实十分显然



我们考虑如图所示的情况,如果说我的结论是错误的,那么就会有某个点在对称过去后,会使得答案更优。但是我们发现,只要我们挪动了点2和点4,点3是需要跟着移动的,否则答案必然会不优。

但是我们发现,移动了点之后,虽然能使宽度减少,但是会使得高度增加;或者是使得高度减少,宽度增加,而且增加减少值是一样的!更重要的是,点3的移动还会使得答案变得不优。

因此我们可以知道,只要将所有点移动到y=x的一侧,答案必然是最优的,如果有某些点在另一边,一定不会使答案更优。

那么第二个答案呢,我们枚举两个矩形就好了,如下



如果只是这样子枚举的话,那么祝你WA的愉快



我们还需要枚举黑色和灰色两个矩形,至于为什么,我给你三个点,你自己体会下:(4,2),(5,6),(8,4),然后(8,4)这个点权值最小

上面所给的4个矩形周长都是一样的,所以都需要枚举

(ps:原题题面还要求输出哪些点被搬动了,然后碰到一堆权值相等的点,又没有spj……所以题面改了)

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=1e6;
struct S1{
int x,y,w;
void join(int _x,int _y,int _w){x=_x,y=_y,w=_w;}
}A[N+10];
int n,Ans=inf;
void work(int l,int r,int d,int u){
int res=0;
for (int i=1;i<=n;i++){//O(n)即可
int x=A[i].x,y=A[i].y;
if (l<=x&&x<=r&&d<=y&&y<=u) continue;
if (l<=y&&y<=r&&d<=x&&x<=u) res+=A[i].w;
else return;
}
Ans=min(Ans,res);
}
int main(){
n=read();
int L=inf,R=-inf,U=-inf,D=inf;
for (int i=1;i<=n;i++){
int x=read(),y=read(),z=read();
A[i].join(x,y,z);
int Min=min(x,y),Max=max(x,y);//挪到同一侧
L=min(L,Max),R=max(R,Max),U=max(U,Min),D=min(D,Min);
}
//做四遍
work(L,R,D,U);
work(L,U,D,R);
work(D,R,L,U);
work(D,U,L,R);
printf("%lld %d\n",2ll*(R-L+U-D),Ans);
return 0;
}

[POI2007]石头花园SKA的更多相关文章

  1. BZOJ 1105: [POI2007]石头花园SKA

    1105: [POI2007]石头花园SKA Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 628  Solved: 182[Submit][Stat ...

  2. BZOJ1105 [POI2007]石头花园SKA 贪心

    [POI2007]石头花园SKA Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 776  Solved: 237[Submit][Status][Di ...

  3. BZOJ1105 : [POI2007]石头花园SKA

    考虑把所有石头翻到直线y=x同侧,此时可以保证篱笆长度最短. 这种最短的篱笆一共有4种可能,枚举每种可能然后$O(n)$检验求出答案即可. #include<cstdio> const i ...

  4. 【BZOJ】1105: [POI2007]石头花园SKA

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

  5. [bzoj1105]石头花园

    首先$C/2=x_{max}+y_{max}-x_{min}-y_{min}=max(x_{max},y_{max})-min(x_{min},y_{min})+min(x_{max},y_{max} ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. poi2007

    序:为什么写poi,zy说poi都是思路题目,不像hnoi妈的数据结构队..... 1.bzoj1102 题目大意:定义了一个山谷和山峰,求他们数量. 题解:这种题bfs咯,在bfs的时候记录一下相邻 ...

  8. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  9. Team Leader 你不再只是编码, 来炖一锅石头汤吧

    h3{ color: #000; padding: 5px; margin-bottom: 10px; font-weight: bolder; background-color: #ccc; } h ...

随机推荐

  1. java的反射机制和javassist、asm

    1.java的反射机制,可以帮助我们在运行的时候获取我们引用的java类相关的信息,包括类的名字.所包含的方法名字.方法参数等等 2.javassit这个jar包,大概看了下,更厉害,它可以直接操作字 ...

  2. [转]LINUX新建和增加SWAP分区

    以前做过增加swap分区的事情,今天一个同事问到我如何做,故记个笔记整理一下吧.另外,以前我写过“交换分区swap的大小分配”,大家也可先看一下. 我们都知道在安装Linux系统时在分区时可以分配sw ...

  3. POJ 1679 The Unique MST 推断最小生成树是否唯一

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22715   Accepted: 8055 D ...

  4. android 多进程 Binder AIDL Service

    本文參考http://blog.csdn.net/saintswordsman/article/details/5130947 android的多进程是通过Binder来实现的,一个类,继承了Bind ...

  5. Android消息机制1-Handler(Java层)(转)

    转自:http://gityuan.com/2015/12/26/handler-message-framework/ 相关源码 framework/base/core/java/andorid/os ...

  6. JSONObjectWithData方法里options參数选择解释

    NSJSONReadingMutableContainers  Specifies that arrays and dictionaries are created as mutable object ...

  7. Codeforces466C Number of Ways

    题目链接: http://codeforces.com/problemset/problem/466/C 题意: 给一个长度为n的数组,将其分成连续的三段使三段的和相等.求有几种这种组合 分析: 从头 ...

  8. quick-cocos2d-x教程10:实现血条效果。

    血条是常见功能.能够通过一个血条背景和一个不断改变的血条宽度.来实现少血. 在MainScence.lua中,先改代码: function MainScene:ctor()     local bg ...

  9. MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便

    先看一下我想要的结果: 很容易它就是一个单选按钮组,当我后台为Html对象(HtmlHelper的一个实例,它被定义在System.Web.Mvc名称空间下的WebViewPage类,即它对于所有MV ...

  10. Koa2学习(三)GET请求

    Koa2学习(三)GET请求 GET请求是前后端交互最常用的请求之一,常常用来进行查询操作. 那么Koa是如何接收并处理GET请求呢? 创建一个服务 // 引入Koa const Koa = requ ...