数列入门分块2求助
  • 板块学术版
  • 楼主MVP_Harry
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/9/13 11:09
  • 上次更新2023/11/5 13:17:26
查看原帖
数列入门分块2求助
306962
MVP_Harry楼主2020/9/13 11:09

RT,LOJ链接,10分,只过了第三个点,其他全都WA。评测链接

有点不知道为什么,看其他几个点,答案和我的也一样(至少前几个点都是这样的)。求大佬帮忙,谢谢!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i, m, n) for(int i = m; i <= n; i++)

//快读快写
template<class Ty> 
inline void read(Ty & X) {
    X = 0; Ty flag = 1; char ch = getchar();
    while(ch < '0' || ch > '9') { if (ch == '-') flag = 0; ch = getchar(); }
    while(ch >= '0' && ch <= '9') { X = (X << 1) + (X << 3) + ch - '0'; ch = getchar(); }
    if (!flag) X = ~(X - 1);
}

template<class Ty> 
inline void write(Ty X) {
    if (X < 0) { X = ~(X - 1); putchar('-'); }
    if (X > 9) write(X / 10);
    putchar(X % 10 + '0');
}

const int maxn = 5e4 + 5;
const int maxx = 500; 

//原数组, 需要排序的数组,belong数组,区间开始,区间结束,lazy tag
int a[maxn], t[maxn], belong[maxn], st[maxx], ed[maxx], lazy[maxx], N; 

//给第k个块排序
void Sort(int k) {
	rep(i, st[k], ed[k]) t[i] = a[i];
	sort(t + st[k], t + ed[k] + 1); 
}

//更新
void update(int l, int r, int c) {
	int lb = belong[l], rb = belong[r]; 
	if (lb == rb) {
		rep(i, l, r) a[i] += c;
		Sort(lb); 
		return ;
	}
	rep(i, l, ed[lb]) a[i] += c;
	rep(i, st[rb], r) a[i] += c;
	Sort(lb), Sort(rb);
	rep(i, lb + 1, rb - 1) lazy[i] += c;
}

//查询
int query(int l, int r, int c) {
	int lb = belong[l], rb = belong[r], ans = 0; //l = 1, r = 4 -> lb = 1, rb = 2;
	// cout << lb << " " << rb << " " << st[lb] << " " << ed[lb] << " " << st[rb] << " " << ed[rb] << endl;
	if (lb == rb) {
		rep(i, l, r) if (a[i] + lazy[lb] < c) ++ans;
		return ans;
	}
	rep(i, l, ed[lb]) if (a[i] + lazy[lb] < c) ++ans; 
	rep(i, st[rb], r) if (a[i] + lazy[rb] < c) ++ans;
	rep(i, lb + 1, rb - 1) 
		ans += (upper_bound(t + st[i], t + ed[i] + 1, c - lazy[i]) - t - st[i]);  
	return ans; 
}

int main() {
    read(N);
    rep(i, 1, N) read(a[i]), t[i] = a[i];
    int block = sqrt(N);
    int bnum = N / block;
    rep(i, 1, block) st[i] = (i - 1) * bnum + 1, ed[i] = i * bnum;
    ed[block] = N;
    rep(i, 1, block) {
    	rep(j, st[i], ed[i]) belong[j] = i;
    	sort(t + st[i], t + ed[i] + 1); 
    }
    rep(i, 1, N) {
    	int opt, l, r, c;
    	read(opt), read(l), read(r), read(c);
    	if (!opt) update(l, r, c);
    	else write(query(l, r, c * c)), puts(""); 
    }
    return 0; 
}
2020/9/13 11:09
加载中...