灵魂滚烫, 命运冰凉|

fhq_treap

园龄:5年7个月粉丝:67关注:21

ARC163E Non-coprime DAG

给定一张n个点的图G

i<j,gcd(i,j)>1,有一条ij的边。

给定点权Ai

求选出带权最长反链。

做法:

根据diworth定理,带权最长反链等于带权可重最小路径覆盖。
于是我们使用二分图模型,费用流即可。
于是
成功输了。
完全输了。

考虑只会选择一个偶数。

其提醒我们思考如何处理选出的数全是奇数的情况。

考虑当x<y如何可以同时被选。

Lxx的最小质因数。

给出结论为x+Lx>yLy

考虑若x+Lxy+Ly,考虑如下路径xx+LxyLyy,第三步是因为二者都是偶数。

x+Lx>yLy,则不可能走超过2步,则考虑是否存在x+p=y为两者共同约数,由于其全为奇数则不可能。

那么我们只要对所有奇数的区间[xLx,x+Lx],选一个点让覆盖其的区间的权值和最大即可。

考虑偶数带来的影响,发现前缀证明不变仅影响到了x+p=y.考虑x为偶数,考虑若z=yx,若其不等于Ly,则zLy>=2不满足第二个条件的先决条件,所以只需考虑x+Ly=y

那么我们考虑将原本的奇数区间写作[xLx+1,x+Lx1],偶数写作[x,x]即可差分实现其。

ARC163E Non-coprime DAG
#include<bits/stdc++.h>
#define ll long long 
#define N 1000005

int n;
ll a[N];
ll s[N * 2];
int L[N];

inline void sieve(){
	for(int i = 2;i < N;++i){
		if(!L[i]){
			for(int j = 1;j * i < N;++j)
			if(!L[i * j])L[i * j] = i;
		}
	}
}

ll mx;

int main(){
	sieve();
	scanf("%d",&n);
	for(int i = 1;i <= n;++i)
	scanf("%lld",&a[i]);
	for(int i = 1;i <= n;++i)
	if(i & 1){
		s[i - L[i] + 1] += a[i];
		s[i + L[i]] -= a[i];
	}else{
		s[i] += a[i];
		s[i + 1] -= a[i];
	}
	for(int i = 2;i <= n * 2;++i)
	s[i] = s[i] + s[i - 1],mx = std::max(mx,s[i]);
	std::cout<<mx + a[1]<<"\n";
}

本文作者:fhq_treap

本文链接:https://www.cnblogs.com/dixiao/p/15947305.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   fhq_treap  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起