QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#88337#1895. Moving CellsZuqaWA 2ms3464kbC++203.0kb2023-03-16 00:30:012023-03-16 00:30:03

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-16 00:30:03]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 3464kb
  • [2023-03-16 00:30:01]
  • Submitted

answer

#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

#define el '\n'
#define FIO ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> pt;
typedef unsigned long long ull;

template<typename T, typename X>
using hashTable = gp_hash_table<T, X>;
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

// mt19937_64 for long long
mt19937 rng(std::chrono::system_clock::now().time_since_epoch().count());

struct Node
{
    int mn = 1e9 + 5;
};

struct segTree
{
    vector<Node> tree;
    Node neutral = Node();

    segTree(int n)
    {
        int sz = 1;
        while(sz < n)
            sz *= 2;
        tree = vector<Node>(2 * sz);
    }

    Node single(int idx, int val)
    {
        Node ret;
        ret.mn = val;
        return ret;
    }

    Node merge(Node a, Node b)
    {
        Node ret;
        ret.mn = min(a.mn, b.mn);
        return ret;
    }

    void build(int node, int s, int e, vector<int> &v)
    {
        if(s == e)
        {
            tree[node] = single(s, v[s]);
            return;
        }
        int mid = (s + e) >> 1;
        build(2 * node, s, mid, v);
        build(2 * node + 1, mid + 1, e, v);
        tree[node] = merge(tree[2 * node], tree[2 * node + 1]);
    }

    Node query(int node, int s, int e, int l, int r)
    {
        if(r < s || l > e)
            return neutral;

        if(s >= l && e <= r)
            return tree[node];

        int mid = (s + e) >> 1;
        Node left = query(2 * node, s, mid, l, r);
        Node right = query(2 * node + 1, mid + 1, e, l, r);
        return merge(left, right);
    }

};

void doWork()
{
    int n, m;
    cin >> n >> m;
    vector<int> len(m + 1);
    vector<pair<int, int>> v(m + 1);

    for(int i = 1; i <= m; i++)
        cin >> v[i].first >> v[i].second, len[i] = v[i].second - v[i].first;

    multiset<int> ms;
    for(int i = 0; i < n; i++)
        ms.insert(0);

    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 1e9 + 5));
    for(int i = 1; i <= m; i++)
    {
        int l = 1, r = 1, ll, rr;
        for(int j = 1; j + len[i] <= n; j++)
        {
            ll = max(1, j - len[i - 1]), rr = min(n, j + len[i]);

            while(r < rr)
                ms.insert(dp[i - 1][r++]);
            while(l < ll)
                ms.erase(ms.find(dp[i - 1][l++]));

            dp[i][j] = abs(v[i].first - j) + *ms.begin();
        }
        ms.clear();
    }
    cout << *min_element(dp[m].begin() + 1, dp[m].end());
}

signed main()
{
    FIO
    int T = 1;
//    cin >> T;
    for(int i = 1; i <= T; i++)
        doWork();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 3400kb

input:

9 3
1 2
4 5
7 9

output:

4

result:

ok 1 number(s): "4"

Test #2:

score: 0
Accepted
time: 2ms
memory: 3396kb

input:

1 5
1 1
1 1
1 1
1 1
1 1

output:

0

result:

ok 1 number(s): "0"

Test #3:

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

input:

9 1
5 7

output:

0

result:

ok 1 number(s): "0"

Test #4:

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

input:

10 5
1 1
4 4
4 4
5 5
3 3

output:

0

result:

wrong answer 1st numbers differ - expected: '5', found: '0'