社区讨论

关于本题多测清空的疑问,悬关

P7432 [THUPC 2017] 钦妹的玩具商店参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhj3kqcp
此快照首次捕获于
2025/11/03 20:09
4 个月前
此快照最后确认于
2025/11/03 20:09
4 个月前
查看原帖
如下代码会在#1的8000多行WA:
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=40,Mod=1e8+7; int c[N],v[N],id[N],l[M],r[M],dp[M][M][N],dp2[N]; vector<pair<int,int> >p[N];
void solve() {
    int n,m,q,sz; cin>>n>>m>>q,sz=sqrt(n);
    for(int i=1;i<=n;i++) {
        cin>>c[i],id[i]=i/sz+1;
        if(!l[id[i]]) l[id[i]]=i;
        r[id[i]]=i;
    }
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=n;i++) {
        int t; cin>>t;
        for(int j=1;j<=t;t-=j,j<<=1) p[i].push_back({c[i]*j,v[i]*j});
        if(t) p[i].push_back({c[i]*t,v[i]*t});
    }
    for(int i=0;i<=id[n];i++) {
        if(i) {
            for(int j=0;j<=m;j++) dp[i][id[n]+1][j]=dp[i-1][id[n]+1][j];
            for(int j=l[i];j<=r[i];j++)
                for(auto k:p[j])
                    for(int l=m;l>=k.first;l--) dp[i][id[n]+1][l]=max(dp[i][id[n]+1][l],dp[i][id[n]+1][l-k.first]+k.second);
        }
        for(int j=id[n];j>i;j--) {
            for(int k=0;k<=m;k++) dp[i][j][k]=dp[i][j+1][k];
            for(int k=l[j];k<=r[j];k++)
                for(auto l:p[k])
                    for(int o=m;o>=l.first;o--) dp[i][j][o]=max(dp[i][j][o],dp[i][j][o-l.first]+l.second);
        }
    }
    int lst=0;
    while(q--) {
        int x,y,L,R; cin>>x>>y;
        L=min((x+lst-1)%n+1,(y+lst-1)%n+1),R=max((x+lst-1)%n+1,(y+lst-1)%n+1);
        for(int i=0;i<=m;i++) dp2[i]=dp[id[L]-1][id[R]+1][i];
        for(int i=l[id[L]];i<L;i++)
            for(auto j:p[i])
                for(int k=m;k>=j.first;k--) dp2[k]=max(dp2[k],dp2[k-j.first]+j.second);
        for(int i=R+1;i<=r[id[R]];i++)
            for(auto j:p[i])
                for(int k=m;k>=j.first;k--) dp2[k]=max(dp2[k],dp2[k-j.first]+j.second);
        int ans1=0,ans2=0;
        for(int i=1;i<=m;i++) (ans1+=dp2[i])%=Mod,ans2^=dp2[i];
        cout<<ans1<<' '<<ans2<<'\n',lst=ans1;
    }
    for(int i=1;i<=n;i++) p[i].clear();
    for(int i=1;i<=id[n];i++) l[i]=0;
    for(int i=0;i<=id[n];i++)
        for(int j=i+1;j<=id[n]+1;j++)
            for(int k=0;k<=m;k++) dp[i][j][k]=0;
}
int main() {
    ios::sync_with_stdio(false),cin.tie(nullptr);
    int t; cin>>t;
    while(t--) solve();
    return 0;
}
但只要在第49行清空 ll 的时候顺带清空 rr 就行了(llrr 为块的做右端点)就可以 AC。
但理论上 rr 每次会在第 1111 行被赋值,从而无需清空。那为什么还要清空呢?

回复

3 条回复,欢迎继续交流。

正在加载回复...