首页 > 其他分享 >qoj8528 Chords 题解

qoj8528 Chords 题解

时间:2024-10-14 10:37:35浏览次数:1  
标签:Chords int 题解 mid lst MAXN qoj8528 ans dp

数据随机有什么用?用你惊人的注意力可以观察到答案的值域在 \(800\) 附近。

考虑暴力 dp,设 \(dp_{l,r}\) 表示值域在 \([l,r]\) 中最多能选几个区间。假设 \(r\) 对应区间的左端点为 \(lst\),那么有转移方程 \(dp_{l,r}=dp_{l,lst-1}+dp_{lst+1,r-1}+1\)。时间复杂度 \(O(n^2)\)。

因为答案很小,考虑交换 dp 答案和状态。设 \(dp_{r,i}\) 表示值域右端点在 \(r\),答案为 \(i\) 时左端点最大值是多少。对于每一个 \(r\),我们可以先二分求出 \([lst+1,r-1]\) 中最多可以选 \(x\) 个区间,那么有转移方程:\(dp_{r,i} = \max(dp_{r-1,i},dp_{lst-1,i-x-1})\)。时间复杂度 \(O(n \log V + nV)\),实测 \(V\) 取 \(1000\) 能过。

//dzzfjldyqqwsxdhrdhcyxll
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f
const int MAXN = 1e5 + 10;
int n,l[MAXN],r[MAXN],lst[2 * MAXN],dp[2 * MAXN][1205];
signed main() {
	cin >> n;
	for(int i = 1;i <= n;i++) {
		cin >> l[i] >> r[i];
		lst[r[i]] = l[i];
	}
	memset(dp,-inf,sizeof dp);
	dp[0][0] = 0;
	for(int i = 1;i <= 2 * n;i++) {
		dp[i][0] = i;
		if(lst[i] == 0) {
			for(int j = 1;j <= 1200;j++) dp[i][j] = dp[i - 1][j];
		} else {
			for(int j = 1;j <= 1200;j++) dp[i][j] = dp[i - 1][j];
			int L = lst[i] + 1,R = i - 1;
			int ans = 0,ll = 0,rr = 1200;
			while(ll <= rr) {
				int mid = (ll + rr) >> 1;
				if(dp[R][mid] >= L) ans = mid,ll = mid + 1;
				else rr = mid - 1;
			}
			ans++;
			for(int j = 1;j <= 1200;j++) {
				if(ans >= j) dp[i][j] = max(dp[i][j],lst[i]);
				else dp[i][j] = max(dp[i][j],dp[lst[i]][j - ans]);
			}
		}
	}
	for(int i = 1200;i >= 0;i--) {
		if(dp[2 * n][i] >= 1) {
			cout << i;
			return 0;
		}
	}
	return 0;
}

标签:Chords,int,题解,mid,lst,MAXN,qoj8528,ans,dp
From: https://www.cnblogs.com/Creeperl/p/18463553

相关文章

  • Codeforces Round 978 (Div. 2) A-D1 题解
    我的同学还在VP,排名马上放声明:不要觉得有subtask的题目只做Easyversion没有意义,从这里也能捞很多分,况且有的时候并不是简单和难的区别,而是考不同的算法A.BustoPénjamo题意有一辆车上面有$r$排座位,每排有$2$个座位,现在共$n$个家庭出行坐公交车,每个家庭$a_i$......
  • 洛谷 P2071 座位安排题解
    因为一个人坐一个座位很像二分图,题意转化为二分图最大匹配。把人放在左部,把座位放在右部,一排座位占右部的两个点。假设人想要坐在\(x\)排,那么建图的时候就可以将这个人连向\(2x\)和\(2x+1\)。这样一排就对应着两个人了。由于\(n\le4000\),直接由朴素的\(O(nm)\)的匈牙利......
  • 【题解】CEIT 2024 第三周算法训练 讲义题解
    A.Orange的作文排版关于处理若干行输入,我们可以用while结合getline函数来完成,每次读取一行,就让行数+1,然后每次利用string的size方法得到当前行的列数,更新最长的列,最后得到答案。#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;inta=0;i......
  • 01背包问题/Ieee全球极限编程大赛11.0题BeetleBag题解/洛谷P1926 小书童——刷题大军
    基础01背包问题概述给出一个容积为V的背包,有i个物体,每个物体都有自己的体积和价值,用Vi和Wi表示,要将这些物体装进背包里面,问怎样才能使得装入物体的总价值最大?最大为多少?解决思路1.如果你没能正确理解这道题,尤其是对于很多新手,第一反应可能是将所有物体的单位价值算出来,然后......
  • 带中位数写法的快速排序再讨论 & leetcode 215. Kth Largest Element in an Array题解
    带中位数写法的快速排序再讨论&leetcode215.KthLargestElementinanArray题解 探讨带中位数的写法本身classSolution{public:intfindKthLargest(std::vector<int>&nums,intk){returnfakeQuickSort(nums,k,0,nums.size()-1);}privat......
  • ABC375 (A~G) 题解
    也是补完整场了。(虽然只有一题要补A模拟。B模拟。C模拟。D模拟。EE-3TeamDivision还想了蛮久的。题意:有三个队伍,各有一些人,人有能力值,人可以换队伍。问三个队伍能力值相同最少需要让多少人交换队伍。人数\(\le100\),值域\(\le1500\)题目还是挺误导人的,如......
  • [JLOI2015] 有意义的字符串 题解
    看到这个\(7\times10^{18}\)的模数已经可以摆烂了。不是,你告诉我这东西跟矩阵快速幂优化DP有关系??观察到这个题显然不能硬做,因为你显然不能直接算小数部分,而且还有个取模很难受。所以我们希望把一切的计算都基于整数。这个时候我们就要思考,有什么东西可以把根号转化为整数......
  • Codeforces Round 899 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1882A.IncreasingSequence从1开始慢慢和\(a[i]\)的所有值比较,注意最后一个位置特判下#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<......
  • 带余除法题解
    题面带余除法题目背景注意:提交至洛谷时,请使用标准输入输出,而非文件输入输出。NOTICE:WhensubmittingyourcodeonLuogusite,pleaseusestandardIOinsteadoffileIO.点我(或在本题底部)下载中文试题PDF。Clickhere(oratthebottomofthispage)todownload......
  • Tarjan缩点题单 刷题题解
    Tarjan缩点可以将一个图的每个强连通分量缩成一个点,然后构建新图,该图就会变成一个有向无环图。变成有向无环图之后就能结合最短路,拓扑......解决相应题目洛谷题单分享:https://www.luogu.com.cn/training/526565前几道是绿题,没什么好写的,大致过一下1.强连通分量题目链接:https:......