답안 #658308

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
658308 2022-11-12T19:23:30 Z inksamurai Toll (BOI17_toll) C++17
49 / 100
94 ms 25180 KB
#include <bits/stdc++.h>

// cut here
#ifdef _MSC_VER
#include <intrin.h>
#endif
 
namespace atcoder {
 
namespace internal {
 
int ceil_pow2(int n) {
    int x = 0;
    while ((1U << x) < (unsigned int)(n)) x++;
    return x;
}
 
int bsf(unsigned int n) {
#ifdef _MSC_VER
    unsigned long index;
    _BitScanForward(&index, n);
    return index;
#else
    return __builtin_ctz(n);
#endif
}
 
}  // namespace internal
 
}  // namespace atcoder
 
 
namespace atcoder {
 
template <class S, S (*op)(S, S), S (*e)()> struct segtree {
  public:
    segtree() : segtree(0) {}
    segtree(int n) : segtree(std::vector<S>(n, e())) {}
    segtree(const std::vector<S>& v) : _n(int(v.size())) {
        log = internal::ceil_pow2(_n);
        size = 1 << log;
        d = std::vector<S>(2 * size, e());
        for (int i = 0; i < _n; i++) d[size + i] = v[i];
        for (int i = size - 1; i >= 1; i--) {
            update(i);
        }
    }
 
    void set(int p, S x) {
        assert(0 <= p && p < _n);
        p += size;
        d[p] = x;
        for (int i = 1; i <= log; i++) update(p >> i);
    }
 
    S get(int p) {
        assert(0 <= p && p < _n);
        return d[p + size];
    }
 
    S prod(int l, int r) {
        assert(0 <= l && l <= r && r <= _n);
        S sml = e(), smr = e();
        l += size;
        r += size;
 
        while (l < r) {
            if (l & 1) sml = op(sml, d[l++]);
            if (r & 1) smr = op(d[--r], smr);
            l >>= 1;
            r >>= 1;
        }
        return op(sml, smr);
    }
 
    S all_prod() { return d[1]; }
 
    template <bool (*f)(S)> int max_right(int l) {
        return max_right(l, [](S x) { return f(x); });
    }
    template <class F> int max_right(int l, F f) {
        assert(0 <= l && l <= _n);
        assert(f(e()));
        if (l == _n) return _n;
        l += size;
        S sm = e();
        do {
            while (l % 2 == 0) l >>= 1;
            if (!f(op(sm, d[l]))) {
                while (l < size) {
                    l = (2 * l);
                    if (f(op(sm, d[l]))) {
                        sm = op(sm, d[l]);
                        l++;
                    }
                }
                return l - size;
            }
            sm = op(sm, d[l]);
            l++;
        } while ((l & -l) != l);
        return _n;
    }
 
    template <bool (*f)(S)> int min_left(int r) {
        return min_left(r, [](S x) { return f(x); });
    }
    template <class F> int min_left(int r, F f) {
        assert(0 <= r && r <= _n);
        assert(f(e()));
        if (r == 0) return 0;
        r += size;
        S sm = e();
        do {
            r--;
            while (r > 1 && (r % 2)) r >>= 1;
            if (!f(op(d[r], sm))) {
                while (r < size) {
                    r = (2 * r + 1);
                    if (f(op(d[r], sm))) {
                        sm = op(d[r], sm);
                        r--;
                    }
                }
                return r + 1 - size;
            }
            sm = op(d[r], sm);
        } while ((r & -r) != r);
        return 0;
    }
 
  private:
    int _n, size, log;
    std::vector<S> d;
 
    void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
};
 
}  // namespace atcoder
// cut here 
// #define int ll
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define rng(i,c,n) for(int i=c;i<n;i++)
#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define vec(...) vector<__VA_ARGS__>
#define _3TBjhXk ios::sync_with_stdio(0),cin.tie(0)
typedef long long ll;
using pii=pair<int,int>;
using vi=vector<int>;
void print(){cout<<'\n';}
template<class h,class...t>
void print(const h&v,const t&...u){cout<<v<<' ',print(u...);}

const int inf=1e8;

struct dat{
	int frl,bkl; // front level, back level
	int res[5][5];
	dat(){
		rep(i,5){
			rep(j,5){
				res[i][j]=inf;
			}
		}
	}
};

int k,n,m,q;
int es[50011][5][5];

dat op(const dat l,const dat r){
	if(l.bkl==-1) return r;
	if(r.frl==-1) return l;
	dat res;
	res.frl=l.frl;
	res.bkl=r.bkl;
	int frm=l.bkl;
	int to=r.frl;
	// if(frm==0 and to==1){
	// 	print("go");
	// }
	rep(j0,k){
		rep(j1,k){
			rep(j2,k){
				rep(j3,k){
					// j0 is l.frl
					// j1 and j2 should merge
					// j3 is r.bkr
					res.res[j0][j3]=min(res.res[j0][j3],l.res[j0][j1]+r.res[j2][j3]+es[l.bkl][j1][j2]);
				}
			}
		}
	}
	return res;
}
dat _e;
dat e(){
	return _e;
}

signed main(){
_3TBjhXk;
	cin>>k>>n>>m>>q;
	rep(i,n){
		rep(j0,k){
			rep(j1,k){
				es[i][j0][j1]=inf;
			}
		}
	}
	rep(j0,k){
		rep(j1,k){
			_e.bkl=-1;
			_e.frl=-1;
			_e.res[j0][j1]=inf;
		}
	}
	rep(i,m){
		int u,v,w;
		cin>>u>>v>>w;
		// print(u/k,u%k,v%k,w);
		es[(u/k)][u%k][v%k]=w;
	}
	atcoder::segtree<dat,op,e> seg(n/k+1);
	for(int i=0;i<n;i+=k){
		dat now;
		now.frl=i/k;
		now.bkl=i/k;
		for(int j=i;j<min(n,i+k);j++){
			now.res[j%k][j%k]=0;
		}
		seg.set(i/k,now);
	}
	rep(_,q){
		int u,v;
		cin>>u>>v;
		int ans=inf;
		if(u/k!=v/k){
			dat now=seg.prod(u/k,v/k+1);
			ans=now.res[u%k][v%k];
		}		
		print(ans==inf?-1:ans);
	}
}

Compilation message

toll.cpp: In function 'dat op(dat, dat)':
toll.cpp:182:6: warning: unused variable 'frm' [-Wunused-variable]
  182 |  int frm=l.bkl;
      |      ^~~
toll.cpp:183:6: warning: unused variable 'to' [-Wunused-variable]
  183 |  int to=r.frl;
      |      ^~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 68 ms 25164 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 16272 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 5 ms 864 KB Output is correct
8 Correct 6 ms 636 KB Output is correct
9 Correct 58 ms 25128 KB Output is correct
10 Correct 94 ms 16064 KB Output is correct
11 Correct 53 ms 16460 KB Output is correct
12 Correct 56 ms 15184 KB Output is correct
13 Correct 92 ms 7940 KB Output is correct
14 Correct 39 ms 9164 KB Output is correct
15 Correct 66 ms 6768 KB Output is correct
16 Correct 69 ms 6740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 328 KB Output is correct
6 Correct 2 ms 724 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 3 ms 468 KB Output is correct
9 Correct 3 ms 468 KB Output is correct
10 Correct 53 ms 25036 KB Output is correct
11 Correct 49 ms 16200 KB Output is correct
12 Correct 62 ms 16068 KB Output is correct
13 Correct 62 ms 16204 KB Output is correct
14 Correct 58 ms 15688 KB Output is correct
15 Correct 55 ms 6732 KB Output is correct
16 Correct 60 ms 6736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 328 KB Output is correct
6 Correct 2 ms 724 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 3 ms 468 KB Output is correct
9 Correct 3 ms 468 KB Output is correct
10 Correct 53 ms 25036 KB Output is correct
11 Correct 49 ms 16200 KB Output is correct
12 Correct 62 ms 16068 KB Output is correct
13 Correct 62 ms 16204 KB Output is correct
14 Correct 58 ms 15688 KB Output is correct
15 Correct 55 ms 6732 KB Output is correct
16 Correct 60 ms 6736 KB Output is correct
17 Correct 49 ms 16328 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 1 ms 324 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
23 Correct 3 ms 724 KB Output is correct
24 Correct 3 ms 636 KB Output is correct
25 Correct 16 ms 504 KB Output is correct
26 Correct 13 ms 596 KB Output is correct
27 Correct 51 ms 25180 KB Output is correct
28 Correct 67 ms 15996 KB Output is correct
29 Correct 70 ms 16336 KB Output is correct
30 Correct 62 ms 15628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 68 ms 25164 KB Output isn't correct
2 Halted 0 ms 0 KB -