社区讨论

考场代码+思路 求证伪/查错

P14636[NOIP2025] 清仓甩卖参与者 4已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mj11px5o
此快照首次捕获于
2025/12/11 14:17
2 个月前
此快照最后确认于
2025/12/13 16:45
2 个月前
查看原帖
就是发现贪心有问题当且仅当花了 m2m-2 元时选了一个 11 占掉了一个可能更优的 22,然后枚举这个 112222 折半之后要求排序在 11 后面,前面一个组合数后面一个 2nx+12^{n-x+1}xx 线性指针维护。
然而只过了 m=2,m=2n1m=2,m=2n-1,求查错 /kel
CPP
#include<bits/stdc++.h>
namespace IO{
    int read(){
        int x=0,f=1;
        char ch=getchar_unlocked();
        while(ch<'0'||ch>'9'){
            if(ch=='-')f=-1;
            ch=getchar_unlocked();
        }
        while(ch>='0'&&ch<='9'){
            x=(x<<3)+(x<<1)+ch-'0';
            ch=getchar_unlocked();
        }
        return x*f;
    }
    void write(int x){
        if(x<0){
            x=-x;
            putchar_unlocked('-');
        }
        if(x<10){
            putchar_unlocked(x+'0');
            return;
        }
        write(x/10);
        putchar_unlocked(x%10+'0');
    }
}
using namespace IO;
namespace Z3k7223{
    #define ll long long
    const int N=5010,mod=998244353;
    int n,m,a[N];
    int pw2[N<<1];
    int jc[N<<1],inv[N<<1];
    int qpow(int x,int y){
        int res=1;
        while(y){
            if(y&1)res=(ll)res*x%mod;
            y>>=1;
            x=(ll)x*x%mod;
        }
        return res;
    }
    void add(int &x,int y){
        x+=y;
        if(x>=mod)x-=mod;
    }
    int C(int x,int y){
        if(x-y<0||x<0||y<0)return 0;
        return (ll)jc[x]*inv[y]%mod*inv[x-y]%mod;
    }
    void solve(){
        n=read();m=read();
        for(int i=1;i<=n;i++)a[i]=read();
        pw2[0]=jc[0]=1;
        for(int i=1;i<=(n<<1);i++){
            pw2[i]=(pw2[i-1]<<1)%mod;
            jc[i]=(ll)jc[i-1]*i%mod;
        }
        inv[n<<1]=qpow(jc[n<<1],mod-2);
        for(int i=(n<<1)-1;~i;i--){
            inv[i]=(ll)inv[i+1]*(i+1)%mod;
        }
        std::sort(a+1,a+1+n,std::greater<int>());
        int ans=0;
        for(int i=1;i<=n;i++){
            int lp=0;
            for(int j=1;j<i;j++){
                if(a[j]>=2*a[i])++lp;
                else break;
            }
            int r=i+1;
            for(int j=lp+1;j<i;j++){
                while(r<=n&&(a[i]+a[r]>=a[j]||2*a[r]>a[j]))++r;
                int sum=m-2-(j-lp-1)-lp,len=i-j-1;
                add(ans,(ll)C(lp+len,sum)*pw2[n-r+1]%mod);
                // std::cerr<<i<<' '<<j<<' '<<' '<<r<<' '<<(ll)C(lp+len,sum)*pw2[n-r+1]%mod<<'\n';
            }
        }
        ans=(pw2[n]-ans+mod)%mod;
        write(ans);
        putchar_unlocked('\n');
    }
    void main(){
        int c,t;
        c=read();t=read();
        while(t--)solve();
    }
}
int main(){
    // freopen("sale.in","r",stdin);
    // freopen("sale.out","w",stdout);
    Z3k7223::main();
    return 0;
}

回复

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

正在加载回复...