QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#745503 | #9738. Make It Divisible | kuguadawang | WA | 2ms | 11740kb | C++20 | 3.9kb | 2024-11-14 10:23:23 | 2024-11-14 10:23:25 |
Judging History
answer
#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define int long long
#define llu unsigned long long
#define endl "\n"
#define inf 0x3f3f3f3f
#define debug cout << "****************" << endl
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6 + 7;
using i64 = long long;
const int SIZE = 500010;
struct SegmentTree {
int l, r;
long long dat;
} t[SIZE * 4];
long long a[SIZE], b[SIZE], c[SIZE];
int n;
long long gcd(long long a, long long b)
{
return b ? gcd(b, a % b) : a;
}
// 维护区间gcd的线段树
void build(int p, int l, int r)
{
t[p].l = l, t[p].r = r;
if (l == r) {
t[p].dat = b[l];
return;
}
int mid = (l + r) / 2;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
t[p].dat = gcd(t[p * 2].dat, t[p * 2 + 1].dat);
}
void change(int p, int x, long long v)
{
if (t[p].l == t[p].r) {
t[p].dat += v;
return;
}
int mid = (t[p].l + t[p].r) / 2;
if (x <= mid)
change(p * 2, x, v);
else
change(p * 2 + 1, x, v);
t[p].dat = gcd(t[p * 2].dat, t[p * 2 + 1].dat);
}
long long ask(int p, int l, int r)
{
if (l <= t[p].l && r >= t[p].r)
return abs(t[p].dat);
int mid = (t[p].l + t[p].r) / 2;
long long val = 0;
if (l <= mid)
val = gcd(val, ask(p * 2, l, r));
if (r > mid)
val = gcd(val, ask(p * 2 + 1, l, r));
return abs(val);
}
long long sum(int x)
{
long long y = 0;
for (; x; x -= x & -x)
y += c[x];
return y;
}
void add(int x, long long y)
{
for (; x <= n; x += x & -x)
c[x] += y;
}
void solve()
{
int k;
cin >> n >> k;
vector<int> l(n + 7);
vector<int> r(n + 7);
stack<int> stk;
int pd = 0;
int ans1 = 0, ans2 = 0;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
b[i] = a[i] - a[i - 1];
if (n == 1) {
cout << k << ' ' << k * (k + 1) / 2 << endl;
return;
}
build(1, 1, n);
for (int i = 1; i <= n; i++) {
while (!stk.empty() && a[stk.top()] > a[i])
r[stk.top()] = i - 1, stk.pop();
stk.push(i);
}
while (!stk.empty()) {
r[stk.top()] = n;
stk.pop();
}
for (int i = n; i >= 1; i--) {
while (!stk.empty() && a[stk.top()] > a[i])
l[stk.top()] = i + 1, stk.pop();
stk.push(i);
}
while (!stk.empty()) {
l[stk.top()] = 1;
stk.pop();
}
for (int i = 1; i <= n; i++)
if (l[i] != r[i])
pd++;
map<int, int> cnt;
build(1, 1, n);
auto modify = [&](int l, int r, int x) {
change(1, l, x);
if (r < n)
change(1, r + 1, -x);
add(l, x);
add(r + 1, -x);
};
auto query = [&](int l, int r) {
long long al = a[l] + sum(l);
long long val = l < r ? ask(1, l + 1, r) : 0;
return (int)gcd(al, val);
};
for (int i = 1; i <= n; i++) {
modify(l[i], r[i], -a[i]);
int gc = query(l[i], r[i]);
for (int j = 1; j * j <= gc; j++) {
if (gc % j == 0) {
if (j - a[i] >= 1 && j - a[i] <= k) {
if (++cnt[j - a[i]] == pd)
ans1++, ans2 += j - a[i];
}
if (gc / j != j) {
if ((gc / j) - a[i] >= 1 && (gc / j) - a[i] <= k) {
if (++cnt[(gc / j) - a[i]] == pd)
ans1++, ans2 += (gc / j) - a[i];
}
}
}
}
modify(l[i], r[i], a[i]);
}
cout << ans1 << " " << ans2 << endl;
}
// 1 2 3 4 5 6 7 8 9
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T = 1;
cin >> T;
while (T--)
solve();
return 0;
}
// 8 80 2 8 2
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 9716kb
input:
3 5 10 7 79 1 7 1 2 1000000000 1 2 1 100 1000000000
output:
3 8 0 0 100 5050
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 2ms
memory: 11740kb
input:
4 201 1000000000 1 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5...
output:
0 0 0 0 0 0 0 0
result:
ok 4 lines
Test #3:
score: -100
Wrong Answer
time: 2ms
memory: 9660kb
input:
500 4 1000000000 8 14 24 18 4 1000000000 17 10 18 14 4 1000000000 6 17 19 19 4 1000000000 15 14 15 25 4 1000000000 16 16 5 25 4 1000000000 4 30 20 5 4 1000000000 11 4 23 9 4 1000000000 14 25 13 2 4 1000000000 18 18 1 15 4 1000000000 22 22 22 28 4 1000000000 15 17 17 10 4 1000000000 22 14 13 25 4 100...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
wrong answer 78th lines differ - expected: '2 4', found: '0 0'