wa+tle 求助
查看原帖
wa+tle 求助
397282
_NTT_楼主2024/1/10 18:57

rt,调了一天了,但是没看出来哪里有问题 /dk

#include <bits/stdc++.h>
//#define int ll
#define gcd __gcd
#define il inline
#define pii pair<int, int>
#define fir first
#define sec second
#define pb push_back
#define eb emplace_back
#define file(name) freopen(name".in", "r", stdin); freopen(name".out", "w", stdout);
#define rep(i, l, r) for(int i = (l); i <= (r); ++i)
#define per(i, r, l) for(int i = (r); i >= (l); --i)
using namespace std;

typedef long long ll;

const int N = 2e5 + 10, M = sqrt(N) + 10, mod = 998244353, INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;

bool f;
int n, m, q, res[N], dis[N][M];
vector<pii> g[N];
bitset<N> vis;

il int id(int x, int y) {
	return (x - 1) * m + y - 1;
}

il void adde(int x, int y, int w) {
	g[x].pb({y, w}); g[y].pb({x, w});
}

struct query {
	int x1, y1, x2, y2, id;
};
vector<query> v;

void solve(int l, int r, vector<query> &v) {
	if(v.empty() || l > r) return ;
	int mid = l + r >> 1;
	vector<query> ls, rs;
//	cout << "calc" << l << ' ' << r << endl;
	
	rep(i, 1, n) {
//		memset(dis, 0x3f, sizeof(dis)); vis.reset();
		rep(x, 1, n) rep(y, l, r) vis[id(x, y)] = 0, dis[id(x, y)][i] = INF;
		
		priority_queue<pii, vector<pii>, greater<pii>> q;
		q.push({dis[id(i, mid)][i] = 0, id(i, mid)});
		
		while(q.size()) {
			int u = q.top().sec; q.pop();
			
			if(vis[u]) continue;
			vis[u] = 1;
			
			for(auto [v, w] : g[u]) {
				if(v % m < l - 1 || v % m > r - 1) continue;
				if(dis[v][i] > dis[u][i] + w) {
					dis[v][i] = dis[u][i] + w;
//					cout << v << ' ' << i << '=' << dis[v][i] << endl;
					if(!vis[v]) q.push({dis[v][i], v});
				}
			}
		}
	}
	
	
	for(auto &i : v) if(i.y1 < mid && i.y2 < mid) ls.eb(i); else if(i.y1 > mid && i.y2 > mid) rs.eb(i); else {
		rep(j, 1, n) res[i.id] = min(res[i.id], dis[id(i.x1, i.y1)][j] + dis[id(i.x2, i.y2)][j]);	
	}
	
	solve(l, mid - 1, ls); solve(mid + 1, r, rs);
}

signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n >> m;
	f = n > m;
	
	rep(i, 1, n) rep(j, 1, m - 1) {
		int r;
		cin >> r;
		if(f) adde(id(j, i), id(j + 1, i), r);
		else adde(id(i, j), id(i, j + 1), r);
	}
	
	rep(i, 1, n - 1) rep(j, 1, m) {
		int r;
		cin >> r;
		if(f) adde(id(j, i), id(j, i + 1), r);
		else adde(id(i, j), id(i + 1, j), r);
	}
	
	cin >> q;
	v.resize(q);
	rep(i, 0, q - 1) {
		res[v[i].id = i] = INF;
		if(f) cin >> v[i].y1 >> v[i].x1 >> v[i].y2 >> v[i].x2;
		else cin >> v[i].x1 >> v[i].y1 >> v[i].x2 >> v[i].y2;
	}
	
	if(f) swap(n, m);
	solve(1, m, v);
	rep(i, 0, q - 1) cout << res[i] << '\n';
	
	return 0;	
}
2024/1/10 18:57
加载中...