3359: [Usaco2004 Jan]矩形

3359: [Usaco2004 Jan]矩形

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 8  Solved: 5
[Submit][Status][Discuss]

Description

给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得

有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个

矩形P2,则P2的一边小于P1的一边,并且P9的另一边不超过P1的另一边.如果两个矩形相同,视为不包含.如2 x 1的矩形被2x2的矩形包含,不被1 x 2的矩形包含.

注意:矩形的顺序可以是任意的,且矩形可以旋转.

Input

第1行:整数N.

第2到N+1行:矩形的长和宽,均为整数.

Output

一行,输出最大的包含数K.

Sample Input

4
8 14
16 28
29 12
14 8

Sample Output

2

HINT

Source

Orange

题解:其实很明显有更好的办法的,但是我还是逗比的建立了一个拓扑图(A-->B表示A举行包含在B里面,为了方便,我还弄了个-1*-1的矩形作为源点),然后去用spfa求出从源点出发各个点的最长路径,然后求出最大值即可

 1 type
 2         point=^node;
 3         node=record
 4                 g,w:longint;
 5                 next:point;
 6         end;
 7 var
 8         i,j,k,l,m,n,f,r:longint;
 9         p:point;
10         a:array[0..10000,1..2] of longint;
11         b:array[0..10000] of point;
12         c,g:array[0..10000] of longint;
13         d:array[0..100000] of longint;
14 procedure add(x,y,z:longint);inline;
15         var p:point;
16         begin
17                 new(p);p^.g:=y;p^.w:=z;
18                 p^.next:=b[x];b[x]:=p;
19         end;
20 procedure swap(var x,y:longint);inline;
21         var z:longint;
22         begin
23                 z:=x;x:=y;y:=z;
24         end;
25 procedure sort(l,r:longint);inline;
26         var i,j,x,y:longint;
27         begin
28                 i:=l;j:=r;x:=a[(l+r) div 2,1];y:=a[(l+r) div 2,2];
29                 repeat
30                         while (a[i,1]<x) or ((a[i,1]=x) and (a[i,2]<y)) do inc(i);
31                         while (a[j,1]>x) or ((a[j,1]=x) and (a[j,2]>y)) do dec(j);
32                         if i<=j then
33                                 begin
34                                         swap(a[i,1],a[j,1]);
35                                         swap(a[i,2],a[j,2]);
36                                         inc(i);dec(j);
37                                 end;
38                 until i>j;
39                 if i<r then sort(i,r);
40                 if l<j then sort(l,j);
41         end;
42 begin
43         readln(n);
44         for i:=1 to n do
45                 begin
46                         readln(a[i,1],a[i,2]);
47                         if a[i,1]>a[i,2] then swap(a[i,1],a[i,2]);
48                 end;
49         a[n+1,1]:=-1;a[n+1,2]:=-1;n:=n+1;
50         sort(1,n);
51         for i:=1 to n do b[i]:=nil;
52         for i:=1 to n-1 do
53                 for j:=i+1 to n do
54                         if (a[j,2]>a[i,2]) or ((a[j,2]>=a[i,2]) and (a[j,1]>a[i,1])) then
55                                 begin
56                                         add(i,j,1);
57                                 end;
58         f:=1;r:=2;d[1]:=1;g[1]:=1;
59         fillchar(c,sizeof(c),0);
60         while f<r do
61                 begin
62                         p:=b[d[f]];
63                         while p<>nil do
64                                 begin
65                                         if (c[d[f]]+p^.w)>c[p^.g] then
66                                                 begin
67                                                         c[p^.g]:=p^.w+c[d[f]];
68                                                         if g[p^.g]=0 then
69                                                                 begin
70                                                                         g[p^.g]:=1;
71                                                                         d[r]:=p^.g;
72                                                                         inc(r);
73                                                                 end;
74                                                 end;
75                                         p:=p^.next;
76                                 end;
77                         g[d[f]]:=0;
78                         inc(f);
79                 end;
80         l:=0;
81         for i:=1 to n do if c[i]>l then l:=c[i];
82         writeln(l);
83 end.
时间: 2024-11-05 20:41:07

3359: [Usaco2004 Jan]矩形的相关文章

BZOJ 3359: [Usaco2004 Jan]矩形( dp )

数据范围这么小..怎么乱搞都可以吧... 先排序一遍然后O(n²) dp ------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; const int maxn = 109; struct R { int x, y; inline void Read() { scanf("%d%d", &x, &

3361: [Usaco2004 Jan]培根距离

3361: [Usaco2004 Jan]培根距离 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 16  Solved: 13[Submit][Status][Discuss] Description 贝茜和其他奶牛联系是通过一连串的中间奶牛传递的,所以当第一头牛和贝茜联系,第二头牛和第一头牛联系,第三头牛和第二头牛联系,…一贝茜就能依次联系到其中的每一头奶牛. 联系长度是指传递过程中涉及的奶牛的数目(不包括贝茜).任何一头奶牛(不包括贝茜)的培

3360: [Usaco2004 Jan]算二十四

3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Status][Discuss] Description 写一个程序,给出D(2≤D≤10)个数字,按原顺序在数字间加+,一,×算出24,且不使用括 号.优先级按正常的优先级处理,即先做乘法后做加减法.输出有多少种不同的方案数. Input 第1行:一个整数D. 第2到D+1行:D个整数,在1到50之间. O

BZOJ3356 : [Usaco2004 Jan]禁闭围栏

首先将坐标离散化,考虑从左往右扫描线 碰到插入操作则插入 碰到删除操作的: 当前包含i的矩形数=y1在[1,y2[i]]之间的矩形数-y2在[1,y1[i]-1]之间的矩形数 用两棵树状数组维护即可,时间复杂度$O(n\log n)$. #include<cstdio> #include<algorithm> #define N 500010 int n,m,i,x1,y1,x2,y2,b[N],bl[N],br[N],now,ans=-1,cnt; struct P{int x,

BZOJ3355 : [Usaco2004 Jan]有序奶牛

对于一条边x->y,若去掉之后x不能到达y,那么它是必需的. 首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边. 对于每个点,维护一个bitset,表示当前从哪些点可以到达自己. 时间复杂度$O(\frac{nm}{32})$. #include<cstdio> #include<bitset> #include<algorithm> using namespace std; typedef pair<int,int

BZOJ 3361 [Usaco2004 Jan]培根距离

SPFA裸题,练手练手~ #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; int const maxn = 2*10005; struct node{ int u,v,w,next; node(){} node(int _u,int _v,int _w,int _next){ u = _u; v = _v; w =

[bzoj3360] [Usaco2004 Jan]算二十四

O(3^9)枚举符号.. 成功垫底QAQ...幸好没破坏这题100%的AC率.. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int l[11],r[11]; 6 int fh[11],num[11],a[11]; 7 int i,j,k,n,m,ans; 8 9 int ra;char rx; 10 inline int read(){ 11

BZOJ3355

3355: [Usaco2004 Jan]有序奶牛 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 37  Solved: 19[Submit][Status][Discuss] Description 约翰的N(1≤N≤1500)头牛排成一行挤奶时,有确定的顺序.牛被编成连续的号码1..N,他拥有L条关于奶牛顺序的信息,所有的信息都写成"A在B的前面"这样的形式,而且他知道最后一条是多余的.他觉得,有些冗余信息可以由其他信息推出,可以对

【BZOJ3885】【Usaco2015 Jan】Cow Rectangles 某奇怪的最大子矩形

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44095063"); } 题意: 坐标系上给出n个点,分"H"和"G",一个整点坐标上至多一个点. 现在求一个不包含"G"的包含尽量多"H"的子矩形,然后