60pts TLE 线段树二分
查看原帖
60pts TLE 线段树二分
1114867
1nes楼主2024/10/22 10:00
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ra read()
#define ls p << 1
#define rs p << 1 | 1 
const int N = 2e5 + 3;
int n , m , q;
int a[N];
int t[N << 2] , tag[N << 2];
inline int read(){
	int x = 0 , f = 1;
	char ch = getchar();
	while(ch > '9' || ch < '0'){
		if(ch == '-')	f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
inline void push_up(int p){
	t[p] = t[ls] + t[rs];
}
inline void build(int p , int l , int r){
	if(l == r){
		t[p] = a[l];
		return;
	}
	int mid = l + (r - l) / 2;
	build(ls , l , mid);
	build(rs , mid + 1 , r);
	push_up(p);
}
inline void push_down(int p , int l , int r){
	if(tag[p]){
		int mid = l + (r - l) / 2;
		tag[ls] += tag[p];
		tag[rs] += tag[p];
		t[ls] += (mid - l + 1) * tag[p];
		t[rs] += (r - mid) * tag[p];
		tag[p] = 0;
	}
}
inline void update(int p , int l , int r , int ll , int rr , int d){
	if(l > rr || r < ll)	return;
	if(l >= ll && r <= rr){
		tag[p] += d;
		t[p] += (r - l + 1) * d;
		return;
	}
	push_down(p , l , r);
	int mid = l + (r - l) / 2;
	update(ls , l , mid , ll , rr , d);
	update(rs , mid + 1 , r , ll , rr , d);
	push_up(p);
}
inline int query(int p , int l , int r , int ll , int rr){
	if(l > rr || r < ll)	return 0;
	if(l >= ll && r <= rr)	return t[p];
	push_down(p , l , r);
	int mid = l + (r - l) / 2;
	int res = query(ls , l , mid , ll , rr);
	res += query(rs , mid + 1 , r , ll , rr);
	return res; 
}
inline int solve(int p , int l , int r , int s , int q){
	if(l == r)	return l;
	push_down(p , l , r);
	int mid = l + (r - l) / 2;
	if(t[ls] * q >= s)	return solve(ls , l , mid , s , q);
	else	return solve(rs , mid + 1 , r , s - t[ls] * q , q);
}
signed main(){
	n = ra , q = ra , m = ra;
	for(int i = 1 ; i <= n ; i++)	a[i] = ra;
	build(1 , 1 , n);
	int l , r , d;
	for(int i = 1 ; i <= q ; i++){
		cin >> l >> r >> d;
		update(1 , 1 , n , l , r , d);
		int q = log2(m / t[1] + 1);
		int ans = q * n;
		q = 1ll << q;
		int s = m - (q - 1) * t[1];
		if(!s)	cout << ans - 1 << '\n';
		else	cout << ans + solve(1 , 1 , n , s , q) - 1 << '\n';
	}
	return 0;
}

以及为什么将代码中

		if(!s)	cout << ans - 1 << '\n';

改成

		if(s <= 0)	cout << ans - 1 << '\n';

会wa

2024/10/22 10:00
加载中...