首页 > 其他分享 >CF1144G Two Merged Sequences

CF1144G Two Merged Sequences

时间:2024-09-18 11:35:41浏览次数:1  
标签:fr ch int Two p1 Sequences 序列 buf Merged

首先我们考虑最暴力的方法,仿照着 LIS 板子题设计状态:\(dp_{i,j}\) 表示考虑前 \(\max(i,j)\) 个,单减序列以 \(i\) 结尾,单增序列以 \(j\) 结尾,然后进行 \(O(1)\) 的转移。

但是这样状态数就爆炸了,如何优化状态数呢?

我们考虑进行换维。因为我们刚刚设计的是一个弱鸡的可行性 DP,很强力的“答案”这个位置上却被我们放上了 \(0/1\) 这样信息很少的东西。

那么就考虑设 \(f_i\) 表示单增序列以 \(i\) 结尾,单减序列最后一项的最大值(浅浅运用贪心的思想,反正只要能分成两个序列就行了,没必要考虑长度的话,只要是已经考虑过的位置,它们之间的相对关系并不重要)。

开始打补丁,因为一个位置也有可能是单减序列的结尾,所以考虑再设一个 \(g\)。

设 \(g_i\) 表示单减序列以 \(i\) 结尾,单增序列最后一项的最小值。那么就可以交替转移了。

转移式子在代码里面。(如果对会不会漏掉情况有疑问,可以这样想:\(f_i,g_i\) 是在考虑前 \(i\) 位时的两个最优情况,其它的情况能匹配的接下来(\(i\) 位之后)的方案,一定能是他们两个交集的子集)。

#include <bits/stdc++.h>

#ifdef LOCAL
#include "zsx.h"
#else 

#endif

using namespace std;

inline char gc() {
	static char buf[100000], *p1 = buf, *p2 = buf;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}
using IO_t = int;inline IO_t read() {
	IO_t x = 0; bool f = 0; char ch = gc();
	while (!isdigit(ch)) {f |= (ch == '-');ch = gc();}
	while (isdigit(ch)) {x = (x << 1) + (x << 3) + (ch ^ 48);ch = gc();}
	return (f ? -x : x);
}

const int N = 2e5 + 5;

int n , a[N] , f[N] , g[N];

inline bool chkmin(int &x , int y){
	x = x < y ? x : y;
	return x == y;
}
inline bool chkmax(int &x , int y){
	x = x > y ? x : y;
	return x == y;
}

const int INF = 0x3F3F3F3F;

using pii = pair<int , int>;
pii fr[N][2];

int ans[N] , o;
signed main() {
	n = read();
	for(int i = 1; i <= n; ++ i){
		a[i] = read();
	}
	
	f[1] = INF;
	g[1] = -1;
	for(int i = 2; i <= n; ++ i){
		f[i] = -1;
		if(a[i] > a[i - 1]) {
			if(chkmax(f[i] , f[i - 1])){
				fr[i][0] = {i - 1 , 0};
			}
		}
		if(a[i] > g[i - 1]) {
			if(chkmax(f[i] , a[i - 1])){
				fr[i][0] = {i - 1 , 1};
			}
		}
		g[i] = INF;
		if(a[i] < a[i - 1]) {
			if(chkmin(g[i] , g[i - 1])){
				fr[i][1] = {i - 1 , 1};
			}
		}
		if(a[i] < f[i - 1]) {
			if(chkmin(g[i] , a[i - 1])){
				fr[i][1] = {i - 1 , 0};
			}
		}
		if(f[i] == -1 && g[i] == INF){
			puts("NO");
			return 0;
		}
	}
	
	o = n;
	
	puts("YES");
	pii p;
	if(f[n] != -1) p = {n , 0};
	else p = {n , 1};
	while(p.first != 0){
		ans[o -- ] = p.second;
		p = fr[p.first][p.second];
	}
	
	for(int i = 1; i <= n; ++ i){
		printf("%d " , ans[i]);
	}
	
	return 0;
}

标签:fr,ch,int,Two,p1,Sequences,序列,buf,Merged
From: https://www.cnblogs.com/TongKa/p/18418163

相关文章

  • 【生成对抗网络GAN】最全的关于生成对抗网络Generative Adversarial Networks,GAN的介
    【生成对抗网络GAN】最全的关于生成对抗网络GenerativeAdversarialNetworks,GAN的介绍!!【生成对抗网络GAN】最全的关于生成对抗网络GenerativeAdversarialNetworks,GAN的介绍!!文章目录【生成对抗网络GAN】最全的关于生成对抗网络GenerativeAdversarialNetworks,GAN的......
  • 常回家看看之house_of_catWO
    house_of_cat前言:houseofcat这个利用手法和前面提到的houseofkiwi,和houseofemma利用的手法是一个链子,当程序无法通过main函数返回时候,或者程序不能显性调用exit函数的时候,我们可以通过__malloc_assert来刷新IO流,当然这个函数在2.35之后移除了刷新IO流,最后在2.37彻......
  • Network成功接收数据但与控制台打印不一致
    今天尝试和后端进行数据对接时发生了一个匪夷所思的问题(万恶的控制台)描述前端可以给后端正常发送请求,后端可以接收到正确数据并根据业务流程进行处理,但前端使用控制台打印时与后端返回的数据不一致(没关注Network的返回结果)。后端使用Postman发送请求进行测试却一切正常,可以正......
  • CS/INFO 6850 The Structure of Information Networks
    TheStructureofInformationNetworksHomework1CS/INFO6850Fall2024Due6pm,Wednesday,Sept.18,2024Thegoalofthisproblemsetistoprovidepracticeimplementingsomebasicnetworkanalysistechniquesonamoderate-sizednetworkdataset—specif......
  • P9891 [ICPC2018 Qingdao R] Repair the Artwork 题解
    所求即为选择的区间恰好包含所有\(a_i=2\)的位置的方案数。设所有\(a_i=2\)的位置\(i\)组成集合\(S\),考虑容斥被选中的位置是\(S\)的子集的方案数\(g(S)\)。设\(T\)为\(S\)的子集,\(T\)的贡献\(f(T)\)为:选中的位置都在\(T\)的子集中的方案数乘容斥系数\(......
  • CS5229 Advanced Computer Networks
    CS5229AdvancedComputerNetworksProgrammingAssignment1Semester1AY2024/251 OverviewInthisprogramming assignment,youwill explore sketch-based algorithms designed to mon- itor network traffic across a high-traffic network link. We......
  • Azure web app has no access to openai private endpoint in virtual network
    题意:"AzureWeb应用无法访问虚拟网络中的OpenAI私有端点。"问题背景:IamtryingtohostawebapplicationsimilartoaprivateChatGPTinstancewithinasecludedvirtualnetwork,ensuringthatthere'snoexternalinternetaccess."我正在尝试在一个隔离的......
  • NetworkManager内核网络栈通信机制
    NetworkManager在启动和配置网络设备时,会通过Linux内核的网络栈API与设备驱动程序进行交互,特别是通过netlink子系统来实现。1.Netlink通信机制Netlink是Linux内核与用户空间进程之间的一种通信机制,它允许用户空间进程与内核模块(如网络栈)交换信息。Netlink为Networ......
  • NetworkManager接收和处理客户端请求通信机制
    NetworkManager守护进程通过监听D-Bus通信来接收和处理来自客户端(如nmcli或其他应用程序)的请求。这是Linux中进程间通信(IPC)的一种常见方式。D-Bus是一个消息总线系统,允许应用程序在不直接通信的情况下,通过消息总线交换数据。NetworkManager使用D-Bus作为其主要的通信机......
  • FIT9137 An Enterprise Network Design
    FIT9137Assignment2SubmissionGuidelinesAssignment2 isworth 25% of theUnit Marks.Deadline:Week-8–Friday, 13th September 2024, 11:55PM (Melbournetime)● Submissionformatanddetails: You must submit exactlytwo files with the ......