这差分约束该怎么建图啊
查看原帖
这差分约束该怎么建图啊
999274
CNS_5t0_0r2楼主2024/12/2 12:50

我这样建,只能拿 6060 分:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9,M = 1e6 + 9,INF = 0x3f3f3f3f;
int T;
int n,m,L,V;
int ans1,ans2;
int s[N];
struct interval{
	int l,r;
} t[N];
int cnt;
struct edge{
	int to,cost,nex;
} e[M << 3];
int head[N],ecnt;
void addedge(int u,int v,int w){
	ecnt++;
	e[ecnt] = (edge){v,w,head[u]};
	head[u] = ecnt;
}

int dis[N];
bool in_queue[N];
queue<int> q;
void SPFA(int s){
	q.push(s);
	dis[s] = 0;
	in_queue[s] = true;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		in_queue[u] = false;
		for(int i = head[u];i;i = e[i].nex){
			int v = e[i].to;
			if(dis[v] < e[i].cost + dis[u]){
				dis[v] = e[i].cost + dis[u];
				if(in_queue[v])
					continue;
				in_queue[v] = true;
				q.push(v);
			}
		}
	}
}

void clear(){
	cnt = ecnt = 0;
	ans1 = ans2 = 0;
	for(int i = 0;i <= L;i++){
		s[i] = 0;
		head[i] = 0;
		in_queue[i] = false;
		dis[i] = -INF;
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> T;
	while(T--){
		cin >> n >> m >> L >> V;
		L++;
		clear();
		for(int i = 1;i <= n;i++){
			int d,v,a;
			cin >> d >> v >> a;
			d++;
			if(a > 0){
				if(v > V){
					t[++cnt] = (interval){d,L};
					continue;
				}
				int q = (V * V - v * v) / (a << 1),r = (V * V - v * v) % (a << 1);
				if(d + q + 1 <= L)
					t[++cnt] = (interval){d + q + 1,L};
			}
			else if(a < 0){
				if(v <= V)
					continue;
				int q = (V * V - v * v) / (a << 1),r = (V * V - v * v) % (a << 1);
				int ed = min(r ? d + q : d + q - 1,L);
				if(d <= ed)
					t[++cnt] = (interval){d,ed};
			}
			else if(v > V)
				t[++cnt] = (interval){d,L};
		}
		for(int i = 1;i <= m;i++){
			int p;
			cin >> p;
			p++;
			s[p]++;
		}
		for(int i = 1;i <= L;i++){
			if(s[i]){
				addedge(i,i - 1,-1);
				addedge(i - 1,i,0);
			}
			else{
				addedge(i,i - 1,0);
				addedge(i - 1,i,0);
			}
		}
		for(int i = 1;i <= L;i++)
			s[i] += s[i - 1];
		for(int i = 1;i <= cnt;i++)
			if(s[t[i].r] - s[t[i].l - 1]){
				ans1++;
				addedge(t[i].l - 1,t[i].r,1);
			}
		SPFA(0);
		ans2 = m - dis[L];
		cout << ans1 << ' ' << ans2 << '\n';
	}
	return 0;
}
2024/12/2 12:50
加载中...