【XSY2727】Remove Dilworth定理 堆 树状数组 DP
题目描述
一个二维平面上有\(n\)个梯形,满足:
所有梯形的下底边在直线\(y=0\)上。
所有梯形的上底边在直线\(y=1\)上。
没有两个点的坐标相同。
你一次可以选择任意多个梯形,必须满足这些梯形两两重叠,然后删掉这些梯形。
问你最少几次可以删掉所有梯形。
\(n\leq {10}^5\)
题解
先把坐标离散化。
定义\(A\)为所有梯形组成的集合。
我们定义\(A\)上的严格偏序:两个梯形\(a<b\)当且仅当\(a\)与\(b\)不重叠且\(a\)在\(b\)的左边。
那么每次删掉的矩形就是一条反链。
所以这道题求的是最小反链覆盖。
根据Dilworth定理的对偶定理,有:最小反链覆盖数\(=\)最长链长度
所以我们只用求最长链长度就好了。
这个东西可以DP做。
\]
\(a11,a12,a21,a22\)分别代表一个梯形的上底边的两个端点的横坐标,下底边的两个端点的横坐标
可以把所有梯形按\(a11\)排序,维护一个以\(a12\)为关键字的堆,把队中的元素取出以\(a22\)位置,\(f_j\)为值插入到树状数组中,然后在树状数组中查询答案。
时间复杂度:\(O(n\log n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<utility>
using namespace std;
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > q;
struct p
{
int a11,a12,a21,a22;
};
p a[100010];
int cmp(p a,p b)
{
return a.a11<b.a11;
}
int f[100010];
int c[100010];
int m=0;
int d[200010];
void add(int x,int v)
{
for(;x<=m;x+=x&-x)
c[x]=max(c[x],v);
}
int query(int x)
{
int s=0;
for(;x;x-=x&-x)
s=max(s,c[x]);
return s;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&a[i].a11,&a[i].a12,&a[i].a21,&a[i].a22);
d[++m]=a[i].a21;
d[++m]=a[i].a22;
}
sort(d+1,d+m+1);
for(i=1;i<=n;i++)
{
a[i].a21=lower_bound(d+1,d+m+1,a[i].a21)-d;
a[i].a22=lower_bound(d+1,d+m+1,a[i].a22)-d;
}
sort(a+1,a+n+1,cmp);
int ans=0;
for(i=1;i<=n;i++)
{
q.push(pii(a[i].a12,i));
while(!q.empty()&&q.top().first<a[i].a11)
{
pii x=q.top();
q.pop();
add(a[x.second].a22,f[x.second]);
}
f[i]=query(a[i].a21)+1;
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}
【XSY2727】Remove Dilworth定理 堆 树状数组 DP的更多相关文章
- codeforces 597C (树状数组+DP)
题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k ...
- hdu 4622 Reincarnation trie树+树状数组/dp
题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...
- Codeforces 597C. Subsequences (树状数组+dp)
题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...
- HDU2227Find the nondecreasing subsequences(树状数组+DP)
题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1&l ...
- 【USACO】奶牛抗议 树状数组+dp
题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...
- CodeForces - 314C Sereja and Subsequences (树状数组+dp)
Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- [Codeforces261D]Maxim and Increasing Subsequence——树状数组+DP
题目链接: Codeforces261D 题目大意:$k$次询问,每次给出一个长度为$n$的序列$b$及$b$中的最大值$maxb$,构造出序列$a$为$t$个序列$b$连接而成,求$a$的最长上升子 ...
- hdu5489 树状数组+dp
2015-10-06 21:49:54 这题说的是个给了一个数组,然后删除任意起点的一个连续的L个数,然后求最长递增子序列<是递增,不是非递减>,用一个树状数组维护一下就ok了 #incl ...
随机推荐
- ubuntu 添加开机启动服务
新建umpserver.service [Unit] Description=UMPServer After=syslog.target network.target remote-fs.target ...
- java----牛客练习
1. 形式参数就是函数定义时设定的参数.例如函数头 int min(int x,int y,int z) 中 x,y,z 就是形参.实际参数是调用函数时所使用的实际的参数. 真正被传递的是实参 ...
- ICPC青岛站网络赛-C-高效模拟
嗯这道辣鸡题,当时我队友写了错误的代码,我稍微改动了,思路基本上是对了,但是就是超时,我第一直觉是我这个算法思路是没有任何问题的,但是就是TLE,我感觉这个算法已经优化的不能再优化了啊...后面就怀疑 ...
- Truncated Power Method for Sparse Eigenvalue Problems
目录 算法 k的选择 \(x\)的初始化 代码 抱歉,真的没怎么看懂,当然,估计和我现在没法静下心来好好看也有关系. 算法 想法非常非常简单吧,就是在原来幂法的基础上,每次迭代的时候再加个截断.当然, ...
- uva11300 分金币(中位数)
来源:https://vjudge.net/problem/UVA-11300 题意: 有n个人围成一圈,每个人有一定数量的金币,每次只能挪动一个位置,求挪动的最少金币使他们平分金币 题解: 蓝书p6 ...
- PEP 8 python编程规范
一 代码编排 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格. 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车. 类和to ...
- rest-framework的认证组件
认证组件 1.登录认证(与组件无关): 首先要在model表内添加用户表和token表: from django.db import models # Create your models here. ...
- 优化MySQL性能的几种方法-总结
原文:http://bbs.landingbj.com/t-0-245601-1.html 1.要选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越 小,在它上 ...
- vue 短信验证
直接贴代码: HTML <div class="phone"> <div class="number"> <p class=&qu ...
- TextView不用ScrollViewe也可以滚动的方法
转自:http://www.jb51.net/article/43377.htm android TextView不用ScrollViewe也可以滚动的方法. TextView textview = ...