結果

問題 No.738 平らな農地
ユーザー たこしたこし
提出日時 2018-09-28 23:51:44
言語 C++17
(gcc 12.2.0 + boost 1.81.0)
結果
WA  
実行時間 -
コード長 4,996 bytes
コンパイル時間 4,040 ms
コンパイル使用メモリ 224,752 KB
実行使用メモリ 255,084 KB
最終ジャッジ日時 2023-08-02 12:16:00
合計ジャッジ時間 68,931 ms
ジャッジサーバーID
(参考情報)
judge15 / judge14
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 2 ms
4,380 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 2 ms
4,380 KB
testcase_04 AC 2 ms
4,380 KB
testcase_05 AC 31 ms
7,668 KB
testcase_06 AC 36 ms
8,408 KB
testcase_07 AC 29 ms
8,696 KB
testcase_08 AC 14 ms
5,740 KB
testcase_09 AC 8 ms
4,644 KB
testcase_10 AC 4 ms
4,376 KB
testcase_11 AC 14 ms
5,856 KB
testcase_12 AC 8 ms
4,804 KB
testcase_13 AC 27 ms
7,376 KB
testcase_14 AC 10 ms
5,040 KB
testcase_15 AC 1,020 ms
100,352 KB
testcase_16 AC 1,024 ms
102,184 KB
testcase_17 AC 1,226 ms
101,120 KB
testcase_18 AC 1,191 ms
99,608 KB
testcase_19 AC 1,416 ms
106,548 KB
testcase_20 AC 1,041 ms
102,484 KB
testcase_21 AC 1,325 ms
107,236 KB
testcase_22 AC 1,069 ms
102,732 KB
testcase_23 AC 1,308 ms
104,080 KB
testcase_24 AC 1,354 ms
102,580 KB
testcase_25 AC 10 ms
5,420 KB
testcase_26 AC 10 ms
5,476 KB
testcase_27 AC 11 ms
5,516 KB
testcase_28 AC 10 ms
5,432 KB
testcase_29 AC 10 ms
5,480 KB
testcase_30 AC 10 ms
5,680 KB
testcase_31 AC 10 ms
5,420 KB
testcase_32 AC 10 ms
5,368 KB
testcase_33 AC 10 ms
5,492 KB
testcase_34 AC 10 ms
5,564 KB
testcase_35 AC 9 ms
5,344 KB
testcase_36 AC 9 ms
5,372 KB
testcase_37 AC 10 ms
5,364 KB
testcase_38 AC 10 ms
5,312 KB
testcase_39 AC 11 ms
5,508 KB
testcase_40 AC 10 ms
5,564 KB
testcase_41 AC 10 ms
5,664 KB
testcase_42 AC 9 ms
5,420 KB
testcase_43 AC 9 ms
5,504 KB
testcase_44 AC 10 ms
5,500 KB
testcase_45 AC 1,006 ms
118,540 KB
testcase_46 AC 998 ms
110,320 KB
testcase_47 AC 997 ms
115,704 KB
testcase_48 AC 882 ms
112,276 KB
testcase_49 AC 865 ms
111,676 KB
testcase_50 AC 907 ms
115,504 KB
testcase_51 AC 1,150 ms
116,444 KB
testcase_52 AC 955 ms
111,736 KB
testcase_53 AC 975 ms
114,016 KB
testcase_54 AC 1,091 ms
116,968 KB
testcase_55 AC 1,079 ms
117,092 KB
testcase_56 AC 1,033 ms
115,260 KB
testcase_57 AC 950 ms
109,304 KB
testcase_58 AC 1,023 ms
114,640 KB
testcase_59 AC 974 ms
119,396 KB
testcase_60 AC 954 ms
118,592 KB
testcase_61 AC 952 ms
117,560 KB
testcase_62 AC 937 ms
109,976 KB
testcase_63 AC 1,108 ms
119,344 KB
testcase_64 AC 1,029 ms
117,368 KB
testcase_65 AC 1,608 ms
102,204 KB
testcase_66 AC 1,542 ms
105,372 KB
testcase_67 AC 1,128 ms
233,192 KB
testcase_68 AC 1,104 ms
239,868 KB
testcase_69 AC 1,468 ms
243,556 KB
testcase_70 AC 1,278 ms
251,344 KB
testcase_71 AC 803 ms
4,588 KB
testcase_72 AC 687 ms
4,728 KB
testcase_73 AC 578 ms
4,516 KB
testcase_74 AC 841 ms
4,660 KB
testcase_75 AC 1,397 ms
234,440 KB
testcase_76 AC 1,222 ms
242,916 KB
testcase_77 AC 1,477 ms
234,660 KB
testcase_78 AC 1,628 ms
252,940 KB
testcase_79 AC 1,404 ms
255,084 KB
testcase_80 AC 1,167 ms
245,136 KB
testcase_81 AC 1,439 ms
237,492 KB
testcase_82 AC 1,562 ms
246,852 KB
testcase_83 AC 768 ms
4,892 KB
testcase_84 AC 732 ms
4,564 KB
testcase_85 AC 1,944 ms
171,680 KB
testcase_86 AC 1,699 ms
159,248 KB
testcase_87 AC 680 ms
165,848 KB
testcase_88 AC 667 ms
159,812 KB
testcase_89 WA -
testcase_90 AC 2 ms
4,380 KB
testcase_91 AC 2 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#include <cstdio>
#include <string>

using namespace std;

#define INF 100000000
#define YJ 1145141919
#define INF_INT_MAX 2147483647
#define INF_LL_MAX 9223372036854775807
#define EPS 1e-10
#define MOD 1000000007
#define Pi acos(-1)
#define LL long long
#define ULL unsigned long long
#define LD long double

class Node {
public:
    Node(unsigned long long int lIndex = startLeftIndex, unsigned long long int rIndex = endRightIndex, LL v = unitValue) : leftIndex(lIndex), rightIndex(rIndex), value(v) {

    }

    Node operator + (const Node& monoid) const {
        return Node(startLeftIndex, endRightIndex, this->getValue() + monoid.getValue());
    }

    static Node unit() {
        return Node(unitValue);
    }

    void setValue(LL l) {
        this->value = l;
    }

    LL getValue() const {
        return this->value;
    }

    
    
    
    

    pair<LL, LL> getIndexRange() {
        return make_pair(leftIndex, rightIndex);
    }

    bool isLeafNode() {
        auto it = getIndexRange();
        return it.second - it.first <= 1;
    }

    //値の設定
    void setValue(unsigned long long int index, LL value) {
        auto indexRange = getIndexRange();
        unsigned long long int leftIndex = indexRange.first, midIndex = (indexRange.first + indexRange.second)/2, rightIndex = indexRange.second;
        if(isLeafNode()) {
            if(leftIndex <= index && index < rightIndex) {
                setValue(value);
            } 
            return;
        }

        if(!left_child) {
            left_child = unique_ptr<Node>(new Node(leftIndex, midIndex));
        }
        if(!right_child) {
            right_child = unique_ptr<Node>(new Node(midIndex, rightIndex));
        }

        if(leftIndex <= index && index < midIndex) {
            left_child->setValue(index, value);
        } else {
            right_child->setValue(index, value);
        }

        //戻るときに値を更新していく
        Node lNode, rNode; lNode.setValue(left_child->getValue()); rNode.setValue(right_child->getValue());
        setValue((lNode + rNode).getValue());
    }

    LL query(unsigned long long int l, unsigned long long int r) {
        auto indexRange = getIndexRange();
        if(l <= indexRange.first && indexRange.second <= r) {
            return getValue();
        } else if(indexRange.second <= l || r <= indexRange.first) {
            return Node::unit().getValue();
        } else {
            LL ll = Node::unit().getValue(), rr = Node::unit().getValue();
            if(left_child) {
                ll = left_child->query(l, r);
            }
            if(right_child) {
                rr = right_child->query(l, r);
            }
            Node lNode, rNode;
            lNode.setValue(ll); rNode.setValue(rr);
            return (lNode + rNode).getValue();
        }
    }

private:
    LL value;
    static const LL unitValue = 0;
    static const LL startLeftIndex = 0, endRightIndex = 1145141919;

    unique_ptr<Node> left_child, right_child;
    unsigned long long int leftIndex, rightIndex;
};

template <class T>
class SegmentTree {
public:
    SegmentTree() {
        root = unique_ptr<Node>(new Node());
    }

    void setValue(unsigned long long int index, LL value) {
        root->setValue(index, value);
    }

    LL query(unsigned long long int l, unsigned long long int r) {
        return root->query(l, r);
    }
private:
    unique_ptr<T> root;
};

#define int long long

SegmentTree<Node> segmentTree;
SegmentTree<Node> segmentTreeCount;

const int MAX_N = 100005;
int N, K;
int A[MAX_N];

signed main()
{
    cin >> N >> K;
    vector<int> avec;
    for(int i = 0; i < N; i++) {
        cin >> A[i];
        avec.push_back(A[i]);
    }

    sort(begin(avec), end(avec));

    int sum = 0;
    int ans = 1145141919810364;
    for(int i = 0; i < N; i++) {
        sum += A[i];
        segmentTree.setValue(A[i], segmentTree.query(A[i], A[i]+1) + A[i]);
        segmentTreeCount.setValue(A[i], segmentTreeCount.query(A[i], A[i]+1)+1);

        if(i >= K-1) {
            int midL = 0, midR = avec.size();
            while(midR-midL > 1) {
                int mid = (midR + midL)/2;
                if(segmentTreeCount.query(0, avec[mid]+1) <= (K-1)/2) {
                    midL = mid;
                } else {
                    midR = mid;
                }
            }
            int mid = avec[midR];

            int L = 0, R = 0;
            int lCount = segmentTreeCount.query(0, mid);
            int rCount = segmentTreeCount.query(mid+1, 1e9+7);
            L = mid*lCount - segmentTree.query(0, mid);
            R = segmentTree.query(mid+1, 1e9+7) - mid*rCount;

            ans = min(ans, L+R);

            sum -= A[i-K+1];

            int AA = A[i-K+1];
            segmentTree.setValue(AA, segmentTree.query(AA,AA+1) - AA);
            segmentTreeCount.setValue(AA, segmentTreeCount.query(AA, AA+1)-1);
        }
    }

    cout << ans << endl;

    return 0;
}
0