[硫化铂]膜拜大丹

2024-03-16 22:32
文章标签 膜拜 硫化

本文主要是介绍[硫化铂]膜拜大丹,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

膜拜大丹

在这里插入图片描述
在这里插入图片描述

题解

首先我们可以观察到一个性质,我们一定只会走二元环。
整张图是一个二分图,我们每次是从一边跳到另一边,所以走过的路径一定是一个偶环。
我们不妨记我们走过的路径为 A p 1 → B q 1 → A p 2 → B q 2 → . . . → B q n → A p n + 1 A_{p_1}\rightarrow B_{q_1}\rightarrow A_{p_2}\rightarrow B_{q_2}\rightarrow...\rightarrow B_{q_n}\rightarrow A_{p_{n+1}} Ap1Bq1Ap2Bq2...BqnApn+1,其中 p n + 1 = p 1 p_{n+1}=p_1 pn+1=p1,那么一定存在一个时刻有 p i < p i + 1 p_i < p_{i+1} pi<pi+1让我们从 A p i A_{p_i} Api走到 B q i B_{q_i} Bqi再走到 A p i + 1 A_{p_{i+1}} Api+1
显然,此时我一定可以走二元环 A p i → B q i → A p i A_{p_i}\rightarrow B_{q_i}\rightarrow A_{p_i} ApiBqiApi,这样显然是不比上面的环劣的,因为一个环里的每个点都只会有一的贡献。
所以我们就可以将原问题转化成找到数量最多的二元环匹配。

上面的问题显然是可以使用网络流解决的,但对于 n ⩽ 5 × 1 0 5 n\leqslant 5\times 10^5 n5×105的数据范围来说显然不大合理。
我们可以考虑将问题转化一下,想象一个网格图,上面有 ( i , a i ) , ( b i , i ) (i,a_i),(b_i,i) (i,ai),(bi,i)这两类点。
如果两个点能够匹配,显然是 ( i , a i ) (i,a_i) (i,ai) ( b i , i ) (b_i,i) (bi,i)向各自对应的坐标轴做垂线有交点。
当然,我们要找的是这些点的最大匹配,可以将其转化成找最大独立集,减去就得到最大匹配。
考虑两个点在怎样的情况下是独立的,显然是两个点的垂线没有交点。
我们把 ( i , a i ) (i,a_i) (i,ai)看成红点, ( b i , i ) (b_i,i) (bi,i)看成绿点,那么如果我们用一条路径划分图内的红绿点,当然这条路径自会向上与向右走,那么在路径上方的红点与路径下方的绿点就是独立的。
我们要用这种划分的方法使得我们上方的红点数与下方的绿点数相加的总和最大。
大概就是这样的,
在这里插入图片描述
红绿点可能不大好区分,不过应该能理解,这样是 2 + 3 = 5 2+3=5 2+3=5,独立集是最大的,那么他的最大匹配就是 1 1 1

显然,这样的最大匹配我们是可以用 d p dp dp来求的。
d p i , j dp_{i,j} dpi,j表示我们的路径现在走到了 ( i , j ) (i,j) (i,j)这个格子时,我们得到的独立集的最大值。
转移很显然,向右走是判断当前的 ( b j , j ) (b_j,j) (bj,j)能不能加入,向上走时就判断 ( i , a i ) (i,a_i) (i,ai)能不能加入。显然只要我们的路径不与它们的垂线相交就可以加入。
如果直接 d p dp dp的话是 O ( n m ) O\left(nm\right) O(nm)的,但我们显然是可以进行优化的。
显然,如果我们确定一部分红点要选,现在考虑
我们发现,当我们的高度超过 b i b_i bi就不会再对 ( b i , i ) (b_i,i) (bi,i)造成影响了,而在达到 b i b_i bi之前,如果向右走已经已经超过 i i i,那么 ( b i , i ) (b_i,i) (bi,i)就不会产生贡献。
所以这是对于所有 j < i j<i j<i d p k , j dp_{k,j} dpk,j,我们是会对其产生一的贡献,整体加一。
而对于我们的 ( i , a i ) (i,a_i) (i,ai),如果我们要将它加入进去转移的话,相当于至少要让我们的第二维达到 a i a_i ai,也就是说, ⩾ a i \geqslant a_i ai的部分可以 + 1 +1 +1,当然要注意 ⩽ a i \leqslant a_i ai的部分可以从这一层走到 a i a_i ai,再 + 1 +1 +1
不过事实上每个点的权值并不是只有 1 1 1的,应该是 c i c_i ci d i d_i di,因为他有多个点在一起吗,不过考虑时可以按将其拆成点权个点,方便思考。
容易发现上面我们的 d p dp dp转移式容易用线段树来进行维护的,所以打一棵线段树就可以维护了。

时间复杂度 O ( n log ⁡ n ) O\left(n\log\,n\right) O(nlogn)

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 500005
#define MAXM (1<<20)+5
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long LL;
typedef unsigned long long uLL; 
typedef long double ld;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int mo=998244353;
const int mod=1e5+3;
const int inv2=5e8+4;
const int jzm=2333;
const int zero=2000;
const int n1=1000;
const int M=100000;
const int orG=3,ivG=332748118;
const long double Pi=acos(-1.0);
const double eps=1e-12;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1)t=1ll*t*a%p;a=1ll*a*a%p;s>>=1;}return t;}
int n,m,a[MAXN],b[MAXN],c[MAXN],d[MAXN],ord[MAXN];LL ans,summ;
class SegmentTree{private:LL tr[MAXN<<2],lzy[MAXN<<2],cov[MAXN<<2];void pushup(int rt){tr[rt]=max(tr[lson],tr[rson]);}void pushdown(int rt){if(lzy[rt]){tr[lson]+=lzy[rt];lzy[lson]+=lzy[rt];cov[lson]+=lzy[rt];tr[rson]+=lzy[rt];lzy[rson]+=lzy[rt];cov[rson]+=lzy[rt];lzy[rt]=0;}if(cov[rt]){tr[lson]=max(tr[lson],cov[rt]);cov[lson]=max(cov[lson],cov[rt]);tr[rson]=max(tr[rson],cov[rt]);cov[rson]=max(cov[rson],cov[rt]);cov[rt]=0;}}public:void insert(int rt,int l,int r,int al,int ar,LL aw){if(l>r||l>ar||r<al||al>ar)return ;if(al<=l&&r<=ar){tr[rt]+=aw;lzy[rt]+=aw;cov[rt]+=aw;return ;}int mid=l+r>>1;pushdown(rt);if(al<=mid)insert(lson,l,mid,al,ar,aw);if(ar>mid)insert(rson,mid+1,r,al,ar,aw);pushup(rt); }void modify(int rt,int l,int r,int al,int ar,LL aw){if(l>r||l>ar||r<al||al>ar)return ;if(al<=l&&r<=ar){tr[rt]=max(tr[rt],aw);cov[rt]=max(cov[rt],aw);return ;}int mid=l+r>>1;pushdown(rt);if(al<=mid)modify(lson,l,mid,al,ar,aw);if(ar>mid)modify(rson,mid+1,r,al,ar,aw);pushup(rt);}LL query(int rt,int l,int r,int al,int ar){if(l>r||l>ar||r<al||al>ar)return 0;if(al<=l&&r<=ar)return tr[rt];int mid=l+r>>1;LL res=0;pushdown(rt);if(al<=mid)res=max(res,query(lson,l,mid,al,ar));if(ar>mid)res=max(res,query(rson,mid+1,r,al,ar));return res;}
}T;
bool cmp(int x,int y){return b[x]<b[y];}
signed main(){//freopen("worship.in","r",stdin);//freopen("worship.out","w",stdout);read(n);read(m);for(int i=1;i<=n;i++)read(a[i]);for(int i=1;i<=m;i++)read(b[i]);for(int i=1;i<=n;i++)read(c[i]),summ+=c[i];for(int i=1;i<=m;i++)read(d[i]),summ+=d[i];if(n>m){for(int i=1;i<=n;i++)swap(a[i],b[i]),swap(c[i],d[i]);swap(n,m);}for(int i=1;i<=m;i++)ord[i]=i;sort(ord+1,ord+m+1,cmp);int j=1;for(int i=1;i<=n;i++){while(j<=m&&b[ord[j]]<i)T.insert(1,0,m,0,ord[j]-1,d[ord[j]]),j++;T.insert(1,0,m,a[i],m,c[i]);LL tmp=T.query(1,0,m,0,a[i]-1)+c[i];T.modify(1,0,m,a[i],m,tmp);}while(j<=m)T.insert(1,0,m,0,ord[j]-1,d[ord[j]]),j++;printf("%lld\n",summ-T.query(1,0,m,0,m));return 0;
}

谢谢!!!

这篇关于[硫化铂]膜拜大丹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816931

相关文章

【Matlab】Matlab之美,抓紧来膜拜大神的创星之作(附2024Matlab教程+代码)

软件介绍 MATLAB是一款商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 上代码 clc;cle

膜拜!华为18级专家3年苦心整理分享深入浅出Docker文档

前言 如今Docker无处不在,这是不争的事实。开发人员都很喜欢它,运维工程亦也需要它。他们都需要深入了解如何在关键业务环境中构建和维护符合生产级别要求的容器化应用,本文将帮助读者掌握它。 对于认为Docker是开发人员专属工具的人来说,恐怕要准备好颠覆自己的认知了。 容器化应用需要有地方运行,也需要有人来管理。如果认为只是开发人员来管理它,那就大错特错了,事实上运维需要构建和运行高性能、生

电子元器件选型(二):防硫化电阻

一、电阻硫化         贴片电阻的内部电极采用了银 (Ag),如果有硫黄成分气体从保护膜和电镀层之间的缝隙侵入,就会发生硫化反应,慢慢地生成硫化银 ()。由于硫化银不导电,所以随着电阻被硫化,电阻值逐渐增大,直至最终成为开路。电阻硫化之后,在电阻的电极内侧表面出现硫化银结晶。         银由于优质的导电特性,会被使用作为电极、焊接材料、电接触材料,所以在电子元器件中大量使用

膜拜大神面试题

今天去面了阿里巴巴广州UC总部的前端工程师职位,感觉这份笔试题还是出的挺有意思的,考完趁热反思一下自己做题过程的一些问题,稍作总结 如我一开始想的,笔试的题目果然没有考所谓的计算机网络,数据逻辑那些要太多去背的东西,下面列出的题目不按顺序,想到哪写到哪~有想法的欢迎在评论区指正 第一题 假设存在a数组,假定数组内的元素均为Number,a如果长度为0,则添加1,否则按先进先出原则去掉一个元素,考

Android Span详解,疯狂膜拜

TextView有样式属性,为什么还需要Span**?** 通过XML属性或者代码设置就可以改变文本样式,但是效果必须作用于整个文本,如果要在部分文本上使用特殊样式就无能无力了,例如像下面这种: Span就是解决这种需求的,Span样式可以作用于字符或者段落级别的文本。 通常使用的套路是样式属性和Span组合使用,可以考虑将设置给TextView的样式属性作为一种“基本”样式,而 Spa

疯狂膜拜!一招彻底帮你搞定HashMap源码

前言: 首先介绍一下我的同学,专科毕业应用电子技术专业,已经毕业快两年了。因为专业的原因工作一年觉得没什么发展前途就想转行,身为他的“好基友”,他觉得我这个工作挺好的,就咨询了我一下,经过的严厉拒绝下(各种诱惑下),还是阻挡不了他。随后他报名了北大某鸟进行培训,进行了为期半年的Java程序员速成加工。 因为年前结束培训他准备年后面试,谁知遇到这个大疫情,一直拖到了5月份。随后进行了长达2个月的面

疯狂膜拜!mysql远程访问命令

经过我自己的梳理,手绘了整个Spring5的架构脑图 这份Spring5的架构脑图我总共是将其整个知识分为以下6个部分: 1、Spring框架介绍2、IOC容器3、AOP4、JdbcTemplate5、事务管理6、Spring5新特性 一步一个脚印,一起来梳理整个知识框架!! 1.1 Spring5的架构脑图——Spring框架介绍 1.2 Spring5的架构脑图——IOC容器

膜拜!java可变长度数组

正文 我在做技术面试官的时候,在问完问题后,照例会问一句:你期望的工资是多少?对此,我只会记录下候选人的回答然后上报,没有同意权,更没有批驳权。 判断候选人能否通过面试,主要看候选人能力和岗位的匹配度,如果能力行,自然没话说,如果可上可下,那就要综合衡量优点和缺点。我不敢说,不敢要高工资一定会导致面试失败,但这至少是个扣分项,这说明候选人自信不足,或者暗示候选人能力不行。 1 其实公司会根据

java多态的例子,万分膜拜!

Spring Security观后感——手绘思维脑(供参考) Spring Security手绘思维脑图 手绘的思维导图,是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的,相当于是一个知识的总结与梳理,我将其分为***“核心组件”与“工作原理/认证流程”* Spring Security-核心组件 Spring Security-工作

膜拜!跟谁学java技术面试

1. 前言 相信大家对 ZooKeeper 应该不算陌生。但是你真的了解 ZooKeeper 到底有啥用不?如果别人/面试官让你给他讲讲对于 ZooKeeper 的认识,你能回答到什么地步呢? 拿我自己来说吧!我本人曾经使用 Dubbo 来做分布式项目的时候,使用了 ZooKeeper 作为注册中心。为了保证分布式系统能够同步访问某个资源,我还使用 ZooKeeper 做过分布式锁。另外,我在