USACO JANUARY——矩形[rects]

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

由于数据小,所以可以先把相同的矩形全部删去,然后处理的时候,输入保证长小于宽,再用长排序,求宽的最长不下降序列(本来可以写成nlogn的,但是想偷个懒~)

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1005;int maxx=0;
 7 int a[maxn],b[maxn],c[maxn];
 8 bool map[maxn][maxn];
 9 struct node{
10     int l,r;
11 }w[maxn];
12 int n;
13 bool comp(const node &q,const node &e)
14 {
15     if(q.l==e.l)return q.r<e.r;
16     return q.l<e.l;
17 }
18 int main()
19 {
20     freopen("recks.in","r",stdin);
21     freopen("recks.out","w",stdout);
22     scanf("%d",&n);
23     int temp=0;
24     for(int i=1;i<=n;i++)
25     {
26         int x,y;
27         scanf("%d%d",&x,&y);
28         if(map[x][y]==false)
29         {
30             map[x][y]=true;
31             map[y][x]=true;
32             w[++temp].l=x;w[temp].r=y;
33             if(w[temp].l>w[temp].r)swap(w[temp].l,w[temp].r);
34         }
35         else continue;
36     }
37     sort(w+1,w+temp+1,comp);
38     for(int i=1;i<=temp;i++)c[i]=1;
39     for(int i=2;i<=temp;i++)
40     {
41         maxx=0;
42         for(int j=1;j<i;j++)
43         {
44             if(w[i].r>w[j].r&&maxx<c[j]+1)
45             {
46                 maxx=c[j]+1;
47                 c[i]=maxx;
48                 b[i]=j;
49             }
50             else if(w[i].r==w[j].r&&w[i].l!=w[j].l&&maxx<c[j]+1)
51             {
52                 maxx=c[j]+1;
53                 c[i]=maxx;
54                 b[i]=j;
55             }
56         }
57     }
58     int pos=0;maxx=0;
59     for(int i=1;i<=temp;i++)
60     {
61         if(c[i]>maxx)
62         {
63             maxx=c[i];pos=i;
64         }
65     }
66     int ans=0;
67     while(b[pos])
68     {
69         ans++;
70         pos=b[pos];
71     }
72     printf("%d",ans+1);
73     return 0;
74 }
时间: 2024-08-07 20:14:24

USACO JANUARY——矩形[rects]的相关文章

【USACO 1.4.1】铺放矩形块

[描述] 给定4个矩形块,找出一个最小的封闭矩形将这4个矩形块放入,但不得相互重叠.所谓最小矩形指该矩形面积最小. 所有4个矩形块的边都与封闭矩形的边相平行,图1示出了铺放4个矩形块的6种方案.这6种方案是仅可能的基本铺放方案.因为其它方案能由基本方案通过旋转和镜像反射得到. 可能存在满足条件且有着同样面积的各种不同的封闭矩形,你应该输出所有这些封闭矩形的边长. (分类注解:这里的分类依据可以视为是不同的面积计算公式.) [格式] INPUT FORMAT: (file packrec.in)

POJ 2230 Watchcow &amp;&amp; USACO Watchcow 2005 January Silver (欧拉回路)

题意: Bessie 最近做了农场看守,他每天晚上的工作就是巡视农场并且保证没有坏人破坏农场.从谷仓出发去巡视,并且最终回到谷仓. Bessie 视力不是很好,不能像其他农场的看守一样,对农场的每一条连接不同场地的路走一遍就可以发现是不是有异常情况,他需要每条路都走两遍,并且这两边必须是不同的方向,因为他觉得自己应该不会两次都忽略农场中的异常情况. 每块地之间一定会由至少一条路相连.现在的任务就是帮他制定巡视路线.前提假设一定存在满足题意的路径. 输入: 第一行输入两个数N(2 <= N <=

USACO 5.5.1 求矩形并的周长

首先将矩形离散化成一系列线段, 这里以横边为例, 我们将横边离散化之后按照纵坐标排序, 纵坐标相同的时候始边在前. 然后对于一个线段,对应区间的pos[j]++, 如果pos[j]由0->1 或者由 1 -> 0那么ans++.  这个过程还可以使用线段树优化, 代码如下: /* ID: m1500293 LANG: C++ PROG: picture */ #include <cstdio> #include <algorithm> #include <cstr

[USACO] 铺放矩形块 题解

题目大意: 给定4个矩形块,找出一个最小的封闭矩形将这4个矩形块放入,但不得相互重叠.所谓最小矩形指该矩形面积最小. 思路: 枚举矩形的安放顺序,再按照题目所给的图判断即可,主要要想到枚举. 代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int i,n,sum=10009,p[5],q[5],a[5],b[5]; 4 struct data { int x,y; }ans[10000]; 5 bool used[5]; 6 7 b

USACO bigborn 最大矩形

这一个题就是问你在有树的格子农田里面最大的没有树的方格多大,这道题可以使用动态规划解决,定义dp[i][j]为i j开始的最大方形的边长 那么dp[i][j] = min(dp[i+1][j], dp[i][j+1], dp[i+1][j+1]) + 1,  初识dp[i][j] = 0, 代码如下: /* ID: m1500293 LANG: C++ PROG: bigbrn */ #include <cstdio> #include <algorithm> #include &

USACO 2017 January Platinum

因为之前忘做了,赶紧补上. T1.Promotion Counting 题目大意:给定一个以1为根的N个节点的树(N<=100,000),每个节点有一个权值,对于每个节点求出权值比它大的子孙的个数. 思路:肯定先要求出dfs序,首先无脑想到主席树,后来发现只要按权值从大到小处理就不用那么麻烦了. #include<cstdio> #include<algorithm> using namespace std; char B[1<<26],*S=B,C;int X;

【组队赛#9】USACO 2006 January Bronze

[A题]A. Stump Removal 链接click here~~ [题目大意]一排高低不平的树桩,需要用炸弹全部炸掉,如果一个树桩的前面和后面的树桩高度都比它小,炸弹爆炸的时候会同时炸掉,求尽可能少的放置炸弹的数目,输出树桩的编号. [解题思路] 理解题意,从左往右扫,如果当前位置右边或左边的比它低了或相等,那么就把这个位置炸掉,然后把能炸的都炸掉,判断当前树桩前面的和后面的高度比较, 核心代码 for(int i=1;i<=n+1;i++) { if(a[i]>=a[i-1]&

USACO 2019 January Contest Platinum T3: Train Tracking 2

题目大意 每天特快列车都会经过农场.列车有N节车厢(1≤N≤10^5),每节车厢上有一个1到10^9之间的正整数编号:不同的车厢可能会有相同的编号. 平时,Bessie会观察驶过的列车,记录车厢的编号.但是今天雾实在太浓了,Bessie一个编号也看不见!幸运的是,她从城市里某个可靠的信息源获知了列车编号序列的所有滑动窗口中的最小值.具体地说,她得到了一个正整数K,以及N−K+1个正整数c1,…,cN+1−K,其中ci是车厢i,i+1,…,i+K−1之中编号的最小值. 帮助Bessie求出满足所有

USACO window area 漂浮法

这道题是求解几个矩形未被遮挡的面积问题, 可以使用漂浮法来解决, 什么事漂浮法请看这里http://www.nocow.cn/index.php/USACO/window, 代码如下: /* ID: m1500293 LANG: C++ PROG: window */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[80]; int buttom,