为什么被卡了 求调
查看原帖
为什么被卡了 求调
697161
qwerty111111楼主2024/9/12 21:08

第一次写分块 为什么WA#11了

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10 , M = 1100;

int L[M] , R[M] , id[N];
int n , q , tag[M] , t;
struct node{
	int val , pos;
} a[N];

inline bool cmp(node a, node b){
	return a.val > b.val;
}

inline void Build(){
	t = sqrt(n);
	for (int i = 1 ; i <= t ; i++){
		L[i] = (i - 1) * t + 1 , R[i] = t * i;
	} 
	if(R[t] < n) ++t , L[t] = R[t - 1] + 1 , R[t] = n;
	for (int i = 1 ; i <= t ; i++){
		for (int j = L[i] ; j <= R[i] ; j++){
			id[j] = i;
		}
	}
	for (int i = 1 ; i <= t ; i++){
		sort(a + L[i] , a + R[i] + 1 , cmp); 
	}
}

inline void Add(int l , int r , int v){
	int kl = id[l] , kr = id[r];
	if(kl == kr){
		for (int i = L[kl] ; i <= R[kr] ; i++){
			if(a[i].pos >= l && a[i].pos <= r)a[i].val += v;
		}
	}
	else{
		for(int i = kl + 1 ; i < kr ; i++) tag[i] += v;
		for (int i = L[kl] ; i <= R[kl] ; i++){
			if(a[i].pos >= l && a[i].pos <= r) a[i].val += v;
		}
		for (int i = L[kr] ; i <= R[kr] ; i++){
			if(a[i].pos >= l && a[i].pos <= r) a[i].val += v;
		}
	}	
}

inline int calc(int idx , int val){
	int l = L[idx] , r = R[idx];
	while(l < r){
		int mid = (l + r + 1) >> 1;
		if(a[mid].val >= val) l = mid;
		else r = mid - 1;
	}
	if(a[l].val < val) return 0;
	return l - L[idx] + 1;
}

inline int Ask(int l , int r , int s){
	int kl = id[l] , kr = id[r] , res = 0;
	if(kl == kr){
		for (int i = L[kl] ; i <= R[kr] ; i++){
			if(a[i].pos >= l && a[i].pos <= r && a[i].val + tag[id[i]] >= s) res++;
		}
	}
	else{
		for (int i = kl + 1 ; i < kr ; i++){
			res += calc(i , s - tag[i]);
		}
		for (int i = l ; i <= R[kl] ; i++){
			if(a[i].pos >= l && a[i].pos <= r && a[i].val + tag[id[i]] >= s) res++;			
		}
		for (int i = L[kr] ; i <= r ; i++){
			if(a[i].pos >= l && a[i].pos <= r && a[i].val + tag[id[i]] >= s) res++;
		}
	}
	return res;
}

signed main(){
	ios::sync_with_stdio(false) , cin.tie(0);
	cin >> n >> q;
	for (int i = 1; i <= n ; i++){
		cin >> a[i].val;
		a[i].pos = i;
	}
	
	
	Build();
	
	char s[2];
	int l , r , c;
	for (int i = 1 ; i <= q ; i++){
		cin >> s >> l >> r >> c;
		if(s[0] == 'M') Add(l , r , c);
		else cout << Ask(l , r , c) << "\n";
	}
	
	return 0;
}
/*
100 5
40 7 47 44 52 81 87 60 82 49 40 30 44 90 62 68 81 44 46 17 44 71 89 79 44 95 57 4 6 36 26 61 62 64 14 93 46 35 20 98 55 6 71 9 85 31 1 70 93 100 82 33 57 14 83 56 40 67 27 53 43 39 44 4 59 32 49 72 91 60 67 84 16 64 9 21 59 30 100 34 47 62 10 9 56 88 19 20 16 92 22 11 68 56 62 16 77 94 20 10
M 66 67 1
M 82 97 13
M 14 90 20
M 47 76 7
A 58 86 80
*/
2024/9/12 21:08
加载中...