QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#676432#6104. Building Bombingnathan4690WA 1ms7592kbC++174.1kb2024-10-25 21:31:142024-10-25 21:31:15

Judging History

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

  • [2024-10-25 21:31:15]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:7592kb
  • [2024-10-25 21:31:14]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define el cout << '\n'
#define f1(i,n) for(int i=1;i<=n;i++)
#define __file_name ""
using namespace std;
const ll maxn = 1e5+5, inf=1e18;

struct Lazy{
    long long data = 0;
    Lazy(){};
    Lazy(long long data): data(data){};
    Lazy operator+(const Lazy &rhs) const{
        // Push a lazy down
        return Lazy(data + rhs.data);
    }
};

struct Value{
    long long data = 1e18;
    Value(){};
    Value(long long data): data(data){};
    Value operator+(const Value &rhs) const{
        // Merge two nodes
        return Value(min(data, rhs.data));
    }
    Value operator+(const Lazy &rhs) const{
        // Apply lazy to node
        return Value(data + rhs.data);
    }
    friend ostream& operator<<(ostream& ouf, const Value &rhs){
        return ouf << rhs.data;
    }
};

template<class T, class U>
struct SegmentTree{
    int n;
    vector<T> st;
    vector<U> lazy;
    SegmentTree(){};
    SegmentTree(int n): n(n), st(4*n+1), lazy(4*n+1){};
    inline void down(int idx){
        st[idx*2] = st[idx*2] + lazy[idx];
        lazy[idx*2] = lazy[idx*2] + lazy[idx];
        st[idx*2+1] = st[idx*2+1] + lazy[idx];
        lazy[idx*2+1] = lazy[idx*2+1] + lazy[idx];
        lazy[idx] = U();
    }
    void _upd1(int idx, int l, int r, int i, const T &v){
        if(i < l || r < i) return;
        if(l == r){
            st[idx] = v;
            return;
        }
        down(idx);
        int mid = (l + r) / 2;
        _upd1(idx*2, l, mid, i, v);
        _upd1(idx*2+1, mid+1, r, i, v);
        st[idx] = st[idx*2] + st[idx*2+1];
    }
    inline void updatePoint(int position, const T &value){
        _upd1(1,1,n,position,value);
    }
    void _upd2(int idx, int l, int r, int u, int v, const U &w){
        if(v < l || r < u) return;
        if(u <= l && r <= v){
            st[idx] = st[idx] + w;
            lazy[idx] = lazy[idx] + w;
            return;
        }
        down(idx);
        int mid = (l + r) / 2;
        _upd2(idx*2, l, mid, u, v, w);
        _upd2(idx*2+1, mid+1, r, u, v, w);
        st[idx] = st[idx*2] + st[idx*2+1];
    }
    inline void updateRange(int left_, int right_, const U &value){
        if(left > right) return;
        _upd2(1,1,n,left_, right_, value);
    }
    T _get(int idx, int l, int r, int u, int v){
        if(v < l || r < u) return T();
        if(u <= l && r <= v) return st[idx];
        down(idx);
        int mid = (l + r) / 2;
        return _get(idx*2, l, mid, u, v) + _get(idx*2+1, mid+1, r, u, v);
    }
    inline T getRange(int left_, int right_){
        return _get(1,1,n,left_, right_);
    }
};

#define SegTree SegmentTree<Value, Lazy>

ll n,l,k,a[maxn],dp[maxn][12];
pair<ll,ll> all[maxn];
SegTree st;

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    if(fopen(__file_name ".inp", "r")){
        freopen(__file_name ".inp","r",stdin);
        freopen(__file_name ".out","w",stdout);
    }
    // code here
    cin >> n >> l >> k;
    st = SegTree(n+1);
    f1(i,n) {
        cin >> a[i];
        all[i] = {a[i], -i};
    }
    all[n+1] = {inf, -n-1};
    sort(all+1,all+n+2,greater<pair<ll,ll>>());
    f1(i,n) dp[i][0] = inf;
    // f1(i,k) dp[n+1][i] = inf;
//    f1(i,n+1) st.updatePoint(i, Value(0));
//    st.updateRange(n-1, n+1, Lazy(1));

    f1(j,k){
        f1(i,n+1) {
            dp[i][j] = inf;
            st.updatePoint(i, Value(1e9));
        }
        f1(i,n+1){
            ll idx = -all[i].second;
            // cout << idx << ' ' << st.getRange(idx, idx).data;el;
            dp[idx][j] = st.getRange(idx, n+1).data - st.getRange(idx, idx).data + (int)(1e9);
            st.updateRange(idx, idx, Lazy(-(int)(1e9) + dp[idx][j-1]));
            // cout << "! " << idx+1 << ' ' << n+1;el;
            st.updateRange(idx+1, n+1, Lazy(1));
            // cout << "?? "; f1(w,n+1) cout << st.getRange(w,w) << ' ';el;
        }
        // f1(i,n) cout << dp[i][j] << ' ';el;
    }
    if(dp[l][k] > n) cout << -1;
    else cout << dp[l][k];
    el;
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 5592kb

input:

7 2 3
10 30 90 40 60 60 80

output:

2

result:

ok 1 number(s): "2"

Test #2:

score: 0
Accepted
time: 0ms
memory: 7592kb

input:

3 2 2
30 20 10

output:

-1

result:

ok 1 number(s): "-1"

Test #3:

score: 0
Accepted
time: 1ms
memory: 5624kb

input:

1 1 1
608954134

output:

0

result:

ok 1 number(s): "0"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3836kb

input:

10 5 3
872218248 517822599 163987167 517822599 458534407 142556631 142556631 458534407 458534407 872218248

output:

-1

result:

ok 1 number(s): "-1"

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 3508kb

input:

10 4 2
31201623 546478688 709777934 672927273 672927273 709777934 801718395 672927273 926114576 38983342

output:

2

result:

wrong answer 1st numbers differ - expected: '3', found: '2'