首页 > 其他分享 >P6390 [COCI2007-2008#4] POKLON 题解

P6390 [COCI2007-2008#4] POKLON 题解

时间:2024-03-07 13:36:58浏览次数:17  
标签:node le mathit int 题解 COCI2007 il P6390 define

感谢 @\(\color{#AEF}{\texttt{Celestial Cyan}}\) 大神对我的骚扰帮助。

分析

一眼 DP。

对于求最大满足条件区间数,我们定义状态函数 \(\mathit{f}_{i}\) 表示在第 \(1\) 到 \(i\) 个区间中选择,且必选第 \(i\) 个区间能够得到的最大长度。有转移方程:\(\mathit{f}_{i}=\max\{f[j]|\mathit{a}_{j}\le\mathit{a}_{i} \land \mathit{b}_{j} \ge \mathit{b}_{i} \}+1\)。

可以得到 \(50\) 分的 \(O(n^2)\) 的代码:

for(re int i=1;i<=n;++i){
	f[i]=1;
	for(re int j=1;j<i;++j){
		if(a[i].l>=a[j].l&&a[j].r>=a[i].r){
			if(f[j]+1>f[i]) f[i]=f[j]+1,nxt[i]=j;
		}
	}
}

考虑优化 \(\mathit{f}_{i}\) 的转移。这个代码与 LIS 模板几乎一致,所以很显然的也可以使用树状数组优化。因为我们需要记录方案,所以树状数组存 \(2\) 维:价值与该价值对应的下标。

我们将 \(\mathit{a},\mathit{b}\) 用一个结构体存放,按第一维从小到大排序。可以得到:对于每一个 \(i\),都有 \(1 \le j \le i,\mathit{a}_j \le \mathit{a}_i\)。这样我们就消除了区间左端点的影响。剩下的就用树状数组查询 $ \ge \mathit{b}_i$ 的最大的 \({f}_j\) 的值与其下标。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define PII pair<int,int>
#define x first
#define y second
const int N=1e5+10,MAXN=1e6+10;
int n;
PII f[N],tr[MAXN];
struct node{
	int l,r;
}a[N];
stack<int> st;
int id,maxx;
il bool cmp(node a,node b){return (a.l!=b.l)?(a.l<b.l):(a.r>b.r);}
il void insert(int x,int y,int id){
	while(x){
		if(tr[x].x<y) tr[x].x=y,tr[x].y=id;
		x-=x&(-x);
	}
	return ;
}
il PII query(int x){
	PII ans;ans={0,0};
	while(x<=MAXN){
		if(ans.x<tr[x].x) ans.x=tr[x].x,ans.y=tr[x].y;
		x+=x&(-x);
	}
	ans.x++;return ans;
}
il void read(){
	scanf("%lld",&n);
	for(re int i=1;i<=n;++i) scanf("%lld%lld",&a[i].l,&a[i].r);
	sort(a+1,a+n+1,cmp);
	return ;
}
il void solve(){
	for(re int i=1;i<=n;++i) f[i]=query(a[i].r),insert(a[i].r,f[i].x,i);
	for(re int i=1;i<=n;++i){
		if(maxx<f[i].x) maxx=f[i].x,id=i;
	}
	while(id!=0) st.push(id),id=f[id].y;
	return ;
}
il void print(){
	printf("%lld\n",maxx);
	while(!st.empty()){
		int now=st.top();st.pop();
		printf("%lld %lld\n",a[now].l,a[now].r);
	}
	return ;
}
signed main(){
	read(),solve(),print();
	return 0;
}

标签:node,le,mathit,int,题解,COCI2007,il,P6390,define
From: https://www.cnblogs.com/harmisyz/p/18058689

相关文章

  • UVA13095 Tobby and Query 题解
    分析一眼莫队(虽然通过这题的范围显然看出出题人用的不是莫队)。我们定义\(\mathit{cnt}_{i}\)表示数字\(i\)出现的次数。在指针的拓展增加\(x\)时,若有\(\mathit{cnt}_{x}+1=1\),则表示在在这个区间里,\(x\)是第一次出现的,我们可以将答案加\(1\);在指针的收缩减去\(x\)时,......
  • P5017题解
    前言做这道题,首先要了解\(dp\)。\(dp\)一般有三个步骤(个人理解):根据题意确定状态。根据状态的定义推出状态转移方程,一般有两种:填表法和刷表法。填表法就是普通\(dp\),用前面的状态转移到现在的状态,例:\(f[i]=f[i-1]+a[i]\)。刷表法就是在现有的基础上(\(f[i]\)已知),去推出\(f[......
  • SP20848 IGAME - Interesting Game 题解
    分析数位DP一眼题。对于一个\(k\)位的数\(s\),我们不妨将其看做由数字\(s_1,s_2,s_3,\dots,s_k\)这\(k\)个数字拼接起来的。而题意是每个人可以将\(s_1,s_2,s_3,\dots,s_k\)中的任意一个减去任意数字,保证不减去\(0\)且结果\(\ge0\)。显然,在我们将这\(k\)个数看......
  • AT_abc216_g [ABC216G] 01Sequence 题解
    分析一道差分约束题。我们令\(\mathit{sum}_{i}\)表示\(1\)到\(i\)中,\(1\)的数量,根据题意可得:\(\mathit{sum}_{l_i-1}+x_i\le\mathit{sum}_{r_i}\)\(\mathit{sum}_{l+1}+(-1)\le\mathit{sum}_{l}\)\(\mathit{sum}_{l}+0\le\mathit{sum}_{l+1}\)因为我们要尽......
  • CF1066E 题解
    Solution首先不难想到计算\(a\)的每一位对答案产生的贡献,然后题目告诉我们\(b\)每次会往右移一位,然后结合样例可以发现:对于\(a\)的第\(i\)位,能与其产生贡献的条件是:\(a_i=1\)且\(b_j=1(i\leqj)\),对答案的贡献不难想出即为\(2^{i-1}\times\sum\limits_{j=i}^{m}b_j......
  • AT_abl_e Replace Digits 题解
    分析线段树模板题。维护一个区间\([l,r]\)中\(\sum\limits_{i=l}^r10^{n-i}\)的答案。将某个区间\([l,r]\)全部修改成\(x\)之后的表示的数就是\(x\times(\sum\limits_{i=l}^r10^{n-i})\)。区间修改可以用线段树,用快速幂或者预处理弄出来\(10^x\),建树的时候就能把每......
  • AT_abl_d Flat Subsequence 题解
    分析线段树模板题。一眼DP。定义状态函数\(\mathit{f}_i\)表示前\(i\)个数中,必选\(\mathit{A}_i\)时\(B\)的最大长度。则有转移方程:\(\mathit{f}_i=\max\{f_j|((1\lej\lei-1)\land(-k\leA_i-A_j\lek))\}+1\)。答案就是\(\max\limits_{i=1}^{n}\mathit{f}_i......
  • CF808E 题解
    很好的一道分类讨论题。观察数据范围,\(w\leq3\),不难想到,将\(w\)分为\(1,2,3\)种情况,如果直接贪心选会不难发现是错的。但是如果\(w\)的值只有\(2\)种,就像\(w=1/2\)的情况,将\(w=1/2\)的数据按价值排序,最后枚举每种选多少即可。但是\(w=3\)就会显得难以处理,需要讨......
  • CF1824B1 LuoTianyi and the Floating Islands (Easy Version) 题解
    分析按照\(k\)的奇偶分开考虑。\(k\)为奇数。一个好的节点有且仅有一个在任意两个有人的节点\(i,j\)的路径的交点上的最优位置。若该交点偏移\(1\)步,则必然会使路径长度和\(+1\)。故期望为\(1\)。\(k\)为偶数。任意一个好的节点仍然在任意两个有人的节点\(i,j\)的......
  • 【教程】HBuilderX开发实践:隐私合规检测问题解决方案
    文章目录摘要引言正文1、违规收集个人信息2、APP强制、频繁、过度索取权限知识点补充总结 摘要本篇博客介绍了在使用HBuilderX进行开发过程中,常遇到的隐私合规问题,并提供了相应的解决方案。主要包括违规收集个人信息和APP强制、频繁、过度索取权限两方面。......