萌新刚学 OI,连线段树都不会了求助 qAq
  • 板块灌水区
  • 楼主SIXIANG32
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/1/14 21:13
  • 上次更新2023/10/28 12:21:31
查看原帖
萌新刚学 OI,连线段树都不会了求助 qAq
298549
SIXIANG32楼主2022/1/14 21:13

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

2022/1/14 21:13
加载中...