社区讨论

TLE 70pts求助

P3337[ZJOI2013] 防守战线参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mkp7v679
此快照首次捕获于
2026/01/22 16:55
2 个月前
此快照最后确认于
2026/01/23 09:00
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pii;
#define pb push_back
#define mkp make_pair
#define fi first
#define se second

namespace acac
{
	int read()
	{
		int ans=0;
		char ch=getchar();
		while(ch<'0'||ch>'9')
		{
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=ans*10+ch-'0';
			ch=getchar();
		}
		return ans;
	}

	struct edge
	{
		int to,ne;
		ll c,w;
	}e[400010];
	int H[200010];
	int cnt=1;
	
	void add(int a,int b,ll c,ll w)
	{
		e[++cnt].to=b;
		e[cnt].ne=H[a];
		H[a]=cnt;
		e[cnt].c=c;
		e[cnt].w=w;
	}
	
	void ADD(int a,int b,ll c,ll w)
	{
		// if(c<2e7)cout<<a<<' '<<b<<' '<<c<<' '<<w<<endl;
		// else cout<<a<<' '<<b<<" "<<(c/(2e7))<<"inf "<<w<<endl;;
		add(a,b,c,w),add(b,a,0,-w);
	}
	
	ll dis[1010],hyh[200010],D[1000010],T[1010],qwq[1010];
	ll ans=0;
	priority_queue<pii,vector<pii>,greater<pii> > heap;

	void spfa(int s,int t)
	{
		memset(qwq,63,sizeof(qwq));
		memset(T,0,sizeof(T));
        int l=1,r=1;
        qwq[s]=0,D[l]=s,T[s]=1;
        while(l<=r)
        {
            int u=D[l++];
            T[u]=0;
            for(int i=H[u];i;i=e[i].ne)
            {
                int v=e[i].to;
                if(!e[i].c)continue;
                
                if(qwq[v]>qwq[u]+e[i].w)
                {
                	qwq[v]=qwq[u]+e[i].w;
                	if(!T[v])D[++r]=v,T[v]=1;
				}
            }
        }
		memset(T,0,sizeof(T));
	}
	
	int dij(int s, int t) {
		memset(dis,63,sizeof(dis));
		dis[s]=0;
		heap.push(mkp(0,s));
		while (!heap.empty()) {
			pii cur = heap.top();
			heap.pop();
			int u = cur.se;
			hyh[u]=H[u];
			if (cur.fi>dis[u]) continue;
			for (int i=H[u];i;i=e[i].ne) 
			{
				int v = e[i].to;
				ll w=e[i].w+qwq[u]-qwq[v];
				if(e[i].c&&(dis[v]>dis[u]+w))
				{
					dis[v]=dis[u]+w;
					heap.push(mkp(dis[v],v));
				}
			}
		}
		return dis[t]<1e9;
	}
	
	
	
	ll dfs(int u,int t,ll fl)
	{
		if(!fl||u==t)return fl;
		ll knd=0;
		T[u]=1;
		for(int i=hyh[u];i&&fl;i=e[i].ne)
		{
			hyh[u]=i;
			int v=e[i].to;
			ll w=e[i].w+qwq[u]-qwq[v];
			if(T[v]||!e[i].c||dis[u]+w!=dis[v])continue;
			ll k=dfs(v,t,min(fl,1ll*e[i].c));
			e[i^1].c+=k,e[i].c-=k;
			knd+=k;
			fl-=k;
		}
		T[u]=0;
		return knd;
	}
	
	ll FLOW(int s,int t)
	{
		ll res=0;
		while(dij(s,t))
		{
		//	cout<<"IN\n";
			int mfy=dfs(s,t,2e7);
			for(int i=s;i<=t;i++)
			{
				if(dis[i]<1e9)qwq[i]+=dis[i];
			}
			res+=mfy;
			ans+=mfy*qwq[t];
		//	cout<<"OUT\n";
		}
		return res;
	}

	const int inf=1e7;
	ll P[10010];
	
	int main()
	{
		int n=read(),m=read(),s=0,t=n+2;
		for(int i=1;i<=n;i++)
		{
			int a=read();
			ADD(i,i+1,a,0);
		}
		for(int i=1;i<=m;i++)
		{
			int l=read(),r=read(),w=read();
			ADD(l,r+1,inf,w);
			ans-=1ll*inf*w;
			P[l]+=inf,P[r+1]-=inf;
		}
		for(int i=1;i<=n+1;i++)
		{
			if(P[i]>0)ADD(s,i,P[i],0);
			else if(P[i]<0)ADD(i,t,-P[i],0);
		}
		spfa(s,t);
		FLOW(s,t);
		cout<<-ans;
		return 0;
	}
}

int main()
{
	acac::main();
	return 0;
}
怎么对偶都被卡了\bx

回复

0 条回复,欢迎继续交流。

正在加载回复...