QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#815573#9877. Segment Treeucup-team5243#WA 59ms3840kbC++2312.2kb2024-12-15 15:42:242024-12-15 15:42:39

Judging History

你现在查看的是最新测评结果

  • [2024-12-15 15:42:39]
  • 评测
  • 测评结果:WA
  • 用时:59ms
  • 内存:3840kb
  • [2024-12-15 15:42:24]
  • 提交

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;
        }
    }

}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3840kb

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: 25ms
memory: 3540kb

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: 36ms
memory: 3652kb

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: 47ms
memory: 3564kb

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: 18ms
memory: 3640kb

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: 29ms
memory: 3640kb

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: 59ms
memory: 3560kb

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'