首页 > 其他分享 >AGC028E 做题记录

AGC028E 做题记录

时间:2024-05-10 16:35:52浏览次数:16  
标签:前缀 记录 ll AGC028E 贡献 maxn sum define

好厉害!

首先使用贪心策略,从左往右扫,能填 \(0\) 就填 \(0\),问题变为判定性问题。

首先我们先观察性质

  • 性质:\(P\) 中的前缀最大值一定有 \(1\) 的贡献,其他元素的贡献可以为 \(0\),一定条件下可以为 \(1\)。

然后就不会了,个人只会 \(O(n^2)\) 的 DP。

考虑猜结论

  • 结论:把 \(P_{i+1 ... n}\) 分配给两个序列,存在一种最优方案,满足其中一个序列中的贡献都是 \(P\) 的前缀最大值。

证明:假设两个序列有两个非前缀最大值的贡献 \(x,y\),那么交换 \(x,y\) 的分配,两个贡献都会去掉。

所以我们只需要分讨一下这个序列是 \(A\) 还是 \(B\),假设为 \(A\)。

设 \(c_A,c_B\) 分别为 \(A,B\) 中 \(P_{1...i}\) 的贡献,那么 \(P_{i+1...n}\) 的分配需要满足 \(A\) 的贡献减去 \(B\) 的贡献等于 \(c_B-c_A\)。

设 \(D = c_A - c_B\),\(S\) 为 \(P_{i+1...n}\) 在原排列的前缀最大值个数,\(T\) 为分配给 \(B\) 的前缀最大值,\(E\) 为剩余可贡献的数量。

那么 \(A\) 的剩余贡献为 \(S-T\),\(B\) 的剩余贡献为 \(T+[0,E]\),关系式为 \((S-T)-(T+E) = D \Leftrightarrow 2T+[0,E] = S-D\)。

我们解读一下这个式子,相当于在 \(P_{i+1...n}\) 中选择一个上升子序列,前缀最大值的贡献为 \(2\),其他数贡献为 \(1\),满足总贡献为 \(S-D\),问是否存在这样的方案。

  • trick:注意到如果我们确定了一个方案,贡献为 \(v\),那么 \(v-2\) 也是可行的。

所以我们分奇偶两种,dp 算最大贡献。

使用线段树,时间复杂度 \(O(n\log n)\)。

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define fi first
#define se second
#define pir pair <ll, ll>
#define mkp make_pair
#define pb push_back
using namespace std;
const ll maxn = 2e5 + 10, inf = 1e17;
ll n, a[maxn], b[maxn], f[maxn][2], sum[maxn];
struct SGT {
	ll mx[maxn << 2];
	void modify(ll p, ll l, ll r, ll x, ll v) {
		if(l == r) {mx[p] = v; return;}
		ll mid = l + r >> 1;
		if(x <= mid) modify(p << 1, l, mid, x, v);
		else modify(p << 1|1, mid + 1, r, x, v);
		mx[p] = max(mx[p << 1], mx[p << 1|1]);
	}
	ll query(ll p, ll l, ll r, ll ql) {
		if(ql <= l) return mx[p];
		if(r < ql) return -inf;
		ll mid = l + r >> 1;
		return max(query(p << 1, l, mid, ql), query(p << 1|1, mid + 1, r, ql));
	}
} T[2];
ll mx1, mx2, c1, c2, pos[maxn];
bool chk(ll i) {
	ll D = c1 - c2, t = (sum[i + 1] + D + 10000000) & 1;
	if(sum[i + 1] >= D && T[t].query(1, 1, n + 1, mx1) >= sum[i + 1] - D) return 1;
	if(sum[i + 1] >= -D && T[t].query(1, 1, n + 1, mx2) >= sum[i + 1] + D) return 1;
	return 0;
}
int main() {
	scanf("%lld", &n);
	for(ll i = 1, mx = 0; i <= n; i++) {
		scanf("%lld", a + i);
		pos[a[i]] = i;
		if(a[i] > mx) {
			b[i] = 1;
			mx = a[i];
		}
		T[0].modify(1, 1, n + 1, i, -inf);
		T[1].modify(1, 1, n + 1, i, -inf);
	}
	T[1].modify(1, 1, n + 1, n + 1, -inf);
	for(ll i = n; i; i--) {
		sum[i] = sum[i + 1] + b[i];
		f[i][0] = T[b[i] ^ 1].query(1, 1, n + 1, a[i]) + 1 + b[i];
		f[i][1] = T[b[i]].query(1, 1, n + 1, a[i]) + 1 + b[i];
		T[0].modify(1, 1, n + 1, a[i], f[i][0]);
		T[1].modify(1, 1, n + 1, a[i], f[i][1]);
	}
	if(!chk(0)) {puts("-1"); return 0;}
	for(ll i = 1; i <= n; i++) {
		ll tmpmx = mx1, tmpc = c1;
		mx1 = max(mx1, a[i]), c1 += (mx1 == a[i]);
		T[0].modify(1, 1, n + 1, a[i], -inf);
		T[1].modify(1, 1, n + 1, a[i], -inf);
		if(!chk(i)) {
			mx1 = tmpmx, c1 = tmpc;
			mx2 = max(mx2, a[i]), c2 += (mx2 == a[i]);
			putchar('1');
		} else putchar('0');
	}
	return 0;
}

标签:前缀,记录,ll,AGC028E,贡献,maxn,sum,define
From: https://www.cnblogs.com/Sktn0089/p/18184744

相关文章

  • 任天堂Switch硬件修复记录
    硬件修复记录;从软件世界里走出来,硬起来朗读全文Yourbrowserdoesnotsupporttheaudioelement.有什么用你可以了解到任天堂Switch的一些硬件知识。如果愿意,你也可以动手处理你自己手上的游戏机,还可以知道日常使用过程中的注意事项,防止/避免人为损坏,至少拉长这些硬件的......
  • 任天堂Switch黑屏救砖记录
    Switch黑屏救砖朗读全文Yourbrowserdoesnotsupporttheaudioelement.有什么用给救砖提供一些思路,相同的情况可以参考使用了解大气层虚拟系统的运作原理,自己动手在虚拟系统中安装新游戏:相关内容在线升级后导致黑屏的NS现状与诊断用新的大气层的短接器+注......
  • 任天堂Switch全部记录
    NSSWTICH大气层制作新的SD卡,解决部分大气层及固件问题。原先的SD卡(128G)快全部放满游戏了,需要新的内存卡用于存放新的游戏。有几张闲置的内存卡,可是容量最大只有64G,无法通过直接全部复制+粘贴的办法,来启用新的小内存卡,涉及制作新的NSSwitchSD卡有什么用switch大气层换sd......
  • c# 摄像头及保存视频记录
     usingSystem.IO;usingICameraDll.DirectX.Capture;Capturecapture;//摄像头录像操作Filtersfilters=newFilters();//Filter集合//函数intGetffshowIndex(){FilterCollectionvideoC......
  • 记录一次sqlMap的sql注入测试
    1、首先下载sqlMap测试工具 2、此前需要安装python环境执行pythonsqlmap.py-h ,则可以验证sqlmap命令是否生效3、get请求sql注入测试命令pythonsqlmap.py-uhttp://127.0.0.1:2000/data/serverConfigure/getDataByProject?projectId=1630016701175169121--risk=3--le......
  • Ant Design Blazor Table 组件的 自定义分页样式, 显示全部记录数,ShowTotal
    在AntDesignBlazor中,Table 组件的 ShowTotal 属性是一个泛型属性,它可以是两种类型之一:Func<PaginationTotalContext,string> 或 RenderFragment<PaginationTotalContext>。这个属性用于定义如何显示表格数据的总条数。OneOf<T1,T2> 是一个特殊的类型,它表示这个......
  • 2024.5 做题记录
    2023.5做题记录[Violet]天使玩偶显然发现我们需要在时间轴上进行cdq分治,然后统计答案。问题在于这个绝对值不好维护,需要进行转化。如果我们钦定这个点最近的点在它的左下方,那么绝对值就可以化为\(dis(A,B)=(A_x-B_x)+(A_y-B_y)=(A_x+A_y)-(B_x+B_y)\)。显然前面的括号是定......
  • 瑞萨问题排查记录
    P1当把RFD28F添加进项目时,报错如下:参考链接:https://www.sekorm.com/news/73776172.html栈溢出.textE0562330:Relocationsizeoverflow:"DefaultBuild\sample_control_codeflash.obj"-".text"-00000b(1)右键Subproject的CC-RH——LinkOptionsTab——S......
  • stm32 出现 hard fault 的排查记录
    参考链接:https://blog.csdn.net/qq_43118572/article/details/1327596261、先验知识先验知识1:cortexm3在中断/异常时,会把8个寄存器(xPSR、PC、LR、R12以及R3-R0)的值压入栈。入栈顺序以及入栈后堆栈中的内容如下(CM4是从低地址到搞地质):地址寄存器被保存的顺序......
  • SQL练习之打卡记录数据统计类问题
    最近老婆的公司,关闭了OA系统中,各类打卡时间数据统计的功能,为了不麻烦老婆手算,就做了一个简单的打卡系统,方便自动统计老婆想要知道的各类数据。做的过程中就遇到了几个还挺有意思的SQL,这里写成一篇博文,方便后期练习~Tip:需要答案的盆友可以访问参考答案的链接,密码是123456~建表......