QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#745517#9738. Make It DivisiblekuguadawangWA 2ms9944kbC++204.0kb2024-11-14 10:25:532024-11-14 10:26:00

Judging History

你现在查看的是最新测评结果

  • [2024-11-27 18:44:44]
  • hack成功,自动添加数据
  • (/hack/1263)
  • [2024-11-14 10:26:00]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:9944kb
  • [2024-11-14 10:25:53]
  • 提交

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;
    for (int i = 0; i <= n + 1; i++)
        c[i] = a[i] = b[i] = 0;
    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: 2ms
memory: 9736kb

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: 0ms
memory: 9944kb

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: 0ms
memory: 9720kb

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'