2025省选模拟9
2025省选模拟9
致敬造数据的人
T1、 Delov 的 npy 们
原 AGC031E
这个数据范围看着就像网络流,但是建模非常困难,按照原题意无法建出能用网络流解决的图,所以就需要转化题意。
转化题意自然要考虑那些限制,对于一个限制 横坐标小于等于
具体来说,我们枚举最终选了
码
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define int ll typedef pair<int,int> pii; typedef unsigned long long ull; #define mk make_pair #define ps push_back #define fi first #define se second const int N=1e6+10,inf=0x3f3f3f3f; const ll mod=1e9+7,linf=0x7f3f3f3f3f3f3f3f; inline ll read(){ char c=getchar();ll x=0;bool f=0; while(!isdigit(c))f=c=='-'?1:0,c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x; } struct jj{ int to,next,fl,w; }bi[N<<1]; int n,m,cnt=1,hd[N],st,ed,dis[N],q[N],l,r,pre[N]; bool vis[N]; inline void add(int x,int y,int z,int w){ bi[++cnt]={y,hd[x],z,w},hd[x]=cnt,bi[++cnt]={x,hd[y],0,-w},hd[y]=cnt; } inline bool spfa(){ for(int i=0;i<=ed;++i) dis[i]=-linf,vis[i]=0; dis[st]=0,vis[st]=1;q[l=r=0]=st; while(l<=r){ int x=q[l++];vis[x]=0; for(int i=hd[x];i;i=bi[i].next){ int j=bi[i].to; if(bi[i].fl&&dis[j]<dis[x]+bi[i].w){ pre[j]=i^1;dis[j]=dis[x]+bi[i].w; if(!vis[j])vis[j]=1,q[++r]=j; } } } return dis[ed]>0; } struct op{ int x,y,v; }man[N]; int L[N],R[N],U[N],D[N]; inline int sol(int k){ cnt=1;st=0,ed=k*2+n*2+1; for(int i=0;i<=ed;++i) hd[i]=0; for(int i=1;i<=k;++i) add(st,i,1,0),add(k+i,ed,1,0); for(int i=1;i<=n;++i){ add(k*2+i,k*2+n+i,1,man[i].v); for(int j=1;j<=k;++j){ if(man[i].x>=L[j]&&man[i].x<=R[k-j+1])add(j,i+k*2,1,0); if(man[i].y>=D[j]&&man[i].y<=U[k-j+1])add(i+n+k*2,j+k,1,0); } } int ans=0; while(spfa()){ int pp=linf; for(int i=ed;i;i=bi[pre[i]].to){ pp=min(pp,bi[pre[i]^1].fl); } for(int i=ed;i;i=bi[pre[i]].to){ bi[pre[i]].fl+=pp,bi[pre[i]^1].fl-=pp;ans+=bi[pre[i]^1].w*pp; } } return ans; } signed main(){ // #ifndef ONLINE_JUDGE // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); // #endif ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); n=read(); for(int i=1;i<=n;++i) man[i].x=read(),man[i].y=read(),man[i].v=read(); for(int i=0;i<=n;++i) R[i]=U[i]=inf; m=read(); st=0,ed=n+m+1; char s; for(int i=1,x,y;i<=m;++i){ scanf(" %c",&s);x=read(),y=read(); if(s=='L')L[y+1]=max(L[y+1],x+1); else if(s=='R')R[y+1]=min(R[y+1],x-1); else if(s=='D')D[y+1]=max(D[y+1],x+1); else U[y+1]=min(U[y+1],x-1); } for(int i=1;i<=n;++i){ L[i]=max(L[i],L[i-1]),R[i]=min(R[i],R[i-1]),D[i]=max(D[i],D[i-1]),U[i]=min(U[i],U[i-1]); } int ans=0; for(int i=1;i<=n;++i){ ans=max(ans,sol(i)); } cout<<ans; }
T2、 皮胚
原 CF1572D
部分分肯定直接上费用流。
然后我们考虑每次退流过程,也就是会退掉一个极长链,其实这条链的长度不会超过
一开始是
码(写的比较唐导致常数巨大,但又不想改了,建议别看)
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define int ll typedef pair<int,int> pii; typedef unsigned long long ull; #define mk make_pair #define ps push_back #define fi first #define se second const int N=4e6+10,inf=0x3f3f3f3f; const ll mod=1e9+7,linf=0x3f3f3f3f3f3f3f3f; inline ll read(){ char c=getchar();ll x=0;bool f=0; while(!isdigit(c))f=c=='-'?1:0,c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x; } struct jj{ int to,next,fl,w; }bi[N<<1]; int n,m,K,v[N],st,ed,cnt=1,hd[N],dis[N],q[N<<1],l,r,pre[N]; bool vis[N]; int cntt[N>>1]; inline void add(int x,int y,int z,int w){bi[++cnt]={y,hd[x],z,w},hd[x]=cnt,bi[++cnt]={x,hd[y],0,-w},hd[y]=cnt;} unordered_map<int,bool> ma; inline bool spfa(){ for(auto i:ma) dis[i.fi]=dis[i.fi+m]=-linf,vis[i.fi]=vis[i.fi+m]=0; dis[ed]=-linf,vis[ed]=0; dis[st]=0,vis[st]=1;q[l=r=0]=st; while(l<=r){ int x=q[l++];vis[x]=0; for(int i=hd[x];i;i=bi[i].next){ int j=bi[i].to; if(bi[i].fl&&dis[j]<dis[x]+bi[i].w){pre[j]=i^1;dis[j]=dis[x]+bi[i].w;if(!vis[j])vis[j]=1,q[++r]=j;} } } return dis[ed]>0; } signed main(){ // #ifndef ONLINE_JUDGE freopen("pp.in","r",stdin); freopen("pp.out","w",stdout); // #endif ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); n=read(),K=read();st=(1<<n)<<1,ed=st+1;m=1<<n; K=min(K,m>>1); for(int i=0;i<m;++i) v[i]=read(); for(int i=0;i<m;++i){ for(int j=0;j<n;++j){ if((i>>j)&1){ ++cntt[v[i]+v[i^(1<<j)]]; } } } int mx=n*K*2,now=0,pos; for(pos=2e6;pos>=1;--pos){ if(now+cntt[pos]>=mx)break; now+=cntt[pos]; } for(int i=0;i<m;++i){ for(int j=0;j<n;++j){ if((i>>j)&1){ if(v[i]+v[i^(1<<j)]>pos){ add(i,(i^(1<<j))+m,1,v[i]+v[i^(1<<j)]),add(i^(1<<j),i+m,1,v[i]+v[i^(1<<j)]); ma[i]=ma[i^(1<<j)]=1; } } } } for(auto i:ma){ add(st,i.fi,1,0),add(i.fi+m,ed,1,0); } int ans=0,zh=0; for(int i=1;i<=K*2;++i){ if(!spfa())break; ++zh; for(int i=ed;i!=st;i=bi[pre[i]].to){ bi[pre[i]].fl=1,bi[pre[i]^1].fl=0;ans+=bi[pre[i]^1].w; } } cout<<(ans+(K*2-zh)*pos)/2; }
T3、 流
原 CF708D
我们考虑如何调整网络来做到流量平衡。
对于每条边分类讨论:
对于
如果我们要退流的话,就从
如果要继续流的话,分为两段,第一段
对于
我们首先把
同时我们用
关于为什么是要连一条
码
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef unsigned long long ull; #define mk make_pair #define ps push_back #define fi first #define se second const int N=1e6+10,inf=0x3f3f3f3f; const ll mod=1e9+7,linf=0x3f3f3f3f3f3f3f3f; inline ll read(){ char c=getchar();ll x=0;bool f=0; while(!isdigit(c))f=c=='-'?1:0,c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x; } struct jj{ int to,next,fl,w; }bi[N<<1]; int n,m,cnt=1,hd[N],dis[N],pre[N],st,ed,in[N],q[N],l,r; bool vis[N]; inline void add(int x,int y,int z,int w){ bi[++cnt]={y,hd[x],z,w},hd[x]=cnt,bi[++cnt]={x,hd[y],0,-w},hd[y]=cnt; } inline bool spfa(){ for(int i=0;i<=ed;++i) dis[i]=inf,vis[i]=0; dis[st]=0,vis[st]=1;q[l=r=0]=st; while(l<=r){ int x=q[l++];vis[x]=0; for(int i=hd[x];i;i=bi[i].next){ int j=bi[i].to; if(bi[i].fl&&dis[j]>dis[x]+bi[i].w){dis[j]=dis[x]+bi[i].w;pre[j]=i^1;if(!vis[j])vis[j]=1,q[++r]=j;} } } return dis[ed]!=inf; } signed main(){ // #ifndef ONLINE_JUDGE // freopen("in.in","r",stdin); // freopen("out.out","w",stdout); // #endif ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); n=read(),m=read();st=0,ed=n+1; add(n,1,inf,0); int ans=0; for(int i=1,x,y,i1,i2;i<=m;++i){ x=read(),y=read(),i1=read(),i2=read(); if(i1<=i2){ ans+=i2-i1;add(y,x,i2-i1,0);add(y,x,i1,1); } else{ add(y,x,i2,1),add(x,y,i1-i2,1); } add(x,y,inf,2); in[y]+=i2,in[x]-=i2; } for(int i=1;i<=n;++i){ if(in[i]>=0)add(st,i,in[i],0); else add(i,ed,-in[i],0); } while(spfa()){ int man=inf; for(int i=ed;i;i=bi[pre[i]].to){ man=min(man,bi[pre[i]^1].fl); } for(int i=ed;i;i=bi[pre[i]].to){ bi[pre[i]].fl+=man,bi[pre[i]^1].fl-=man;ans+=man*bi[pre[i]^1].w; } } cout<<ans; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章