RT
是这道题 link
然后这是我刚开始的代码
#include <iostream>
#define MAXN 500000 * 4
#define int long long
#define QWQ cout << "QWQ" << endl;
using namespace std;
int n, A[MAXN + 10], a[MAXN + 10];
//
int lowbit(int x) {return (x & (-x));}
int ls(int x) {return (x << 1);}
int rs(int x) {return (x << 1 | 1);}
int gcd(int n, int m) {
if(!m) return n;
else return gcd(m, n % m);
}
int tr[MAXN + 10], f[MAXN + 10];
//tree1
void add(int pos, int val) {
for(; pos <= n; pos += lowbit(pos))
tr[pos] += val;
}
int query(int pos) {
int res = 0;
while(pos)
res += tr[pos], pos -= lowbit(pos);
return res;
}
//tree2
void push_up(int now) {
f[now] = gcd(f[ls(now)], f[rs(now)]);
}
void change(int pos, int s, int t, int now, int val) {
if(s == t && s == pos) {
f[pos] += val;
return ;
}
int mid = (s + t) >> 1;
if(mid >= pos) change(pos, s, mid, ls(now), val);
if(mid < pos) change(pos, mid + 1, t, rs(now), val);
push_up(now);
}
int ask(int l, int r, int s, int t, int now) {
if(l <= s && t <= r) return f[now];
int mid = (s + t) >> 1;
int qwq = 0;
if(l <= mid) qwq = ask(l, r, s, mid, ls(now));
if(r > mid) qwq = gcd(ask(l, r, mid + 1, t, rs(now)), qwq);
return qwq;
}
void build(int l, int r, int now) {
if(l == r) {
f[now] = a[now];
return ;
}
int mid = (l + r) >> 1;
build(l, mid, ls(now));
build(mid + 1, r, rs(now));
push_up(now);
}
//
signed main() {
int m;
cin >> n >> m;
for(int p = 1; p <= n; p++) cin >> A[p], a[p] = A[p] - A[p - 1], add(p, a[p]);
build(1, n, 1);
char opt;
for(int p = 1, x, y, z; p <= m; p++) {
cin >> opt >> x >> y;
if(opt == 'C') {
cin >> z;
change(x, 1, n, 1, z);
if(y < n) change(y + 1, 1, n, 1, -z);
add(x, z);
add(y + 1, -z);
}
else {
cout << gcd(query(x), ask(x + 1, y, 1, n, 1)) << endl;
}
}
}
过不了样例的屑代码 然后把 ask 改成
int ask(int l, int r, int s, int t, int now) {
if(l <= s && t <= r) return f[now];
int mid = (s + t) >> 1;
int qwq = 0;
if(l > mid) qwq = ask(l, r, s, mid, ls(now));
if(r <= mid) qwq = gcd(ask(l, r, mid + 1, t, rs(now)), qwq);
return qwq;
}
很离谱的过了样例(这玩意儿为啥能过样例啊/dk),但是全爆炸了 这是现在提交的代码 qAq
#include <iostream>
#define MAXN 500000 * 4
#define int long long
#define QWQ cout << "QWQ" << endl;
using namespace std;
int n, A[MAXN + 10], a[MAXN + 10];
//
int lowbit(int x) {return (x & (-x));}
int ls(int x) {return (x << 1);}
int rs(int x) {return (x << 1 | 1);}
int gcd(int n, int m) {
if(!m) return n;
else return gcd(m, n % m);
}
int tr[MAXN + 10], f[MAXN + 10];
//tree1
void add(int pos, int val) {
for(; pos <= n; pos += lowbit(pos))
tr[pos] += val;
}
int query(int pos) {
int res = 0;
while(pos)
res += tr[pos], pos -= lowbit(pos);
return res;
}
//tree2
void push_up(int now) {
f[now] = gcd(f[ls(now)], f[rs(now)]);
}
void change(int pos, int s, int t, int now, int val) {
if(s == t && s == pos) {
f[pos] += val;
return ;
}
int mid = (s + t) >> 1;
if(mid >= pos) change(pos, s, mid, ls(now), val);
if(mid < pos) change(pos, mid + 1, t, rs(now), val);
push_up(now);
}
int ask(int l, int r, int s, int t, int now) {
if(l <= s && t <= r) return f[now];
int mid = (s + t) >> 1;
int qwq = 0;
if(l > mid) qwq = ask(l, r, s, mid, ls(now));
if(r <= mid) qwq = gcd(ask(l, r, mid + 1, t, rs(now)), qwq);
return qwq;
}
void build(int l, int r, int now) {
if(l == r) {
f[now] = a[now];
return ;
}
int mid = (l + r) >> 1;
build(l, mid, ls(now));
build(mid + 1, r, rs(now));
push_up(now);
}
//
signed main() {
int m;
cin >> n >> m;
for(int p = 1; p <= n; p++) cin >> A[p], a[p] = A[p] - A[p - 1], add(p, a[p]);
build(1, n, 1);
char opt;
for(int p = 1, x, y, z; p <= m; p++) {
cin >> opt >> x >> y;
if(opt == 'C') {
cin >> z;
change(x, 1, n, 1, z);
if(y < n) change(y + 1, 1, n, 1, -z);
add(x, z);
add(y + 1, -z);
}
else {
cout << gcd(query(x), ask(x + 1, y, 1, n, 1)) << endl;
}
}
}
希望有据安咯可以出手相助小菜鸡 qwq,谢惹www