Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Nguyen Huu Hoang Minh
- #include <bits/stdc++.h>
- #define sz(x) int(x.size())
- #define all(x) x.begin(),x.end()
- #define reset(x) memset(x, 0,sizeof(x))
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- #define N 5005
- #define remain(x) if (x > MOD) x -= MOD
- #define ii pair<int, int>
- #define iii pair<int, ii>
- #define iiii pair< ii , ii >
- #define viiii vector< iiii >
- #define vi vector<int>
- #define vii vector< ii >
- #define bit(x, i) (((x) >> (i)) & 1)
- #define Task "path"
- #define int long long
- using namespace std;
- typedef long double ld;
- const int inf = 1e10;
- const int minf = -1e10;
- int m, n;
- int a[8][5005];
- int dp[3][5005];
- int q;
- int d[8][505][8][505];
- int dx[4] = {1,-1,0,0};
- int dy[4] = {0,0,1,-1};
- bool ok(int x, int y){
- return 1 <= x && x <= m && 1 <= y && y <= n;
- }
- void readfile()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);cout.tie(0);
- if (fopen(Task".inp","r"))
- {
- freopen(Task".inp","r",stdin);
- freopen(Task".out","w",stdout);
- }
- cin >> m >> n;
- for(int i=1; i<=m; i++){
- for(int j=1; j<=n; j++){
- cin >> a[i][j];
- }
- }
- }
- void solve1(){
- memset(d, 0x3f3f3f3f3f3f3f3f, sizeof d);
- cin >> q;
- while (q--){
- int x, y, u, v; cin >> x >> y >> u >> v;
- if (d[x][y][u][v] < 0x3f3f3f3f3f3f3f3f) cout << d[x][y][u][v] << '\n';
- else if (d[u][v][x][y] < 0x3f3f3f3f3f3f3f3f) cout << d[u][v][x][y] << '\n';
- else{
- priority_queue<iii, vector<iii>, greater<iii>> q;
- q.push(iii(a[x][y],ii(x,y)));
- d[x][y][x][y] = a[x][y];
- while (q.size()){
- int uu = q.top().se.fi;
- int vv = q.top().se.se;
- int du = q.top().fi;
- q.pop();
- if (du != d[x][y][uu][vv]) continue;
- for(int k=0; k<4; k++){
- int xx = uu + dx[k];
- int yy = vv + dy[k];
- if (!ok(xx,yy)) continue;
- if (d[x][y][xx][yy] > d[x][y][uu][vv] + a[xx][yy]){
- d[x][y][xx][yy] = d[x][y][uu][vv] + a[xx][yy];
- q.push(iii(d[x][y][xx][yy],ii(xx,yy)));
- }
- }
- }
- cout << d[x][y][u][v] << '\n';
- }
- }
- }
- void solve2(){
- memset(dp, 0x3f3f3f3f3f3f3f, sizeof dp);
- cin >> q;
- while (q--){
- int u, v, x, y; cin >> u >> v >> x >> y;
- if (v > y){
- swap(u,x); swap(v,y);
- }
- //cout << u << ' ' << v << ' ' << x << ' ' << y << endl;
- dp[u][v] = a[u][v];
- if (u==1) dp[2][v] = dp[u][v]+a[2][v];
- else dp[1][v] = dp[u][v] + a[1][v];
- for(int i=v+1; i<=y; i++){
- dp[1][i] = dp[1][i-1] + a[1][i]; int t1 = dp[1][i];
- dp[2][i] = dp[2][i-1] + a[2][i]; int t2 = dp[2][i];
- dp[1][i] = min(dp[1][i], t2 + a[1][i]);
- dp[2][i] = min(dp[2][i], t1 + a[2][i]);
- //cout << dp[1][i] << ' ' << dp[2][i] << '\n';
- }
- cout << dp[x][y] << '\n';
- }
- }
- void proc()
- {
- if (n<=500){
- solve1();
- }//40%
- else if (m==2){
- solve2();
- }
- }
- signed main()
- {
- readfile();
- proc();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement