#include<bits/stdc++.h> #define vi vector<int> #define mp make_pair #define sd second #define fr first using namespace std; typedef long long ll; const int N = 1e3+1; const ll inf = 1e14; int head[N],cnt; struct nd{ int ne,to,f,fr;ll w; }e[N*2]; void in(int x,int y,ll w,int f){ e[++cnt].to=y;e[cnt].fr=x;e[cnt].ne=head[x];head[x]=cnt;e[cnt].w=w;e[cnt].f=f; } class YamanoteLine{ public: ll howMany(int n,vi s1,vi t1,vi l1,vi s2,vi t2,vi l2){ ll l=n,r=inf,L=-1,R=inf; for(int i=0;i<s1.size();++i)s1[i]++,t1[i]++; for(int i=0;i<s2.size();++i)s2[i]++,t2[i]++; while(l!=r){ ll mid=(l+r+1)>>1; pair<bool,ll>ck=can(mid,n,s1,t1,l1,s2,t2,l2); if(ck.fr||ck.sd>0)l=mid; else r=mid-1; } R=l; l=n,r=inf; while(l!=r){ ll mid=(l+r)>>1; pair<bool,ll>ck=can(mid,n,s1,t1,l1,s2,t2,l2); if(ck.fr||ck.sd<0)r=mid; else l=mid+1; } L=l; if(L>=n&&R==inf)return -1; if(L>R)return 0; return R-L+1; } private: int q[N],cntx; pair<ll,ll> d[N]; bool vis[N]; pair<bool,ll> spfa(int n,int x){ vis[x]=1; for(int i=head[x];i;i=e[i].ne){ int y=e[i].to; pair<ll,ll> t=mp(d[x].fr+e[i].w,d[x].sd+e[i].f); if(d[y].fr>t.fr){ q[++cntx]=i; d[y]=t; if(vis[y]){ int tot=0; while(e[q[cntx]].fr!=y)tot+=e[q[cntx]].f,cntx--; tot+=e[q[cntx]].f; return mp(0,tot); } pair<bool,ll>res=spfa(n,y); cntx--; if(!res.fr)return res; } } vis[x]=0; return mp(1,0ll); } pair<bool,ll> can(ll ans,int n,vi s1,vi t1,vi l1,vi s2,vi t2,vi l2){ memset(head,0,sizeof(head));cnt=0; for(int i=0;i<s1.size();++i){ int x=s1[i],y=t1[i];ll w=l1[i]; if(y>x)in(y,x,-w,0); else in(y,x,ans-w,1); } for(int i=0;i<s2.size();++i){ int x=s2[i],y=t2[i];ll w=l2[i]; if(y>x)in(x,y,w,0); else in(x,y,w-ans,-1); } in(0,n,ans,1);in(n,0,-ans,-1); for(int i=1;i<=n;++i)in(i,i-1,-1,0),in(0,i,ans,1); for(int i=1;i<=n;++i)d[i]=mp(inf,0); d[0]=mp(0,0); memset(vis,0,sizeof(vis)); cntx=0; return spfa(n,0); } }
|