bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27

1597: [Usaco2008 Mar]土地购买

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 697  Solved: 244
[Submit][Status][Discuss]

Description
农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1
<= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000).
每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换.
如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费.
他需要你帮助他找到最小的经费. Input* 第1行: 一个数: N * 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽
Output* 第一行: 最小的可行费用. Sample Input4
100 1
15 15
20 5
1 100

输入解释:

共有4块土地.

Sample Output
500

HINT

FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组
的价格分别为100,100,300, 总共500.

Source

____________________________________________

 1 Program Stone;
 2 var i,j,n,bist,head,tail,insn:longint;
 3     len,wid,f,que:array[0..100000]of int64;
 4  Procedure kp(t,w:longint);
 5  var i,j:longint;
 6      k,ml,mw:int64;
 7   begin
 8    i:=t;j:=w;ml:=len[(t+w)div 2];mw:=wid[(t+w)div 2];
 9    repeat
10     while (len[i]>ml)or((len[i]=ml)and(wid[i]<mw)) do inc(i);
11     while (len[j]<ml)or((len[j]=ml)and(wid[j]>mw)) do dec(j);
12     if i<=j then begin
13                   k:=len[i];len[i]:=len[j];len[j]:=k;
14                   k:=wid[i];wid[i]:=wid[j];wid[j]:=k;
15                   inc(i);dec(j);
16                  end;
17    until i>j;
18    if i<w then kp(i,w);
19    if j>t then kp(t,j);
20   end;
21  function delhead(i,j,k:longint):boolean;
22   begin
23     if f[j]-f[k]>-wid[i]*(len[j+1]-len[k+1]) then exit(true) else exit(false);
24   end;
25  function deltail(i,j,k:longint):boolean;
26   begin
27     if (f[i]-f[j])*(len[j+1]-len[k+1])>(f[j]-f[k])*(len[i+1]-len[j+1]) then exit(true)
28                                                                        else exit(false);
29   end;
30
31 Begin
32  assign(Input,‘input.in‘);reset(input);
33   readln(n);
34   for i:=1 to n do
35    readln(len[i],wid[i]);
36   kp(1,n);
37   insn:=0;bist:=0;
38   for i:=1 to n do
39    begin
40     if wid[i]>bist then begin
41                          bist:=wid[i];
42                          inc(insn);
43                          len[insn]:=len[i];
44                          wid[insn]:=wid[i];
45                         end;
46    end;
47   n:=insn;
48   head:=0;tail:=0;
49   for i:=1 to n do
50    begin
51      while (tail>head)and(delhead(i,que[head],que[head+1])) do inc(head);
52      j:=que[head];
53      f[i]:=f[j]+wid[i]*len[j+1];
54      while (tail>head)and(deltail(i,que[tail],que[tail-1])) do dec(tail);
55      inc(tail);
56      que[tail]:=i;
57    end;
58   writeln(f[n]);
59  close(input);
60 end.
61
62  
时间: 2024-10-21 13:55:50

bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27的相关文章

BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地

BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i转移比由j转移优(i>j), 那么 dp(i)+xv*yi+1 < dp(j)+xv*yj+1 化简得 (dp(i) - dp(j))/(yi+1-yj+1) > -xv 然后就斜率优化, 单调队列维护一个下凸函数 --------------------------------------

斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1396  Solved: 480 [Submit][Status] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽

bzoj 1597: [Usaco2008 Mar]土地购买

式子显然随便搞搞就行,,而且可以先把这些矩形排序,然后如果有比当前矩形x和y都大的矩形,这个矩形是可以忽略的. 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define lowbit(x) x&(-x) 4 #define inf 0x3f3f3f3f 5 #define eps 1e-5 6 #define N 100005 7 using namespace std; 8 inline int ra() 9 { 10 i

bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x上.只要改一下slope里的一个负号,就变成正常舒服的递增了. 这道题的要点其实是一开始h=0.不能h=1.这样就能把dp[0]纳入考虑.这是需要的. #include<iostream> #include<cstdio> #include<cstring> #includ

1597: [Usaco2008 Mar]土地购买

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4023  Solved: 1470[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地

1597: [Usaco2008 Mar]土地购买 [ dp+斜率优化 ] 未完

传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1979  Solved: 705[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每

【BZOJ】1597 [Usaco2008 Mar]土地购买

[算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 因为对于土地x和y,若满足a[x]<=a[y]&&b[x]<=b[y],则x土地可无条件包含在y土地中,所以x土地可以忽略. 于是对长度从小到大排序,第二关键字对宽度从小到大排序,处理掉可被包

【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2474  Solved: 900[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的