QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#815563 | #9877. Segment Tree | ucup-team5243# | WA | 65ms | 3756kb | C++23 | 12.2kb | 2024-12-15 15:39:26 | 2024-12-15 15:39:47 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
// ★★★★★ いわゆるQCFium、おまじない的につけとくと速い
#ifndef LOCAL_TEST
#pragma GCC target ("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#endif // LOCAL_TEST
// ★★★★★ 型名を短くする、ちょっと嬉しい
using ll = long long;
using pii = pair<int, int>; using pll = pair<ll, ll>;
using vi = vector<int>; using vvi = vector<vi>; using vvvi = vector<vvi>;
using vl = vector<ll>; using vvl = vector<vl>; using vvvl = vector<vvl>;
using vb = vector<bool>; using vvb = vector<vb>; using vvvb = vector<vvb>;
using vc = vector<char>; using vvc = vector<vc>; using vvvc = vector<vvc>;
using vd = vector<double>; using vvd = vector<vd>; using vvvd = vector<vvd>;
using vs = vector<string>; using vvs = vector<vector<string>>; using vvvs = vector<vector<vector<string>>>;
// ★★★ 多次元vector初期化用の関数、ちょっと癖があるけど短く書ける
// テンプレなし:vector dp(n+1, vector(m+1, vector<ll>(k+1, 0)));
// テンプレあり:auto dp = vvv<ll>(n+1, m+1, k+1, 0);
template<typename T> vector<vector<T>> vv(int h, int w, T val = T()) { return vector(h, vector<T>(w, val)); }
template<typename T> vector<vector<vector<T>>> vvv(int h1, int h2, int h3, T val = T()) { return vector(h1, vector(h2, vector<T>(h3, val))); }
template<typename T> vector<vector<vector<vector<T>>>> vvvv(int h1, int h2, int h3, int h4, T val = T()) { return vector(h1, vector(h2, vector(h3, vector<T>(h4, val)))); }
// ★★ いわゆるheapq、C++のデフォルトpriority_queueは大きい順(Python、Nimとは逆)に注意
template <class T> using priority_queue_min = priority_queue<T, vector<T>, greater<T>>;
// ★ 定数系、お好みで
constexpr double PI = 3.14159265358979323;
constexpr int INF = 100100111; constexpr ll INFL = 3300300300300300491LL;
float EPS = 1e-8; double EPSL = 1e-10;
// ★★★★ 入出力高速化、おまじない
struct Nyan { Nyan() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(18); } } nyan;
// マクロ類
// わりと全部使う
// all: sort(all(a)) とか lower_bount(all(a), x) とか
// rep: オーバーロードしているので、引数の個数で挙動が変わる、基本Pythonのrangeに近い感覚で使えるようにしてるはず
// rep(5) -> 5回ループ(新たにループ変数は作らない)
// rep(i, 5) -> i=0,1,...,4
// rep(i, 5) -> i=0,1,...,4
// rep(i, 1, 6) -> i=1,...,4
// rep(i, 1, 6, 2) -> i=1,3,5
// rep(i, 10, -1, -1) -> i=10,9,.., 0
// smod, sdiv: python-like mod, div
// uniq: 重複削除、ソートされるのに注意
// vl a = {1, 3, 2, 5, 2, 3}; uniq(a); // a = {1, 2, 3, 5}
#define all(a) (a).begin(), (a).end()
#define sz(x) ((ll)(x).size())
#define rep1(n) for(ll dummy_iter = 0LL; dummy_iter < n; ++dummy_iter) // 0,1,...,n-1
#define rep2(i, n) for(ll i = 0LL, i##_counter = 0LL; i##_counter < ll(n); ++(i##_counter), (i) = i##_counter) // i=0,1,...,n-1
#define rep3(i, s, t) for(ll i = ll(s), i##_counter = ll(s); i##_counter < ll(t); ++(i##_counter), (i) = (i##_counter)) // i=s,s+1,...,t-1
#define rep4(i, s, t, step) for(ll i##_counter = step > 0 ? ll(s) : -ll(s), i##_end = step > 0 ? ll(t) : -ll(t), i##_step = abs(step), i = ll(s); i##_counter < i##_end; i##_counter += i##_step, i = step > 0 ? i##_counter : -i##_counter) // i=s,s+step,...,<t
#define overload4(a, b, c, d, e, ...) e
#define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define repe(a, v) for(auto& a : (v)) // iterate over all elements in v
#define smod(n, m) ((((n) % (m)) + (m)) % (m))
#define sdiv(n, m) (((n) - smod(n, m)) / (m))
#define uniq(a) {sort(all(a)); (a).erase(unique(all(a)), (a).end());}
// ★★ Yes, No なくても困らない
int Yes(bool b=true) { cout << (b ? "Yes\n" : "No\n"); return 0; };
int YES(bool b=true) { cout << (b ? "YES\n" : "NO\n"); return 0; };
int No(bool b=true) {return Yes(!b);};
int NO(bool b=true) {return YES(!b);};
// ★★★★ max, min, sum のvector向けオーバーロード、デフォルトがちょっと使いにくいので
template<typename T, size_t N> T max(array<T, N>& a) { return *max_element(all(a)); };
template<typename T, size_t N> T min(array<T, N>& a) { return *min_element(all(a)); };
template<typename T> T max(vector<T>& a) { return *max_element(all(a)); };
template<typename T> T min(vector<T>& a) { return *min_element(all(a)); };
template<typename T> vector<T> vec_slice(const vector<T>& a, int l, int r) { vector<T> rev; rep(i, l, r) rev.push_back(a[i]); return rev; };
template<typename T> T sum(vector<T>& a, T zero = T(0)) { T rev = zero; rep(i, sz(a)) rev += a[i]; return rev; };
// ★★★ vector の各要素を1増やす/減らす、グラフ系の入力受けでちょっと嬉しい
// vector<ll> a = {1, 2, 4}; ++a; // a = {2, 3, 5}
template <class T> inline vector<T>& operator--(vector<T>& v) { repe(x, v) --x; return v; }
template <class T> inline vector<T>& operator++(vector<T>& v) { repe(x, v) ++x; return v; }
// ★★★★ 整数pow/sqrt
ll powm(ll a, ll n, ll mod=INFL) {
ll res = 1;
while (n > 0) {
if (n & 1) res = (res * a) % mod;
if (n > 1) a = (a * a) % mod;
n >>= 1;
}
return res;
}
ll sqrtll(ll x) {
assert(x >= 0);
ll rev = sqrt(x);
while(rev * rev > x) --rev;
while((rev+1) * (rev+1)<=x) ++rev;
return rev;
}
// ★★★★ chmax, chmin
template <class T> inline bool chmax(T& M, const T& x) { if (M < x) { M = x; return true; } return false; }
template <class T> inline bool chmin(T& m, const T& x) { if (m > x) { m = x; return true; } return false; }
// ★★★★★ vector を直接cinできるようにする
// map, set, multiset とかを直接 cout できるようにする
template <class T, class U> inline istream& operator>>(istream& is, pair<T, U>& p);
template <class T> inline istream& operator>>(istream& is, vector<T>& v);
template <class T, class U> inline ostream& operator<<(ostream& os, const pair<T, U>& p);
template <class T> inline ostream& operator<<(ostream& os, const vector<T>& v);
template <typename T, typename S> ostream &operator<<(ostream &os, const map<T, S> &mp);
template <typename T> ostream &operator<<(ostream &os, const set<T> &st);
template <typename T> ostream &operator<<(ostream &os, const multiset<T> &st);
template <typename T> ostream &operator<<(ostream &os, const unordered_set<T> &st);
template <typename T> ostream &operator<<(ostream &os, deque<T> q);
template <class T, class Container, class Compare> ostream &operator<<(ostream &os, priority_queue<T, Container, Compare> pq);
// overload operators
template <class T, class U> inline istream& operator>>(istream& is, pair<T, U>& p) { is >> p.first >> p.second; return is; }
template <class T> inline istream& operator>>(istream& is, vector<T>& v) { repe(x, v) is >> x; return is; }
template <class T, class U> inline ostream& operator<<(ostream& os, const pair<T, U>& p) { os << p.first << " " << p.second; return os; }
template <class T> inline ostream& operator<<(ostream& os, const vector<T>& v) { rep(i, sz(v)) { os << v.at(i); if (i != sz(v) - 1) os << " "; } return os; }
template <typename T, typename S> ostream &operator<<(ostream &os, const map<T, S> &mp) { for (auto &[key, val] : mp) { os << key << ":" << val << " "; } return os; }
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) { auto itr = st.begin(); for (int i = 0; i < (int)st.size(); i++) { os << *itr << (i + 1 != (int)st.size() ? " " : ""); itr++; } return os; }
template <typename T> ostream &operator<<(ostream &os, const multiset<T> &st) { auto itr = st.begin(); for (int i = 0; i < (int)st.size(); i++) { os << *itr << (i + 1 != (int)st.size() ? " " : ""); itr++; } return os; }
template <typename T> ostream &operator<<(ostream &os, const unordered_set<T> &st) { ll cnt = 0; for (auto &e : st) { os << e << (++cnt != (int)st.size() ? " " : ""); } return os; }
template <typename T> ostream &operator<<(ostream &os, deque<T> q) { while (q.size()) { os << q.front(); q.pop_front(); if (q.size()) os << " "; } return os; }
template <class T, class Container, class Compare> ostream &operator<<(ostream &os, priority_queue<T, Container, Compare> pq) { while (pq.size()) { os << pq.top() << " "; pq.pop(); } return os; }
#define out(x) cout << x << endl
#define dout(x) cout << fixed << setprecision(10) << x << endl
int main(){
ll N;
cin >> N;
vl C(1<<(N+1));
rep(i,1,1<<(N+1)) cin >> C[i];
vl seg(1<<(N+1));
seg = C;
rep(i,1<<N,0,-1){
chmin(seg[i],seg[i*2] + seg[i*2+1]);
}
ll Q;
cin >> Q;
rep(Q){
ll t;
cin >> t;
if(t == 1){
// cout << "query1" << endl;
ll j,x;
cin >> j >> x;
C[j] = x;
seg[j] = x;
while(j != 0){
if(j*2 < 1<<(N+1)){
seg[j] = min(C[j],seg[j*2] + seg[j*2+1]);
}else{
seg[j] = C[j];
}
j /= 2;
}
}else{
//cout << "query2" << endl;
auto dfs1 = [&] (auto self, int l,int r,ll x,ll up,int upid) {
// 1つだけが含まれている区間についての探索
// 頂点lと頂点rについて、それぞれへの最短経路を求める
// 頂点の座標はx
// 上のアレの長さは、up
if ((r-l) == 2){
if(l == x){
return make_pair(0LL,up);
}else if(l == x-1){
return make_pair(min(up+C[(1<<N) + x],C[(1<<N) + x - 1]),min(up+C[(1<<N) + x - 1],C[(1<<N) + x]));
}else{
return make_pair(up,0LL);
}
}else{
if(x <= (l+r)/2){
auto [a,b] = self(self,l,(l+r)/2,x,min(seg[upid*2],seg[upid*2+1]+up),upid*2);
return make_pair(a,min(a+up,b+seg[upid*2+1]));
}else{
auto [a,b] = self(self,(l+r)/2,r,x,min(seg[upid*2+1],seg[upid*2]+up),upid*2+1);
return make_pair(min(b+up,a+seg[upid*2]),b);
}
}
};
auto dfs2 = [&](auto self, int l,int r,ll x,ll y,ll up,int upid) -> ll{
//cout << l << " " << r << endl;
if (r-l == 2){
if (l == x){
if (l+1 == y){
return min(C[(1<<N) + x],up+C[(1<<N) + x+1]);
}else{
return up;
}
}else{
return min(C[(1<<N) + x],up+C[(1<<N) + x-1]);
}
}
// 2つ含まれている区間に対する探索
// 一つはx,一つはy
// x < yを保証
if ((x <= (l+r)/2) && (y <= (l+r)/2)){
return self(self,l,(l+r)/2,x,y,min(seg[upid*2],seg[upid*2+1]+up),upid*2);
}else if ((x > (l+r)/2) && (y > (l+r)/2)){
return self(self,(l+r)/2,r,x,y,min(seg[upid*2+1],seg[upid*2]+up),upid*2+1);
}else{
// ここが一番難しい
// 二つに分割する
auto [a,b] = dfs1(dfs1,l,(l+r)/2,x,min(seg[upid*2],seg[upid*2+1]+up),upid*2);
auto [c,d] = dfs1(dfs1,(l+r)/2,r,y,min(seg[upid*2+1],seg[upid*2]+up),upid*2+1);
// cout << x << " " << y << endl;
// cout << a << " " << b << " " << c << " " << d << " " << up << endl;
// cout << seg[upid*2] << " " << seg[upid*2+1] << endl;
return min(b+c,a+d+up);
}
};
ll s,t;
cin >> s >> t;
cout << dfs2(dfs2,0,1<<N,s,t,seg[1],1) << endl;
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3756kb
input:
3 7 1 14 3 9 4 8 2 6 5 5 13 8 2 3 10 2 0 1 2 0 4 2 4 6 2 4 8 2 3 5 1 6 30 2 3 5 2 4 6 1 1 10000000 2 0 8
output:
2 1 4 8 17 18 13 15
result:
ok 8 tokens
Test #2:
score: 0
Accepted
time: 24ms
memory: 3608kb
input:
1 7914575 2436426 4979445 199989 1 1 6190629 1 1 1407775 1 1 2804784 1 2 2631932 1 1 3078537 1 3 286918 1 2 3238506 1 3 3361868 1 2 9296263 1 3 4836991 1 3 2177068 1 3 4291757 1 1 594328 1 2 8996221 1 1 5531545 1 3 3575467 1 3 3206504 1 1 8344965 1 3 6045895 2 0 2 1 2 6248153 1 1 5797489 1 1 9766466...
output:
8344965 5684734 2756417 2512448 130126 7091295 7834895 6363152 6668726 4380822 8809904 4042733 8566868 8653391 3654574 7617913 8583126 4470761 4099069 2539201 7188565 8465921 4517278 1913351 7400947 5104744 1759308 6081288 3559555 3409112 3714298 8937580 4704960 5280672 9424416 1622556 2599805 18330...
result:
ok 1899 tokens
Test #3:
score: 0
Accepted
time: 28ms
memory: 3620kb
input:
1 3080713 6130142 8931932 199954 1 3 3859793 1 2 8302798 1 1 1363993 1 2 2817427 1 1 6031503 1 1 4197608 1 1 3453017 1 3 3258277 1 2 1243375 1 3 7997018 1 1 8659259 1 1 545422 1 1 1213295 1 2 9318329 1 2 1165990 1 1 3910911 1 2 9639614 1 2 3166127 1 1 2556789 1 1 2505213 2 1 2 1 1 8837030 1 1 996138...
output:
5671340 4103158 2278869 1251419 702774 1634200 9066441 3444042 4761391 1317349 996556 3444042 996556 996556 4884903 6746567 6746567 1389661 4920459 230651 935263 2028823 680623 1093324 1093324 680623 680623 369391 6136723 5192803 5192803 6136723 4301516 4578392 3566336 3566336 7599310 4756965 378391...
result:
ok 29717 tokens
Test #4:
score: 0
Accepted
time: 51ms
memory: 3616kb
input:
1 6313638 363583 8248153 199989 2 1 2 1 1 155990 1 2 4430056 2 0 2 2 1 2 1 1 6771887 1 1 9001299 2 0 1 1 3 2051074 2 1 2 2 0 1 1 1 3829876 2 0 1 1 3 8940076 2 1 2 2 0 1 2 0 2 2 0 2 1 1 2321211 1 2 8057327 2 0 2 1 1 553338 1 2 7877801 2 0 2 1 2 2505976 1 3 1153207 2 0 2 1 2 4561192 1 2 4540078 1 1 90...
output:
6677221 155990 4586046 4430056 2051074 4430056 4430056 8259932 4430056 3829876 3829876 2321211 553338 553338 5693285 4540078 4547501 5088001 1153207 3934794 1153207 3934794 3934794 3934794 7085662 3658305 3147631 3658305 6805936 3147631 3147631 853551 2267606 3727767 3727767 2645926 3727767 2645926 ...
result:
ok 100061 tokens
Test #5:
score: 0
Accepted
time: 21ms
memory: 3516kb
input:
2 4716625 8732769 4896438 9294402 7273885 4137152 2249944 199996 1 1 5186587 1 4 7722585 1 5 3539426 1 5 1298070 1 6 8806800 1 1 4206062 1 6 6971489 1 5 8825000 1 5 3448517 1 6 9944200 1 1 3672387 1 2 1617483 1 5 8197902 1 6 4298339 1 5 6260453 1 2 3666548 1 3 9334704 1 3 5244559 1 3 2160729 1 6 944...
output:
5334226 9572097 4807948 733673 8100027 6139742 6091424 5926345 8623714 12325259 6201853 1162428 2792985 6816822 9147939 8703527 5455802 2767961 4607887 7567091 1326121 3115123 3452276 7483661 3901199 2876292 3890889 78252 9798360 2638886 8164525 6562024 7215100 4673524 5294603 9171516 5178543 904555...
result:
ok 2118 tokens
Test #6:
score: 0
Accepted
time: 39ms
memory: 3572kb
input:
2 1364796 5777257 6371509 2448237 9098057 7484260 6546327 199987 1 3 5999195 2 3 4 1 3 8887115 1 1 2734385 1 7 4638308 1 3 6026141 1 6 4213294 1 6 5557847 1 3 2560361 1 5 3524344 1 6 2074700 1 6 2999265 1 2 1130752 1 7 3252447 2 2 3 2 1 4 1 4 1415121 1 2 9989166 1 4 3857618 1 7 1787670 2 0 1 1 1 784...
output:
6546327 2999265 5182622 3857618 3857618 2560361 3687472 3687472 2623407 7097702 10955320 3857618 2419123 7980269 15666313 9307178 11416196 5371134 6559731 3730152 5371134 6877903 4359151 3280494 3826548 3826548 546054 2901939 6122499 1164580 4886291 2231873 4929939 10014378 1431973 5738696 3914548 1...
result:
ok 30271 tokens
Test #7:
score: -100
Wrong Answer
time: 65ms
memory: 3752kb
input:
2 8987238 2085975 9756733 3937228 1094674 2515166 9606967 199961 2 0 1 1 4 3666395 1 3 6910698 2 0 2 1 7 8573254 2 0 2 2 1 4 1 5 3266966 2 2 3 1 1 2915552 1 1 4329051 2 0 3 1 5 4369037 1 2 6363300 2 2 3 2 1 3 2 0 2 1 1 4914198 1 3 1997323 2 0 2 2 0 4 1 4 1415720 1 4 1289499 1 2 750052 2 0 2 2 2 4 2 ...
output:
2290821 2085975 2085975 8005372 2515166 4601141 2515166 6884203 6363300 6363300 4914198 750052 1997323 3265218 4512489 4036874 4512489 4681644 4914198 3674754 1990038 5949064 5949064 1997323 5949064 2927673 4924996 3240280 1997323 2927673 5949064 1997323 8732393 3472087 2997143 5118510 6305731 19973...
result:
wrong answer 1st words differ - expected: '3180649', found: '2290821'