比赛 2025.5.4 评测结果 TTTTTTTTTT
题目名称 数列操作η 最终得分 0
用户昵称 LikableP 运行时间 19.990 s
代码语言 C++ 内存使用 2.29 MiB
提交时间 2025-05-04 11:10:58
显示代码纯文本
#include <cstdio>
#include <algorithm> 

const int MAXN = 1e5 + 10;

int n, q;
int b[MAXN];
int a[MAXN];

struct SegmentTree {
	#define ls(root) root << 1
	#define rs(root) root << 1 | 1 
	struct NODE {
		int minn, maxx;
		int lazy;
	} node[MAXN << 2];
	
	void PushUp(int root, int lt, int rt) {
		node[root].minn = ::std::min(node[ls(root)].minn, node[rs(root)].minn);
		node[root].maxx = ::std::max(node[ls(root)].maxx, node[rs(root)].maxx);
	}
	
	void Build(int root, int lt, int rt) {
		printf("%d %d\n", lt, rt);
		if (lt == rt) {
			node[root].minn = b[lt];
			node[root].maxx = b[lt]; 
			return ;
		}
		int mid = lt + ((rt - lt) >> 1);
		Build(ls(root), lt, mid);
		Build(rs(root), mid + 1, rt);
		PushUp(root, lt, rt);
	}
	
	void PushDown(int root, int lt, int rt) {
		if (node[root].lazy) {
			node[ls(root)].minn += node[root].lazy;
			node[ls(root)].maxx += node[root].lazy;
			node[ls(root)].lazy += node[root].lazy;
			node[rs(root)].minn += node[root].lazy;
			node[rs(root)].maxx += node[root].lazy;
			node[rs(root)].lazy += node[root].lazy;
			node[root].lazy = 0;
		}
	}
	
	void AddSeq(int root, int lt, int rt, int lq, int rq, int val) {
		if (lt == lq && rt == rq) {
			node[root].minn += val;
			node[root].lazy += val;
			return ;
		}
		PushDown(root, lt, rt);
		int mid = lt + ((rt - lt) >> 1);
		if (rq <= mid) {
			AddSeq(ls(root), lt, mid, lq, rq, val);
		} else if (lq > mid) {
			AddSeq(rs(root), mid + 1, rt, lq, rq, val);
		} else {
			AddSeq(ls(root), lt, mid, lq, mid, val);
			AddSeq(rs(root), mid + 1, rt, mid + 1, rq, val);
		}
	}
	
	int Query(SegmentTree X, int root, int lt, int rt, int lq, int rq) {
		if (lt == lq && rt == rq) {
			if (node[root].maxx < X.node[root].minn) return 0;
			if (lt == rt) return node[root].maxx / X.node[root].maxx;
		}
		int mid = lt + ((rt - lt) >> 1);
		if (rq <= mid) {
			return Query(X, ls(root), lt, mid, lq, rq); 
		} else if (lq > mid) {
			return Query(X, rs(root), mid + 1, rt, lq, rq);
		}  else {
			return Query(X, ls(root), lt, mid, lq, mid) + Query(X, rs(root), mid + 1, rt, mid + 1, rq);
		}
	}
}; 

SegmentTree A, B;
void Work2() { 
	B.Build(1, 1, n); 
	
	while (q--) {
		char op[10];
		int l, r;
		scanf("%s %d %d", op, &l, &r);
		if (op[0] == 'a') {
			A.AddSeq(1, 1, n, l, r, 1);
		} else {
			printf("%d\n", A.Query(B, 1, 1, n, l, r));
		}
	}
}

void Work1() {
	while (q--) {
		char op[10];
		int l, r;
		scanf("%s %d %d", op, &l, &r);
		if (op[0] == 'a') {
			for (int i = l; i <= r; ++i) ++a[i];
		} else {
			int ans = 0;
			for (int i = l; i <= r; ++i) ans += a[i] / b[i];
			printf("%d\n", ans);
		}
	}
}

int main() {
	freopen("eta.in", "r", stdin);
	freopen("eta.out", "w", stdout); 
	scanf("%d %d", &n, &q);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &b[i]);
	}
	if (n <= 30000) {
		Work1();
	} else {
		Work1();
	}
	return 0;
}