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;
}