BOJ 394

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

Problem I. The Longest Sequence of
Rectangles
Description
A rectangle is specified by a pair of coordinates (x1 , y1) and (x2 , y2)
indicating its lower-left and upper-right corners (x1 <= x2 and y1 <= y2). For
a pair of rectangles, A = ((X_A1, Y_A1), (X_A2, Y_A2)) and B = ((X_B1, Y_B1),
(X_B2, Y_B2)), we define A <= B if X_A2<X_B1 and Y_A2<Y_B1. Given a
number of rectangles on the plane, you are asked to find the length L of the
longest sequence of rectangles (A1, A2, ..., AL) such that A1 <= A2 <= ...
<= AL.
Input
The input contains multiple test cases. The first line of the input is an integer
T, indicating the number of test cases. Each test case begins with a line
containing a single integer n (1 <= n <= 100000), indicating the number of
rectangles. Each of the next n lines contains four integers x1, y1, x2, y2 (-
1000000 <= x1 < x2 <= 1000000, -1000000 <= y1 < y2 <= 1000000),
indicating the lower left and upper right corners of a rectangle.
Output
For each input test case, output a single integer indicating the length of the
longest sequence.
Sample Input
2
3
1 5 2 8
3 -1 5 4
10 10 20 20
2
2 1 4 5
6 5 8 10
Sample Output
2
1

解题思路:(此题的原型就是上一篇日志nlogn最长上升子序列(LIS) )显然,最终的答案序列中矩形的左下角和右上角点坐标一定是按x严格递增的。这就给了我们将二维问题降至一维的思路。将每个矩形视为两个点(左下角和右上   角)的组合。将这2N 个点按照x坐标排序。这样可以将问题从二维空间降至一维空间:维护数组y[m] ,表示长度为m矩形序列的最后一个矩形y坐标最小是多少。依次遍历这排序后的2N 个点。若当前点为矩形的左下角,二分查找该点的y坐标在F数组中的位置。若当前点为矩形的右上角,则用其左下角的值更新F 数组。之所以不可以立即更新F 数组,是因为要求矩形序列中后一个矩形的左下角严格在前一个的右上方。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

const int MV=200010;

struct point{
    int x,y,flag,id;
    bool operator<(const point& t)const{
        if(x!=t.x)return x<t.x;
        return flag < t.flag;
    }
}p[MV];

int y[MV], pos[MV];

int main(){
    int n, T;
    scanf("%d", &T);
    while(T--){
    	scanf("%d", &n);
        if(n==0)break;
        for( int i=0;i<n;i++){
            scanf("%d%d",&p[2*i].x,&p[2*i].y);
            p[2*i].flag=0;

            scanf("%d%d",&p[2*i+1].x,&p[2*i+1].y);
            p[2*i+1].flag=1;

            p[2*i].id=p[2*i+1].id=i;
        }
        n*=2;
        sort(p,p+n);

        int cnt=0;

        for(int i=0;i<n;i++){
            if(p[i].flag == 0){
                    pos[p[i].id] = lower_bound(y+1, y+1+cnt, p[i].y) - y ;
            } else {
                int tp = pos[p[i].id];
                if(tp > cnt)y[++cnt] = p[i].y;
                else y[tp] = min(y[tp], p[i].y);
            }
        }

        printf("%d\n",cnt);
    }
    return 0;
}


 

经典状态dp题目 POJ 1185 炮兵阵地 一般这类题目列会很小10左右,我们需要枚举所有行,对于当前行,其放炮的位置只与上一行和上上行有关,我们记当前行状态和上一行状态便可转移了,dp数组开3维即可。 在枚举每一行放炮兵的方法时,可以预处理方便获得所有可能放法。具体细节见代码。总体复杂度O(Row*70*70*70),70是预处理得到的每一行最多放法。打表很容易看出来。 #include #inclu 阅读详情

相关推荐

存储管理基于GPT分区表的硬盘标准化分区方案:Windows系统下多场景磁盘布局与文件系统配置规范

内容概要:本文档旨在规范计算机及服务器硬盘的分区标准,涵盖分区表类型选择、文件系统格式、标准分区结构及不同容量硬盘的分区参考方案。明确新设备应统一采用GPT分区表,支持大容量硬盘、UEFI启动和更高稳定性,禁用传统的MBR格式;规定EFI引导分区使用FAT32,系统与数据分区采用NTFS,确保兼容性与安全性。标准分区结构包括EFI引导分区(500MB)、MSR保留分区(16MB)、C盘系统分区(150GB~300GB)和D盘数据分区(剩余空间),并针对512GB、1TB和2TB以上硬盘提供具体容量分配建议,提升系统性能与数据管理效率。; 适合人群:IT运维人员、系统管理员、硬件部署工程师及相关技术人员; 使用场景及目标:①指导新装机或服务器部署时的硬盘合理分区;②防止因分区不当导致的系统卡顿、空间浪费或数据泄露;③统一企业内部设备部署标准,提升维护效率; 阅读建议:此文档为实操性技术规范,建议结合实际装机流程对照执行,并在部署前进行方案审核,确保符合GPT+UEFI标准架构要求。

BOJ 394(LIS应用)(nlogn算法)

题目链接:点击打开链接 题目虽然是给的二维坐标,但是根据题目down_left和upper_right是“绝对”的上升关系 所以这自然就变成了我们熟悉的LIS,由于数据量很大,所以我们只能用N(log n)的做法,使用N^2的做法请看另一篇博文 点击打开链接 所以以后还是都写nlogn的好了,以免T

阿歇的专栏 768

标准控制柜_机箱机柜.rar

标准控制柜_机箱机柜.rar

最长单调递增子序列 poj 2544 || HDU 3998

单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列。首先,从定义上明确我们的问题。给定序列a1, a2, …, an,如果存在满足下列条件的子序列 ai1i2im, (其中i1 即称为一个原序列的长度为m的单调递增子序列,那么,现在的问题是我们要找出一个序列的最长的单调递增子序列。 直观上来说,一个序列Sn,它有2n个子序列,枚举所有的子序列,找出其中单调递

1292765944的专栏 2432

HDU 4734

比赛的时候先写了个裸的数位dp T掉了,然后加加剪枝过了

1292765944的专栏 2382

POJ 3666 Making the Grade

这个题要往DP上想(左偏树什么的也不会) 首先要知道这样一个结论:一定存在一个最优解,使得整理后的数组中不存在整理前数组中不存在的数,亦即:对于每个Bi,一定存在j,使得Bi=Aj。 可以这么想,在做调整时,一定是这么做的,先选出连续的三个数abc, 假设a            如果b>=a && b            如果b            如果b>c,则最小的调整可以是

1292765944的专栏 2150

HDU 2476

卡了我三天的DP 看了这篇博客才略微懂点http://blog.csdn.net/hyogahyoga/article/details/7886416 #include #include #include using namespace std; string a,b; int dp[200][200]; int f[200]; void solve(int i,int j) { if

1292765944的专栏 2137

UVALive 6190

这道题卡了我们整场,我们想到了二分答案+判断可行性,但是卡在判断可行性上了,首先n^2的复杂度是肯定不行的,正解要优化到O(n) dp[i]表示以第i个单词作为一行结尾是否可行,初始化dp[0]=1,然后是一个迭代的过程,由dp[i]推出一个区间可行解dp[left~right]=1;接下来从left+1推出下一个区间可行解,最后在加点判断即可。注意要在整个过程中维护一个变量k表示当前最大的满足

1292765944的专栏 1932

HDU 4049

好题mark 1. 图论方法(最大权闭合子图) #include #include #define min(a,b) ((a)<(b)?(a):(b)) const int N=1110; const int E=5000; const int oo=1000000000; int node,src,dest,ne; int head[N],work[N],Q[N],dist[N]

1292765944的专栏 1506

hdu 4055

不错的dp long long 果然比int慢好多 #include #include #include #include #include #define N 1010 #define mod 1000000007 using namespace std; typedef long long ll; int sum[N][N]; char s[1010]; int main(){

1292765944的专栏 1479

zoj 2338

HanioTower的加强版 记f[n][m]为n个disc,m个peg的Hanoi问题,则有dp公式f[n][m]=min{f[n-k][m-1]+2*f[k][m]}。即把上面的k个disc利用m个peg转移某个中间peg,再把下面的n-k个disc利用m-1个peg转移到目标peg,最后把上面的k个disc利用m个peg移到目标peg。dp过程记下使得f[n][m]最小的g[n][m]

1292765944的专栏 1477

POJ 3345 Bribing FIPA 树形DP

这个题就是一个树形DP,输入处理有点恶心,RE好几次。其他要注意的地方我都标注释了 #include #include #include #define inf 1e9 typedef long long ll; int n,m,k,cou; char map[205][105]; int mon[205],head[205]; int dps[205][205]; struct poin

1292765944的专栏 1466

HDU 1428 漫步校园

我队列开小了,改成循环队列就过了,真坑爹.... 先SPFA求出各点到终点的最短距离,然后在记忆化搜一遍,记录路径数目,注意在搜的过程中,如果移动点的dis大于等于当前位置,那么就是不可以走的,反之就是可以走的。 #include #include #define inf 1e9 using namespace std; int n,t[52][52],dis[52][52]; __int

1292765944的专栏 1457

POJ 3638 Moogle

dp[i][j]表示在i位置放第j个的最小error,简单DP即可 #include #include #include #define inf 1e9; int h,in[210]; double e[210][210]; double dp[210][210]; double min(double a,double b){ return a>b?b:a; } int main(){

1292765944的专栏 1382

POJ 2228 Naptime

这个考的是环形DP,状态方程好列,需要注意的是要分两种情况讨论:一是第一段时间睡觉,另外是第一段时间不睡。剩下的DP过程一样,在最后处理结果上不同 #include #include #include typedef long long ll; int n,b,a[3900]; ll dp[2][3900][2]; ll max(ll a,ll b){ return a>b?a:b; }

1292765944的专栏 1359

zoj 3397

这是一道Hanio Tower的变形题 要按绩点从低到高处理: 如果他已在目标位置,那么不动; 如果他要从计算机(数学)到中文,或者从中文到计算机(数学),那么首先把绩点更高的人移到数学(计算机),这部分递归做,然后实现转系; 如果他要从计算机(数学)到数学(计算机),那么就相当于先做从计算机(数学)到中文,再做从中文到数学(计算机); #include #include

1292765944的专栏 1330

zoj 3494

数位dp+ac自动机 #include #include #include #include #define mod 1000000009 #define N 2010 typedef long long ll; using namespace std; char s[210]; int next[N][2],nextd[N][10],pos,flag[N],fail[N]; ll dp

1292765944的专栏 1318

分布式电源接入对配电网影响的研究(Matlab代码实现)

内容概要:本文围绕分布式电源接入对配电网的影响展开研究,利用Matlab进行建模仿真与代码实现,系统分析了分布式电源(如光伏、风电等)接入后对配电网在电能质量、潮流分布、电压稳定性、保护配置等方面的影响。研究涵盖了多种分布式电源类型与不同渗透率场景,通过构建典型的配电网模型,仿真其在正常运行及故障条件下的动态响应特性,重点探讨了分布式电源引起的电压越限、反向潮流、短路电流水平变化等问题,并提出了相应的优化调控策略与解决方案。同时,结合主动配电网的有功无功协调优化、鲁棒调度等高级应用,展示了如何借助现代优化算法提升系统接纳能力与运行经济性。; 适合人群:具备电力系统基础知识,熟悉Matlab/Simulink仿真环境,从事新能源接入、配电网规划与运行等相关领域的科研人员、工程师及高校研究生。; 使用场景及目标:①掌握分布式电源接入对配电网关键指标的影响机制;②学习基于Matlab的配电网建模与仿真方法;③理解并实现主动配电网的协调优化调度算法;④为实际工程中分布式电源并网方案设计与问题诊断提供理论支持和技术参考。; 阅读建议:建议读者结合文中提供的Matlab代码,逐步复现仿真案例,深入理解模型构建与算法实现细节,并尝试在不同参数设置或网络结构下进行拓展实验,以增强对系统动态行为的认知与分析能力。

CMake Linux 交叉编译工具链模板(嵌入式构建+CMake/toolchain+工程模板+交叉编译配置)

包含可本机构建的 C 工程和 Linux 目标 toolchain 文件,使用 CROSS_COMPILE 与可选 TARGET_SYSROOT 配置编译器及依赖搜索范围。 适用于嵌入式软件开发人员、驱动开发入门者及相关技术学习者。资源包含源码或模板、使用说明及验证范围说明。CMake 3.16+、C 编译器和对应构建工具;交叉编译需额外安装工具链。

上一篇: Codeforces Problem 161E - Polycarpus the Safecracker
下一篇: BOJ 396
Benzema67
博客等级 码龄15年 120粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值