cf 1144G 贪心

一个序列看能不能拆成1个严格上升子序列,和1个严格下降子序列,元素相对位置不能变。

想着最长上升子序列照一次,最长下降子序列找一次,再判断合不合法WA了。

官方题解看不太懂。

评论区看到roundgod给出了一个贪心,每次我尝试吧a[i]丢到上升序列和下降序列中,如果都不能丢,就没有方案,如果一个能丢,就丢,如果两个都能丢进去,那么看a[i+1],如果a[i]<a[i+1]那么吧a[i]放上升序列,否则放到下降序列。

如果a[i]<a[i+1]的时候,如果你放到下降序列,那么a[i+1]就只能放到下降序列了,也就是相当于下降序列的末尾元素突然变的很低,而如果把a[i]放到上升序列,a[i+1]有可能还是可以两个序列都能放,这样机会就更多了。

#include<bits/stdc++.h>
#define maxl 200010
using namespace std;

int n;
int a[maxl],b[maxl],c[maxl];
int flag;
bool in[maxl];

inline void prework()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),a[i]+=1;
}

inline void mainwork()
{
	flag=true;
	if(a[1]<a[2])
		b[++b[0]]=a[1],in[1]=1;
	else
		c[++c[0]]=a[1],in[1]=0;
	int cnt=0;
	for(int i=2;i<=n;i++)
	{
		cnt=0;
		if(a[i]>b[b[0]] || b[0]==0)
			cnt++;
		if(a[i]<c[c[0]] || c[0]==0)
			cnt++;
		if(cnt==0)
		{
			flag=false;
			return;
		}
		if(cnt==1)
		{
			if(a[i]>b[b[0]] || b[0]==0)
				b[++b[0]]=a[i],in[i]=1;
			if(a[i]<c[c[0]] || c[0]==0)
				c[++c[0]]=a[i],in[i]=0;
		}
		if(cnt==2)
		{
			if(a[i]<a[i+1])
				b[++b[0]]=a[i],in[i]=1;
			else
				c[++c[0]]=a[i],in[i]=0;
		}
	}
}

inline void print()
{
	if(!flag)
		puts("NO");
	else
	{
		puts("YES");
		for(int i=1;i<=n;i++)
		if(in[i])
			printf("0%c",(i==n)?'\n':' ');
		else
			printf("1%c",(i==n)?'\n':' ');
	}
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
}

 

% 步骤 1: 创建一个具有 30 个节点的传感器图 rng(12); % 设置随机种子 N = 30; G = gsp_sensor(N); % 步骤 2: 计算图拉普拉斯矩阵并提取 L 字段 L_struct = gsp_create_laplacian(G); L = full(double(L_struct.L)); % 提取拉普拉斯矩阵 % 步骤 3: 特征分解并按特征值排序 [V, D] = eig(L); % V:特征向量矩阵, D:特征值对角矩阵 d = diag(D); % 提取特征值 [~, idx] = sort(d); % 排序索引 V = V(:, idx); % 重新排列特征向量 d = d(idx); % 对应的特征值也重新排序 N = size(L, 1); % 节点数 K = 5; % 设置 K 值(带限信号) VK = V(:, 1:K); % 前 K 个特征向量 % Step 4: 构造 K 带限信号(只保留前 K 个频率成分) xF_true = zeros(N, 1); xF_true(1:K) = [1.1, 0.5, -0.2, 0.9, -1.4]; % 频域系数 x_true = V * xF_true; % K带限的图域信号 % Step 5: 使用贪心算法选择最优采样点(基于协方差矩阵迹最小化) r = 5; % 想要选择的采样点数量 S = []; % 初始化采样点集合 remaining_nodes = 1:N; % 所有节点候选集 % 构造范德蒙德矩阵 Ψ(K × N) Psi = zeros(K, N); for j = 1:N for i = 1:K Psi(i, j) = d(j)^(i-1); % dj^(i-1) end end EK = eye(N, K); % 构造填充矩阵 EK (N × K) % 得到采样集S for k = 1:r best_node = []; min_trace = inf; for candidate = remaining_nodes % 从V\S中找采样点 % 构造当前节点的 vi vi = V(candidate, :); Psi_vi = Psi * diag(vi); % Ψdiag(vi) % 假设噪声协方差Cn(i)为单位阵 Cn_i = eye(K); % 可改为 sigma^2 * eye(K) Cn_i_inv = inv(Cn_i); % 构造 Cf(i) Psi_vi_EK = Psi_vi * EK; % Ψdiag(vi)EK A = Psi_vi_EK' * Cn_i_inv * Psi_vi_EK; if rank(A) < K continue; % 如果奇异跳过该节点 end Cf_i = (A) \ eye(K); % Cf(i) % 构造 Co(i) Co_i = VK * Cf_i * VK'; % 计算加入后的总协方差和迹 trace_total = trace(Cf_i); if trace_total < min_trace min_trace = trace_total; best_node = candidate; end end % 更新采样点集合 S = [S, best_node]; remaining_nodes(remaining_nodes == best_node) = []; % 得到V\S end disp(['Selected sampling nodes (based on trace minimization): ', num2str(S)]); % Step 6: 使用选定的采样点构造 ΦS Phi_S = []; for i = 1:r s = S(i); delta_s = zeros(N, 1); delta_s(s) = 1; phi_si = delta_s; L_trans = L'; % 转置是为了构造左乘形式的 Krylov 子空间 for j = 1:K-1 delta_s = L_trans * delta_s; phi_si = [phi_si, delta_s]; end Phi_S = [Phi_S, phi_si]; % 将每个采样点的 Phi 向量横向拼接 end % Step 7: 获取观测值 z_S = Phi_S' * x_true + noise noise_std = 0.1; % 噪声标准差 z_S = Phi_S' * x_true + noise_std * randn(size(Phi_S’, 1), 1); % 加入高斯白噪声 % Step 8: 解方程 Phi_S' * VK * X(K) = z_S => A * X(K) = z_S A = Phi_S' * VK; % 构造线性系统 % 使用伪逆求解 X_K_est = pinv(A) * z_S; % Step 9: 重构信号 x_recon = VK * X_K_est; % Step 10: 计算误差 MSE = mean((x_true - x_recon).^2); disp(['Reconstruction MSE with noise: ', num2str(MSE)]); % Step 11: 可视化对比:真实信号 vs 重构信号 figure; % 绘制原始信号在图结构上的分布 subplot(1, 2, 1); gsp_plot_signal(G, x_true); title('True Signal on Graph'); % 绘制重构信号在图结构上的分布 subplot(1, 2, 2); gsp_plot_signal(G, x_recon); title('Reconstructed Signal on Graph'); % 添加全局标题 ax = axes('Position', [0 0 1 1], 'Xlim', [0 1], 'Ylim', [0 1], ... 'Box', 'off', 'Visible', 'off'); text(0.5, 0.02, ['MSE = ', num2str(MSE)], 'Units', 'normalized', ... 'HorizontalAlignment', 'center', 'FontSize', 10, 'FontWeight', 'bold', 'Parent', ax); 这段代码在贪婪算法的采样过程中迭代公式是argmin Tr(Co(i)),其中i∈v\S,v为总节点集,但实际上是argmin Tr(Co(S∪i)),而Co(S)=(VK)Cf(S)(VK)^T,Cf(S)=(∑(i∈S) (Ψdiag(vi)EK)^T (Cn(i))^(-1) (Ψdiag(vi)EK))^(-1)
最新发布
07-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值