社区讨论
求助!两份代码一份AC一份WA
灌水区参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo2b7sl8
- 此快照首次捕获于
- 2023/10/23 10:59 2 年前
- 此快照最后确认于
- 2023/11/03 11:09 2 年前
实在看不出来有什么区别,调了半天了死活调不出来
AC的:
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + 10, M = 250;
int n, m, blk, a[N], b[N], tag[M], bel[N], st[M], ed[M];
inline void rebuild(int x) {
for (int i = st[x]; i <= ed[x]; ++i)
b[i] = a[i];
sort(b + st[x], b + ed[x] + 1);
}
inline void init() {
blk = sqrt(n), m = (n + blk - 1) / blk;
for (int i = 1; i <= m; ++i) {
st[i] = blk * (i - 1) + 1, ed[i] = min(blk * i, n);
for(int j = st[i]; j <= ed[i]; j++) bel[j] = i;
sort(b + st[i], b + ed[i] + 1);
}
}
inline void modify(int l, int r, int c) {
if (bel[l] == bel[r]) {
for (int i = l; i <= r; ++i) a[i] += c; rebuild(bel[l]);
} else {
for (int i = l; i <= ed[bel[l]]; ++i) a[i] += c;
rebuild(bel[l]);
for (int i = st[bel[r]]; i <= r; ++i) a[i] += c;
rebuild(bel[r]);
for (int i = bel[l] + 1; i < bel[r]; ++i) tag[i] += c;
}
}
int Count(int l,int r,int c) {
int x= bel[l];
while(l<=r) {
int mid=l+r>>1;
if(b[mid]+tag[x]<c*c) l=mid+1;
else r=mid-1;
}
return l-st[x];
}
int query(int l,int r,int c){
if(bel[l]==bel[r]){
int x=bel[l],ans=0;
for(int i=l;i<=r;++i)ans+=a[i]+tag[x]<c*c;
return ans;
}
else{
int L=bel[l],R=bel[r],ans=0;
for(int i=l;i<=ed[L];++i)ans+=a[i]+tag[L]<c*c;
for(int i=st[R];i<=r;++i)ans+=a[i]+tag[R]<c*c;
for(int i=L+1;i<R;++i)ans+=Count(st[i],ed[i],c);
return ans;
}
}
signed main() {
ios::sync_with_stdio(NULL);
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i], b[i] = a[i];
init();
for(int i = 1; i <= n; i++) {
int opt, l, r, c;
cin >> opt >> l >> r >> c;
if (opt == 0)
modify(l, r, c);
else
cout << query(l, r, c) << endl;
}
return 0;
}
WA的:
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e4+10,N_=250;
int n,m,blk,a[N],b[N],tag[N_],bel[N],st[N_],ed[N_];
inline void init() {
blk=sqrt(n),m=(n+blk-1)/blk;
for(int i=1;i<=m;++i) {
st[i]=blk*(i-1)+1,ed[i]=min(blk*i,n);
sort(b+st[i],b+ed[i]+1);
for(int j=st[i];j<=ed[i];++j) bel[j]=i;
}
}
inline void rebuild(int x) {
for(int i=st[x];i<=ed[x];++i) b[i]=a[i];
sort(b+st[x],b+ed[x]+1);
}
inline void modify(int l,int r,int c) {
if(bel[l]==bel[r]) {
for(int i=l;i<=r;++i) a[i]+=c;
rebuild(bel[l]);
}
else {
for(int i=l;i<=ed[bel[l]];++i) a[i]+=c;
for(int i=st[bel[r]];i<=r;++i) a[i]+=c;
rebuild(bel[l]),rebuild(bel[r]);
for(int i=bel[l]+1;i<bel[r];++i) tag[i]+=c;
}
}
inline int Count(int l,int r,int c) {
while(l<=r) {
int mid=l+r>>1;
if(b[mid]+tag[bel[l]]<c*c) l=mid+1;
else r=mid-1;
}
return l-st[bel[l]];
}
inline int query(int l,int r,int c) {
int res=0;
if(bel[l]==bel[r]) {
for(int i=l;i<=r;++i) res+=(a[i]+tag[bel[i]]<c*c);
}
else {
for(int i=l;i<=ed[bel[l]];++i) res+=(a[i]+tag[bel[i]]<c*c);
for(int i=st[bel[r]];i<=r;++i) res+=(a[i]+tag[bel[i]]<c*c);
for(int i=bel[l]+1;i<bel[r];++i) res+=Count(st[i],ed[i],c);
}
return res;
}
signed main() {
ios::sync_with_stdio(NULL);
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i],b[i]=a[i];
init();
while(n--) {
int opt,l,r,c;
cin>>opt>>l>>r>>c;
if(opt==0) modify(l,r,c);
else cout<<query(l,r,c)<<endl;
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...