답안 #827993

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
827993 2023-08-17T00:57:16 Z physics07 송신탑 (IOI22_towers) C++17
31 / 100
960 ms 30764 KB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int inf=1e9+7;
int n, lt[100001], rt[100001], cut[100001], root[100001];
stack<int> stk;
vector<pair<int, int>> v;
vector<int> del, a;
struct seg {
    int tree[100001*2], sz;
    void init(int n) {sz=n;}
    void update(int idx, int v) {
        for(tree[idx+=sz]+=v; idx>1; idx>>=1) tree[idx>>1]=max(tree[idx], tree[idx^1]);
    }
    int query(int l, int r) {
        int res=0;
        for(l+=sz, r+=sz; l<=r; l>>=1, r>>=1) {
            if(l&1) res=max(res, tree[l++]);
            if(~r&1) res=max(res, tree[r--]);
        }
        return res;
    }
} tree;
struct PST {
    struct Node {
        int v, l, r;
    };
    vector<Node> tree;
    void mak() {tree.push_back({0, -1, -1});}
    void init(int node, int s, int e) {
        if(s==e) return;
        tree[node].l=(int)tree.size();
        mak();
        tree[node].r=(int)tree.size();
        mak();
        int m=s+e>>1;
        init(tree[node].l, s, m);
        init(tree[node].r, m+1, e);
    }
    void update(int node, int s, int e, int idx, int v, int prv) {
        if(s>idx || e<idx) return;
        tree[node]=tree[prv];
        tree[node].v+=v;
        if(s==e) return;
        int m=s+e>>1;
        if(idx<=m) {
            tree[node].l=(int)tree.size();
            mak();
            update(tree[node].l, s, m, idx, v, tree[prv].l);
        }
        else {
            tree[node].r=(int)tree.size();
            mak();
            update(tree[node].r, m+1, e, idx, v, tree[prv].r);
        }
    }
    int query(int node, int s, int e, int l, int r) {
        if(s>r || e<l) return 0;
        if(s>=l && e<=r) return tree[node].v;
        int m=s+e>>1;
        return query(tree[node].l, s, m, l, r)+query(tree[node].r, m+1, e, l, r);
    }
} pst;
void init(int N, vector<int> A) {
    n=N;
    for(auto i: A) a.push_back(i);
    tree.init(n);
    for(int i=0; i<n; i++) tree.update(i, a[i]);
    for(int i=0; i<n; i++) {
        while(!stk.empty() && a[stk.top()]>a[i]) stk.pop();
        lt[i]=(stk.empty() ? -1 : stk.top());
        stk.push(i);
    }
    while(!stk.empty()) stk.pop();
    for(int i=n-1; i>=0; i--) {
        while(!stk.empty() && a[stk.top()]>a[i]) stk.pop();
        rt[i]=(stk.empty() ? n : stk.top());
        stk.push(i);
    }
    for(int i=0; i<n; i++) {
        int curr=inf;
        if(lt[i]>=0) curr=min(curr, tree.query(lt[i]+1, i));
        if(rt[i]<n) curr=min(curr, tree.query(i, rt[i]-1));
        if(curr==inf) cut[i]=inf;
        else if(curr>a[i]) cut[i]=curr-a[i];
        else cut[i]=0;
        v.push_back({cut[i], i});
        del.push_back(cut[i]);
    }
    del.push_back(inf);
    sort(del.begin(), del.end());
    sort(v.begin(), v.end());
    root[n]=0;
    pst.mak();
    pst.init(0, 0, n-1);
    for(int i=n-1; i>=0; i--) {
        root[i]=(int)pst.tree.size();
        pst.mak();
        pst.update(root[i], 0, n-1, v[i].second, 1, root[i+1]);
    }
}

int max_towers(int l, int r, int d) {
    if(l==r || r==l+1) return 1;
    int cnt=0;
    if(rt[l]==n || tree.query(l, rt[l]-1)>=d+a[l]) cnt++;
    if(lt[r]==-1 || tree.query(lt[r]+1, r)>=d+a[r]) cnt++;
    int idx=lower_bound(del.begin(), del.end(), d)-del.begin();
    return cnt+pst.query(root[idx], 0, n-1, l+1, r-1);
}

Compilation message

towers.cpp: In member function 'void PST::init(int, int, int)':
towers.cpp:37:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |         int m=s+e>>1;
      |               ~^~
towers.cpp: In member function 'void PST::update(int, int, int, int, int, int)':
towers.cpp:46:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |         int m=s+e>>1;
      |               ~^~
towers.cpp: In member function 'int PST::query(int, int, int, int, int)':
towers.cpp:61:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   61 |         int m=s+e>>1;
      |               ~^~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 411 ms 28176 KB 11th lines differ - on the 1st token, expected: '1', found: '0'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 1 ms 916 KB Output is correct
3 Correct 1 ms 916 KB Output is correct
4 Correct 1 ms 916 KB Output is correct
5 Correct 2 ms 916 KB Output is correct
6 Correct 1 ms 916 KB Output is correct
7 Incorrect 1 ms 916 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 1 ms 916 KB Output is correct
3 Correct 1 ms 916 KB Output is correct
4 Correct 1 ms 916 KB Output is correct
5 Correct 2 ms 916 KB Output is correct
6 Correct 1 ms 916 KB Output is correct
7 Incorrect 1 ms 916 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 607 ms 30304 KB Output is correct
2 Correct 779 ms 30252 KB Output is correct
3 Correct 960 ms 30328 KB Output is correct
4 Correct 814 ms 30240 KB Output is correct
5 Correct 849 ms 30340 KB Output is correct
6 Correct 817 ms 30244 KB Output is correct
7 Correct 668 ms 30236 KB Output is correct
8 Correct 661 ms 30500 KB Output is correct
9 Correct 885 ms 30756 KB Output is correct
10 Correct 794 ms 30492 KB Output is correct
11 Correct 928 ms 30508 KB Output is correct
12 Correct 822 ms 30508 KB Output is correct
13 Correct 880 ms 30732 KB Output is correct
14 Correct 1 ms 208 KB Output is correct
15 Correct 1 ms 920 KB Output is correct
16 Correct 1 ms 860 KB Output is correct
17 Correct 57 ms 30304 KB Output is correct
18 Correct 59 ms 30256 KB Output is correct
19 Correct 58 ms 30300 KB Output is correct
20 Correct 53 ms 30760 KB Output is correct
21 Correct 50 ms 30444 KB Output is correct
22 Correct 70 ms 30344 KB Output is correct
23 Correct 58 ms 30328 KB Output is correct
24 Correct 59 ms 30252 KB Output is correct
25 Correct 45 ms 30692 KB Output is correct
26 Correct 53 ms 30360 KB Output is correct
27 Correct 1 ms 916 KB Output is correct
28 Correct 1 ms 916 KB Output is correct
29 Correct 1 ms 916 KB Output is correct
30 Correct 1 ms 916 KB Output is correct
31 Correct 1 ms 916 KB Output is correct
32 Correct 1 ms 916 KB Output is correct
33 Correct 1 ms 916 KB Output is correct
34 Correct 1 ms 916 KB Output is correct
35 Correct 1 ms 916 KB Output is correct
36 Correct 1 ms 920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 227 ms 7804 KB Output is correct
2 Correct 919 ms 30252 KB Output is correct
3 Correct 766 ms 30340 KB Output is correct
4 Correct 887 ms 30476 KB Output is correct
5 Correct 799 ms 30380 KB Output is correct
6 Correct 865 ms 30236 KB Output is correct
7 Correct 665 ms 30332 KB Output is correct
8 Correct 753 ms 30480 KB Output is correct
9 Correct 747 ms 30764 KB Output is correct
10 Correct 716 ms 30380 KB Output is correct
11 Correct 576 ms 30376 KB Output is correct
12 Correct 65 ms 30348 KB Output is correct
13 Correct 63 ms 30248 KB Output is correct
14 Correct 59 ms 30320 KB Output is correct
15 Correct 50 ms 30736 KB Output is correct
16 Correct 53 ms 30376 KB Output is correct
17 Correct 59 ms 30252 KB Output is correct
18 Correct 58 ms 30336 KB Output is correct
19 Correct 73 ms 30348 KB Output is correct
20 Correct 63 ms 30276 KB Output is correct
21 Correct 60 ms 30348 KB Output is correct
22 Correct 62 ms 30296 KB Output is correct
23 Correct 60 ms 30352 KB Output is correct
24 Correct 43 ms 30480 KB Output is correct
25 Correct 45 ms 30652 KB Output is correct
26 Correct 53 ms 30448 KB Output is correct
27 Correct 49 ms 30732 KB Output is correct
28 Correct 2 ms 916 KB Output is correct
29 Correct 1 ms 916 KB Output is correct
30 Correct 1 ms 916 KB Output is correct
31 Correct 1 ms 872 KB Output is correct
32 Correct 1 ms 920 KB Output is correct
33 Correct 1 ms 592 KB Output is correct
34 Correct 1 ms 916 KB Output is correct
35 Correct 1 ms 916 KB Output is correct
36 Correct 1 ms 916 KB Output is correct
37 Correct 1 ms 916 KB Output is correct
38 Correct 1 ms 916 KB Output is correct
39 Correct 1 ms 916 KB Output is correct
40 Correct 1 ms 920 KB Output is correct
41 Correct 1 ms 916 KB Output is correct
42 Correct 1 ms 920 KB Output is correct
43 Correct 1 ms 916 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 464 KB Output is correct
2 Correct 1 ms 916 KB Output is correct
3 Correct 1 ms 916 KB Output is correct
4 Correct 1 ms 916 KB Output is correct
5 Correct 2 ms 916 KB Output is correct
6 Correct 1 ms 916 KB Output is correct
7 Incorrect 1 ms 916 KB 1st lines differ - on the 1st token, expected: '34', found: '33'
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 411 ms 28176 KB 11th lines differ - on the 1st token, expected: '1', found: '0'
2 Halted 0 ms 0 KB -