RE求调
  • 板块学术版
  • 楼主intemist
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/3/12 12:26
  • 上次更新2023/10/28 06:47:37
查看原帖
RE求调
531206
intemist楼主2022/3/12 12:26
#include <bits/stdc++.h>
#define PII pair<int, int>

using namespace std;

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
	while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
	return x * f;
}

int n;
const int maxn = 5e5 + 10;

bool vis[maxn], p[maxn], now[maxn];
long long dis[maxn];
int l[maxn], r[maxn];

priority_queue<PII, vector<PII>, greater<PII > > q;

int h[maxn], nxt[maxn], en;

struct Edge { int u, v; long long w; } e[maxn * 13];

void addEdge(int u ,int v, long long w) {
	e[++ en] = Edge{u, v, w};
	nxt[en] = h[u];
	h[u] = en;
}

void dij(int k) {
	
	for (int i = 0; i < l[k]; i ++) {		
		dis[i] = 1e18;
		vis[i] = 0;
	}
	dis[0] = 0;
	
	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 > 0; i = nxt[i]) {
			int v = e[i].v;
			int w = e[i].w;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				q.push({dis[v], v});
			}
		}
	}
}

signed main() {
	n = read();
	
	for (int i = 1; i <= n; i ++) {
		l[i] = read(), r[i] = read();
		en = 0;
		for (int j = 0; j < l[i]; j ++) nxt[j] = h[j] = 0;
		for (int j = 0; j < l[i]; j ++)
			for (int k = l[i] + 1; k <= r[i]; k ++)
				addEdge(j, (j + k) % l[i], k);
		dij(i);
		
		for (int j = 0; j < l[i]; j ++)
			for (int k = dis[j] - l[i]; k >= 0; k -= l[i])
				now[k] |= 1;
		
		for (int j = 1; j < maxn; j ++)
			if (j == 1) p[j] = now[j];
			else p[j] |= now[j];
	}
	
	int sum = 0;
	for (int i = 1; i < maxn; i ++) sum += p[i];
	cout << (int)(1e9 - sum);
} 

Input\text{Input}

10
4 4
22558 22564
17994 18002
6 6
27820 27821
1011 1012
14109 14116
28551 28558
15707 15723
10402 10424

题目无

2022/3/12 12:26
加载中...