ABC E求调
  • 板块灌水区
  • 楼主mRXxy0o0
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/24 22:07
  • 上次更新2024/8/25 10:02:06
查看原帖
ABC E求调
592232
mRXxy0o0楼主2024/8/24 22:07

为啥差分约束过不了啊???

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pii;
const int N=1e6+10,M=1e6+10;
int n,m,x1,a[N],b[N],tot,h[N],ne[M],e[M],idx;
ll dis[N],w[M];
vector<int>in[N],out[N];
bool vis[N];
inline void add(int u,int v,ll x){
//	cout<<u<<" "<<v<<" "<<x<<"\n";
	ne[++idx]=h[u],h[u]=idx,e[idx]=v,w[idx]=x;
}
inline void dij(){
	memset(dis,-0x3f,sizeof dis);
	dis[0]=0;
	priority_queue<pii>q;
	q.push({0,0});
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=h[u];i;i=ne[i]){
			int v=e[i];
			ll tmp=dis[u]+w[i];
			if(tmp>dis[v]) q.push({dis[v]=tmp,v});
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&x1);
	for(int i=1,x,y;i<=m;++i){
		scanf("%d%d%d%d",&x,&y,&a[i],&b[i]);
		in[x].push_back(i);
		out[y].push_back(i);
	}
	tot=m;
	for(int i=1;i<=n;++i){
		sort(in[i].begin(),in[i].end(),[&](int x,int y){return a[x]>a[y];});
//		cout<<i<<"---\n";
		int la=0,ts=tot;
		for(int j:in[i]){
			++tot;
			add(tot,j,-a[j]);
			if(la) add(tot,la,0);
			la=tot;
		}
		for(int j:out[i]){
			int l=0,r=(int)in[i].size()-1,p=-1;
			while(l<=r){
				int mid=l+r>>1;
				if(a[in[i][mid]]>=b[j]) l=mid+1,p=mid;
				else r=mid-1;
			}
//			cout<<j<<" "<<p<<"==\n";
			if(~p){
				add(j,ts+p+1,b[j]);
			}
		}
	}
	add(0,1,x1),add(1,0,-x1);
	for(int i=2;i<=m;++i) add(0,i,0);
	dij();
	for(int i=2;i<=m;++i) printf("%lld ",dis[i]);
	return 0;
}
2024/8/24 22:07
加载中...