首页 > 其他分享 >洛谷 P7931

洛谷 P7931

时间:2022-10-04 20:01:09浏览次数:57  
标签:tmp pp 洛谷 int back P7931 vec LIS

以下标为横坐标,值为纵坐标,建立坐标系。
然后会发现每个点的后继在其右上方。
按照每个点 LIS 大小来分层,以样例 \(3\) 为例:

注意到同层之间一定满足 \(x\) 递增 \(y\) 递减。

结论:存在一种选择 LIS 的最优方案,满足每个 LIS 在图上不交叉。
如样例 \(3\) 选的两组 LIS 就是 \(A,C,E\) 与 \(B,F,G\),显然没有交叉。
证明:以这种情况为例,

如果 \(A\) 选了 \(D\),但是 \(B\) 不能选 \(C\)。
如果 \(A\) 选了 \(C\),\(B\) 也能选 \(D\)。

Code:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define pp pop_back
const int N = 1000005;
int n;
int a[N];
int dp[N], len;
vector <int> vec[N], tmp;
vector <vector <int> > ans;

void solve() {
	while (1) {
		if (tmp.empty())
			if (vec[1].empty()) break;
			else tmp.pb(vec[1].back()), vec[1].pp();
		else if (tmp.size() == len) ans.pb(tmp), tmp.clear();
		else {
			int k = tmp.size() + 1, cur = tmp.back();
			while (vec[k].size() && vec[k].back() < cur) vec[k].pp();
			if (vec[k].empty() || a[cur] > a[vec[k].back()]) tmp.pp();
			else tmp.pb(vec[k].back()), vec[k].pp();
		}
	}
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
	for (int i = 1; i <= n; ++i) {
		if (dp[len] < a[i]) { dp[++len] = a[i], vec[len].pb(i); }
		else {
			int p = lower_bound(dp + 1, dp + len + 1, a[i]) - dp;
			dp[p] = a[i], vec[p].pb(i);
		}
	}
	for (int i = 1; i <= n; ++i) reverse(vec[i].begin(), vec[i].end());
	solve();
	printf("%d %d\n", ans.size(), len);
	for (auto i : ans) {
		for (auto x : i) printf("%d ", x);
		printf("\n");
	}
	return 0;
}

标签:tmp,pp,洛谷,int,back,P7931,vec,LIS
From: https://www.cnblogs.com/Kobe303/p/16754326.html

相关文章

  • [题解]洛谷 P4930、BZOJ 4221
    洛谷P4930考虑\(\varphi\)有什么性质,设\(x\)的质因数分解为\(\prod_{i=1}^mp_i^{a_i}\),那么\(n=\varphi(x)=\prod_{i=1}^m(p_i-1)\times\prod_{i=1}^mp_i^{a_i-1......
  • 洛谷 P4186
    首先对于一棵子树,肯定是放在这棵子树中深度最小的叶节点。那如何分析子树中深度最小的叶节点深度够不够小呢?我们看到,我们关注叶节点深度是为了看它能不能在Bessie从根......
  • 洛谷 CF550C Divisibility by Eight(DP/数论)
    遇事不决,小学数学。https://www.luogu.com.cn/problem/CF550C题目大意:给你一个位数不超过100的非负整数N(不含前导0)。你的任务是判断这个数字能否通过去掉其中......
  • 【树上背包】洛谷 P4516 [JSOI2018] 潜入行动
    P4516[JSOI2018]潜入行动省选/NOI-、树上背包计数题意略设状态为\(dp[u][j][0/1][0/1]\),u点子树放了j个装置,u点有没有放装置,u点有没有被监听的方案数。对......
  • 洛谷 P8557 炼金术 题解
    题目大意给定\(n\)种金属,放进\(k\)个熔炉,要求最终每种金属都要能从熔炉里拿出来,求熔炉炼金的方案数对\(998244353\)取模。分析从金属角度考虑。不难发现对于每......
  • 洛谷 P3388 【模板】割点(割顶)
    题目链接:https://www.luogu.com.cn/problem/P3388 【模板】割点(割顶)题目背景割点题目描述给出一个$n$个点,$m$条边的无向图,求图的割点。输入格式第一行输入两个......
  • 洛谷 P4840 解题报告
    洛谷P4840解题报告STEP1.题目大意求字符串\(S\)的所有循环同构中本质不同的回文子串数量的最大值。数据范围$|S|\leq1.5e6$STEP2.思路分析看到回......
  • 洛谷P3375 kmp字符串匹配
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;inti,j,k,la,lb,kmp[1000005];chara[1000005],b[1000005];signedmain(){  scanf("%s%s",......
  • 洛谷 P1506 拯救oibh总部(DFS / 染色法)
    https://www.luogu.com.cn/problem/P1506题目描述给定n*m的图形,由*和0组成。让我们求出被*四面包围了的0的数量。输入#1450000000*000*0*000*00输出......
  • 洛谷 P2709 小B的询问 题解
    莫队板子。//P2709小B的询问#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMAXN=50005;structQuery{ intl,r,id;}q[MAXN];in......