AC代码:https://www.luogu.com.cn/record/163125109
//# pragma GCC optimize("Ofast,no-stack-protector")
//
//# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, m, l, r;
ll tr[2000005], tree[2000005], k, a[500005];
char op;
void add (int x, ll y) {
while (x <= n)
tree[x] += y, x += x & -x;
return ;
}
ll find (int x) {
ll sum = 0;
while (x)
sum += tree[x], x ^= x & -x;
return sum;
}
void build (int x, int l, int r) {
if (l == r) {
add (l, a[r] - a[l - 1]);
return ;
}
int mid = l + r >> 1, left = x << 1, right = left | 1;
build (left, l, mid), build (right, mid + 1, r);
tr[x] = __gcd (__gcd (tr[left], tr[right]), abs (find (mid + 1) - find (mid)));
return ;
}
void change (int x, int l, int r, int L, int R) {
if (l == L && r == R) {
add (l, k), add (r + 1, -k);
return ;
}
int mid = l + r >> 1, left = x << 1, right = left | 1;
if (R <= mid)
change (left, l, mid, L, R);
else if (L > mid)
change (right, mid + 1, r, L, R);
else
change (left, l, mid, L, mid), change (right, mid + 1, r, mid + 1, R);
tr[x] = __gcd (__gcd (tr[left], tr[right]), abs (find (mid + 1) - find (mid)));
// cerr << x << ':' << l << '~' << r << ':' << find (l) << ',' << tr[x] << '\n';
return ;
}
ll find (int x, int l, int r, int L, int R) {
// cerr << x << ':' << l << '~' << r << ':' << find (l) << ',' << tr[x] << '\n';
if (l == L && r == R)
return __gcd (abs (find (l)), tr[x]);
int mid = l + r >> 1, left = x << 1, right = left | 1;
if (R <= mid)
return find (left, l, mid, L, R);
if (L > mid)
return find (right, mid + 1, r, L, R);
return __gcd (__gcd (find (left, l, mid, L, mid), find (right, mid + 1, r, mid + 1, R)), abs (find (mid + 1) - find (mid)));
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> m;
for (int i = 1; i <= n; ++ i)
cin >> a[i];
build (1, 1, n);
while (m --) {
cin >> op >> l >> r;
if (op == 'C')
cin >> k, change (1, 1, n, l, r);
else
cout << find (1, 1, n, l, r) << '\n';
}
// for (int i = 1; i <= n; ++ i) cerr << find (1, 1, n, i, i) << ' ';
return 0;
}
/*
5 1
1 3 5 7 9
Q 1 5
*/
WA代码:https://www.luogu.com.cn/record/163139736
//# pragma GCC optimize("Ofast,no-stack-protector")
//
//# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, m, l, r;
ll tr[2000005], tree[2000005], k, a[500005];
char op;
void add (int x, ll y) {
while (x <= n)
tree[x] += y, x += x & -x;
return ;
}
ll find (int x) {
ll sum = 0;
while (x)
sum += tree[x], x ^= x & -x;
return sum;
}
void build (int x, int l, int r) {
if (l == r) {
add (l, a[r] - a[l - 1]);
return ;
}
int mid = l + r >> 1, left = x << 1, right = left | 1;
build (left, l, mid), build (right, mid + 1, r);
tr[x] = __gcd (__gcd (tr[left], tr[right]), abs (find (mid + 1) - find (mid)));
return ;
}
ll find (int x, int l, int r, int L, int R) {
// cerr << x << ':' << l << '~' << r << ':' << find (l) << ',' << tr[x] << '\n';
if (l == L && r == R)
return __gcd (abs (find (l)), tr[x]);
int mid = l + r >> 1, left = x << 1, right = left | 1;
if (R <= mid)
return find (left, l, mid, L, R);
if (L > mid)
return find (right, mid + 1, r, L, R);
return __gcd (__gcd (find (left, l, mid, L, mid), find (right, mid + 1, r, mid + 1, R)), abs (find (mid + 1) - find (mid)));
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> m;
for (int i = 1; i <= n; ++ i)
cin >> a[i];
build (1, 1, n);
while (m --) {
cin >> op >> l >> r;
if (op == 'C')
cin >> k, add (l, k), add (r + 1, -k);
else
cout << find (1, 1, n, l, r) << '\n';
}
// for (int i = 1; i <= n; ++ i) cerr << find (1, 1, n, i, i) << ' ';
return 0;
}
/*
5 1
1 3 5 7 9
Q 1 5
*/
修改地方:感觉原先代码的change屁用没有,然后改成直接在主函数里写了一个,为什么WA?