社区讨论
考场代码+思路 求证伪/查错
P14636[NOIP2025] 清仓甩卖参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mj11px5o
- 此快照首次捕获于
- 2025/12/11 14:17 2 个月前
- 此快照最后确认于
- 2025/12/13 16:45 2 个月前
就是发现贪心有问题当且仅当花了 元时选了一个 占掉了一个可能更优的 ,然后枚举这个 和 , 折半之后要求排序在 后面,前面一个组合数后面一个 , 线性指针维护。
然而只过了 ,求查错 /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 条回复,欢迎继续交流。
正在加载回复...