社区讨论

求助!两份代码一份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 条回复,欢迎继续交流。

正在加载回复...