QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#88337 | #1895. Moving Cells | Zuqa | WA | 2ms | 3464kb | C++20 | 3.0kb | 2023-03-16 00:30:01 | 2023-03-16 00:30:03 |
Judging History
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'