1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; typedef long long ll; typedef __int128 lll; const int N=30010,M=400010,inf=1000000000; const ll winf=1000000000000000000ll; struct road{ int nxt,to,f; ll w; }r[M<<1]; int head[N],cnt=1; void add(int u,int v,int f,ll w) { r[++cnt]=(road){head[u],v,f,w};head[u]=cnt; r[++cnt]=(road){head[v],u,0,-w};head[v]=cnt; } namespace MCMF{ ll dis[N]; int all,fl[N],pre[N],bef[N]; bool in[N]; queue<int>q; bool spfa(int s,int t) { for(int i=1;i<=all;i++) dis[i]=-winf,fl[i]=inf,in[i]=false; dis[s]=0; pre[t]=-1;in[s]=true; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); in[u]=false; for(int i=head[u];i;i=r[i].nxt) if(r[i].f) { int v=r[i].to; if(dis[v]<dis[u]+r[i].w) { dis[v]=dis[u]+r[i].w; fl[v]=min(fl[u],r[i].f); pre[v]=u,bef[v]=i; if(!in[v]) in[v]=true,q.push(v); } } } return pre[t]!=-1; } int maxf;ll minw; void work(int s,int t) { while(spfa(s,t)) { maxf+=fl[t],minw+=fl[t]*dis[t]; for(int u=t;u!=s;u=pre[u]) r[bef[u]].f-=fl[t],r[bef[u]^1].f+=fl[t]; } } void clear() { for(int i=1;i<=all;i++) head[i]=dis[i]=0; all=0;cnt=1; maxf=minw=0; } } inline void chkmin(int &x,int y){x=min(x,y);} inline void chkmax(int &x,int y){x=max(x,y);} int x[N],y[N];ll w[N]; int px[N],py[N],po[N]; int s,t,tt,n,m; int lx[N],rx[N],ly[N],ry[N]; ll ans=0; void solve(int k) { auto id=[&](int x,int d){return x+2*k+d*n;}; s=id(n,1)+1,t=s+1;MCMF::all=t; for(int i=1;i<=k;i++) add(s,i,1,0),add(i+k,t,1,0); for(int i=1;i<=n;i++) add(id(i,0),id(i,1),1,w[i]),lx[i]=ly[i]=1,rx[i]=ry[i]=100; for(int i=1;i<=m;i++) if(po[i]==0 && py[i]+1<=k) chkmax(lx[py[i]+1],px[i]+1); else if(po[i]==1 && py[i]+1<=k) chkmin(rx[k-py[i]],px[i]-1); else if(po[i]==2 && py[i]+1<=k) chkmax(ly[py[i]+1],px[i]+1); else if(po[i]==3 && py[i]+1<=k) chkmin(ry[k-py[i]],px[i]-1); for(int i=2;i<=k;i++) chkmax(lx[i],lx[i-1]),chkmax(ly[i],ly[i-1]); for(int i=k-1;i;i--) chkmin(rx[i],rx[i+1]),chkmin(ry[i],ry[i+1]); for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) if(lx[i]<=x[j] && x[j]<=rx[i]) add(i,id(j,0),1,0); for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) if(ly[i]<=y[j] && y[j]<=ry[i]) add(id(j,1),i+k,1,0); MCMF::work(s,t); if(MCMF::maxf==k) ans=max(ans,MCMF::minw); MCMF::clear(); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d%lld",&x[i],&y[i],&w[i]); scanf("%d",&m); for(int i=1;i<=m;i++) { char op[3]; scanf("%s%d%d",op,&px[i],&py[i]); po[i]=(op[0]=='L'?0:(op[0]=='R'?1:(op[0]=='D'?2:3))); } for(int i=1;i<=n;i++) solve(i); printf("%lld\n",ans); return 0; }
|