BZOJ 1105: [POI2007]石头花园SKA

1105: [POI2007]石头花园SKA

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 628  Solved: 182
[Submit][Status][Discuss]

Description

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

Input

  第一行包含一个数n,表示石头的数量(2<=n<=1000000),接下来n行分别描述n个石头的初始坐标和重量xi,y
i,mi。(0<=xi,yi<=1000000000,1<=mi<=2000)

Output

  包含两行,第一行包含两个数由一个空格分割。最小的篱笆长度和最小的移动的石子的重量和。第二行为一个
01字符串,第i个字符为1表示要改变第i个石头的位置。0表示不改变。

Sample Input

5

2 3 400

1 4 100

2 2 655

3 4 100

5 3 277

Sample Output

10 200

01010

HINT

Source

[Submit][Status][Discuss]

分析

篱笆的长度最小是第一目标,应当优先考虑。易知,当所有石头的坐标都满足x<=y的时候,即全部在y=x直线的一侧之时,一定能够得到最小的周长,这时的周长就是第一个答案。

而满足这一周长的方式不止一种,可以将这个矩形关于y=x直线做对称,总共有四种可能的情况,全部枚举一遍即可。

代码

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <algorithm>
 7
 8 #define ri register int
 9
10 #define lim 100000000
11
12 char *c = new char[lim];
13
14 template <class T>
15 void read(T &x)
16 {
17     x = 0;
18
19     while (*c < ‘0‘)++c;
20
21     while (*c >= ‘0‘)
22         x = x*10 + *c++ - ‘0‘;
23 }
24
25 #define N 1000005
26 #define inf 2e9 + 7
27
28 int n;
29 int x[N];
30 int y[N];
31 int w[N];
32
33 int ans = inf;
34
35 bool vis[N], use[N];
36
37 void calculate(int lx, int ly, int rx, int ry)
38 {
39     ri res = 0; memset(vis, 0, sizeof(vis));
40
41     #define judge(X, Y) (X >= lx && X <= rx && Y >= ly && Y <= ry)
42
43     for (ri i = 1; i <= n; ++i)
44     {
45         if (judge(x[i], y[i]))
46             continue;
47         if (judge(y[i], x[i]))
48             vis[i] = 1, res += w[i];
49         else return;
50     }
51
52     if (res < ans)
53         ans = res, memcpy(use, vis, sizeof(use));
54 }
55
56 signed main(void)
57 {
58
59     fread(c, 1, lim, stdin);
60
61     read(n);
62
63     for (ri i = 1; i <= n; ++i)
64         read(x[i]), read(y[i]), read(w[i]);
65
66     ri lx, ly, rx, ry;
67
68     lx = ly = inf, rx = ry = 0;
69
70     for (ri i = 1; i <= n; ++i)
71     {
72         if (x[i] < y[i])
73         {
74             if (x[i] < lx)lx = x[i];
75             if (y[i] < ly)ly = y[i];
76             if (x[i] > rx)rx = x[i];
77             if (y[i] > ry)ry = y[i];
78         }
79         else
80         {
81             if (y[i] < lx)lx = y[i];
82             if (x[i] < ly)ly = x[i];
83             if (y[i] > rx)rx = y[i];
84             if (x[i] > ry)ry = x[i];
85         }
86     }
87
88     calculate(lx, ly, rx, ry);
89     calculate(lx, ly, ry, rx);
90     calculate(ly, lx, rx, ry);
91     calculate(ly, lx, ry, rx);
92
93     printf("%lld %d\n", 2LL*(rx + ry - lx - ly), ans);
94
95     for (ri i = 1; i <= n; ++i)putchar(use[i] ? ‘1‘ : ‘0‘);
96 }

BZOJ_1105.cpp

@Author: YouSiki

时间: 2024-10-13 16:47:21

BZOJ 1105: [POI2007]石头花园SKA的相关文章

BZOJ1105 : [POI2007]石头花园SKA

考虑把所有石头翻到直线y=x同侧,此时可以保证篱笆长度最短. 这种最短的篱笆一共有4种可能,枚举每种可能然后$O(n)$检验求出答案即可. #include<cstdio> const int N=1000000,inf=~0U>>1; int n,i,x[N],y[N],w[N],lx=inf,rx,ly=inf,ry,ans=inf,now;bool v[N],fin[N]; inline void read(int&a){char c;while(!(((c=getc

BZOJ 1098[POI2007]办公楼

题面: 1098: [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1371  Solved: 641[Submit][Status][Discuss] Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当

bzoj 1101 [POI2007]Zap - 莫比乌斯反演

Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个 正整数,分别为a,b,d.(1<=d<=a,b<=50000) Output 对于每组询问,输出到输出文件zap.out一个正

BZOJ 1100: [POI2007]对称轴osi

1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 630  Solved: 243[Submit][Status][Discuss] Description FGD小朋友--一个闻名遐迩的年轻数学家--有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大脑拒绝不停地重复思考同样的问题.不幸的是,yours是一个十分用功的学生,所

BZOJ 1099([POI2007]树Drz-9次线段树&amp;分类讨论+线段树与插入顺序维护2个参数)

1099: [POI2007]树Drz Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 142  Solved: 55 [Submit][Status] Description CDQZ是一个偏远的小学校,FGD在学校里中了一排树.他却不喜欢这些树的顺序,因为他们高高矮矮显得那么参差不齐. FGD定义这些树的不整齐程度为相邻两树的高度差的和.设树高分别为h1,h2,h3,-,hn.那么不整齐程度定义为:|h1-h2|+|h2-h3|+--+|hn

BZOJ 1110: [POI2007]砝码Odw

1110: [POI2007]砝码Odw Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 547  Solved: 296[Submit][Status][Discuss] Description 在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件恼人的工作.公司有一些固定容量的容器可以装这些砝码.他们想装尽量多的砝码以便搬运,并且丢弃剩下的砝码.每个容器可以装的砝码数量有限制,但是他们能够装的总重量不能超过每个容器的限制

BZOJ 1106: [POI2007]立方体大作战tet

1106: [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 682  Solved: 496[Submit][Status][Discuss] Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编号正好有两个元素.玩家每次可以交换两个相邻的元素.如

BZOJ 1111: [POI2007]四进制的天平Wag

1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 223  Solved: 151[Submit][Status][Discuss] Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称量出金子.她有很多的砝码,所有砝码的质量都是4的幂.Mary将金子置于

bzoj 1103: [POI2007]大都市meg

1103: [POI2007]大都市meg Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路.从每个村庄都恰好有一条路径到达村庄1(即比特堡).并且,对于每个村庄,它到比特堡的路径恰好 只经过编号比它的编号小的村庄.另外,对于所有道路而言,它们都不在除村庄以外的其他地点相遇.在这个未开 化的地方,从来