题目链接:

[PKUSC2018]真实排名

对于每个数$val$分两种情况讨论:

1、当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的。

2、当$val$翻倍时,显然权值在$[val,val*2-1]$的都要翻倍,剩下可以翻倍的是权值比$val$小的和大于等于$2*val$的。

用权值线段树维护权值,剩下的就是一步组合数。注意对$val=0$的特判。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=998244353;
const int INF=1000000000;
int fac[100010];
int inv[100010];
int sum[10000000];
int ls[10000000];
int rs[10000000];
int cnt;
int n,k;
int a[100010];
int root;
void change(int &rt,int l,int r,int k)
{
if(!rt)
{
rt=++cnt;
}
sum[rt]++;
if(l==r)
{
return ;
}
int mid=(l+r)>>1;
if(k<=mid)
{
change(ls[rt],l,mid,k);
}
else
{
change(rs[rt],mid+1,r,k);
}
}
int query(int rt,int l,int r,int L,int R)
{
if(L>R||!rt)
{
return 0;
}
if(L<=l&&r<=R)
{
return sum[rt];
}
int mid=(l+r)>>1;
int res=0;
if(L<=mid)
{
res+=query(ls[rt],l,mid,L,R);
}
if(R>mid)
{
res+=query(rs[rt],mid+1,r,L,R);
}
return res;
}
int C(int n,int m)
{
if(n<m||m<0)
{
return 0;
}
return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int solve(int val)
{
int ans=0;
int num=0;
int sum=0;
if(!val)
{
num=n-1;
ans=(ans+C(num,k))%mod;
ans=(ans+C(num,k-1))%mod;
}
else
{
num+=query(root,0,INF,0,(val-1)/2);
num+=query(root,0,INF,val,INF)-1;
ans=(ans+C(num,k))%mod;
num=0;
num+=query(root,0,INF,2*val,INF);
num+=query(root,0,INF,0,val-1);
sum+=query(root,0,INF,val,val*2-1);
ans=(ans+C(num,k-sum))%mod;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&k);
fac[0]=fac[1]=inv[0]=inv[1]=1;
for(int i=2;i<=n;i++)
{
fac[i]=1ll*fac[i-1]*i%mod;
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=2;i<=n;i++)
{
inv[i]=1ll*inv[i]*inv[i-1]%mod;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
change(root,0,INF,a[i]);
}
for(int i=1;i<=n;i++)
{
printf("%d\n",solve(a[i]));
}
}

最新文章

  1. nodemailer 发邮件
  2. Python学习之day3
  3. PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
  4. 将 List&lt;UserInfo&gt;中的对象按照UserInfo.name进行分组
  5. ArcGIS发布服务时缓存切片设置
  6. Web中的图标
  7. flask-sqlalchemy分表解决方案
  8. SaaS系列介绍之十三: SaaS系统体系架构
  9. Linux 最常用命令小结
  10. PHP文件上传与安全
  11. 返璞归真 asp.net mvc (3) - Controller/Action
  12. 智联卓聘 卓聘IM(聊聊)开发实践
  13. 【mongodb系统学习之四】查看mongodb进程
  14. vue鼠标悬停事件
  15. Jump Flood Algorithms for Centroidal Voronoi Tessellation
  16. Linux DMA Engine framework(3)_dma controller驱动
  17. pandas中DataFrame对象to_csv()方法中的encoding参数
  18. Filter查询
  19. HTML5绘制几何图形
  20. 123. Best Time to Buy and Sell Stock III (Array; DP)

热门文章

  1. 你听过稀疏数组(sparseArray)吗?
  2. 关于Vue中,使用watch同时监听两个值的实现方法
  3. unity 刚体
  4. docker 基于Dockerfile构建redis
  5. py-1 语言介绍
  6. vue框架之脚手架(vue-cli)的使用
  7. cmd中for的用法
  8. 版本控制系统(VCS)简介
  9. css详解2
  10. 十分钟掌握Pandas(上)——来自官网API