답안 #415556

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
415556 2021-06-01T08:36:46 Z amoo_safar Robot (JOI21_ho_t4) C++17
0 / 100
3000 ms 53580 KB
// vaziat meshki-ghermeze !
#include <bits/stdc++.h>

#define pb push_back
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " : " << x << '\n'

using namespace std;

typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<int, int> pii;

const ll Mod = 1000000007LL;
const int N = 4e5 + 10;
const ll Inf = 2242545357980376863LL;
const ll Log = 30;

int to[N], c[N], p[N], m = 2;
vector<int> G[N];

ll dis[2][N]; // 0 -> Null, 1 -> fixed

ll sm[N], cost[N];

int nl[N];
int la[N], cn[N];

int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n, _m;
	cin >> n >> _m;
	int u, v;
	for(int i = 0; i < _m; i++){
		cin >> u >> v >> c[m] >> p[m];
		
		c[m + 1] = c[m]; p[m + 1] = p[m];
		to[m] = v; to[m + 1] = u;
		
		G[u].pb(m);
		G[v].pb(m + 1);

		m += 2;
	}
	to[0] = 1;
	to[1] = -1;
	c[0] = c[1] = _m + 2;


	for(int i = 1; i <= n; i++){
		for(auto e : G[i]){
			sm[c[e]] += p[e];
		}
		for(auto e : G[i]){
			cost[e] = sm[c[e]] - p[e];
		}
		for(auto e : G[i]){
			sm[c[e]] -= p[e];
		}
	}

	memset(dis, 31, sizeof dis);

	dis[0][0] = 0;
	set< pair<ll, pii> > st;
	st.insert({0, {0, 0}});
	ll ans = Inf;
	
	memset(la, -1, sizeof la);

	while(!st.empty()){
		pii fr = st.begin() -> S;
		st.erase(st.begin());
		ll d = dis[fr.F][fr.S];
		int ed = fr.S;
		u = to[fr.S];
		
		if(fr.F == 0){
			nl[u] ++;
			if(nl[u] > 2) continue;
		} else {
			
			// if(la[u] == c[ed]) continue;
			// la[u] = c[ed];
			// cn[u] ++;
			// if(cn[u] > 2) continue;
		}
		// cerr << "## " << d << ' ' << ed << ' ' << u << '\n';
		for(auto nx : G[u]){
			if((nx ^ 1) == ed) continue;
			// cerr << "! " << ' ' << nx << '\n';
			for(int ch = 0; ch < 2; ch ++){
				ll cst = cost[nx];
				if(ch == 0) cst = p[nx];
				if(ch == 1 && c[ed] == c[nx] && fr.F == 0)
					cst -= p[ed];
				// cerr << "^ " << dis[c]
				if(dis[ch][nx] > d + cst){
					st.erase({dis[ch][nx], {ch, nx}});
					dis[ch][nx] = d + cst;
					st.insert({dis[ch][nx], {ch, nx}});
				}
			}
		}
		if(u == n) ans = min(ans, d);
	}
	cout << (ans == Inf ? -1 : ans) << '\n';
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 17484 KB Output is correct
2 Correct 11 ms 17484 KB Output is correct
3 Correct 13 ms 17484 KB Output is correct
4 Correct 13 ms 17496 KB Output is correct
5 Correct 12 ms 17484 KB Output is correct
6 Correct 11 ms 17484 KB Output is correct
7 Correct 15 ms 17740 KB Output is correct
8 Correct 14 ms 17648 KB Output is correct
9 Incorrect 28 ms 17888 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 583 ms 35352 KB Output is correct
2 Correct 175 ms 24656 KB Output is correct
3 Correct 1377 ms 53580 KB Output is correct
4 Correct 389 ms 28172 KB Output is correct
5 Execution timed out 3101 ms 53072 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 17484 KB Output is correct
2 Correct 11 ms 17484 KB Output is correct
3 Correct 13 ms 17484 KB Output is correct
4 Correct 13 ms 17496 KB Output is correct
5 Correct 12 ms 17484 KB Output is correct
6 Correct 11 ms 17484 KB Output is correct
7 Correct 15 ms 17740 KB Output is correct
8 Correct 14 ms 17648 KB Output is correct
9 Incorrect 28 ms 17888 KB Output isn't correct
10 Halted 0 ms 0 KB -