题目链接:

[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]));}
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10941895.html

[PKUSC2018]真实排名——线段树+组合数相关推荐

  1. bzoj5368 [Pkusc2018]真实排名

    题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...

  2. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  3. 可持久化线段树(主席树)【舰娘系列】【自编题】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...

  4. 可持久化线段树(静态)【学习笔记】

    (静态)主席树入门 前置知识:动态开点线段树,权值线段树. 1)权值线段树:相当于将线段树当成一个桶,其中的每一个点所代表的区间相当于一段值域.维护的值为这段值域中的一些信息. 例如该图,节点2代表的 ...

  5. [BZOJ4811][Ynoi2017]由乃的OJ 树链剖分+线段树

    4811: [Ynoi2017]由乃的OJ Time Limit: 6 Sec  Memory Limit: 256 MB Submit: 405  Solved: 134 [Submit][Stat ...

  6. 线段树、二叉堆以及离散化入门

    目录 线段树 例题 题面 练习 1 2 3 4 5 小解区间操作 二叉堆 例题 思路 @ 线段树 例题 题面 时间限制: 1 Sec 内存限制: 128 MB [题意]给出N个数,两种操作:1.C x ...

  7. [BZOJ3693]圆桌会议[霍尔定理+线段树]

    题意 题目链接 分析 又是一个二分图匹配的问题,考虑霍尔定理. 根据套路我们知道只需要检查 "区间的并是一段连续的区间" 这些子集. 首先将环倍长.考虑枚举答案的区间并的右端点 \ ...

  8. cdoj841-休生伤杜景死惊开 (逆序数变形)【线段树 树状数组】

    http://acm.uestc.edu.cn/#/problem/show/841 休生伤杜景死惊开 Time Limit: 3000/1000MS (Java/Others)     Memory ...

  9. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

最新文章

  1. virtualenv使用说明
  2. mfc编辑框显示数据_Excel表格技巧—Excel表格中怎么给数据分等级
  3. 高德h5地图api接口_html5通过腾讯地图、高德地图、百度地图开发api接口获取坐标对应的周边信息...
  4. oracle 后台进程(background process)详解
  5. win7 php 上传文件,在LNMP原来的基础上,win7环境下如何上传PHP文件到Linux环境下...
  6. python 绘制时频图 plt.specgram
  7. 设置mysql为utf-8_如何设置mysql数据库为utf-8编码
  8. SubSonic学习(一)
  9. Samtools说明文档网址变更
  10. #10094. 「一本通 3.5 练习 2」消息的传递
  11. 用c语言编写一个日期计算器
  12. ActiveMQ详解
  13. 淘淘商城(前台系统,展示商城首页,商品分类展示)
  14. 高等数学(第七版)同济大学 习题11-2 个人解答
  15. ES6,ES7,ES8,ES9,ES10新特性一览
  16. android 远程控制 盒子,真正远程控制你的盒子(局域网和互联网)
  17. php word目录,word怎么做目录和页码
  18. 在家无聊?16篇最新推荐系统论文送你
  19. java合法标识符有哪些_Java中的合法标识符
  20. 计算机模拟育种,计算机模拟技术在动物遗传育种研究中应用

热门文章

  1. 前端一HTML:十五: 权重的比较
  2. mybaits十六:使用choose标签实现分支选择
  3. python五十四:isinstance和issubclass
  4. go微服务框架-gomicro试用
  5. SpringBoot + AOP + MySQL监控系统数据变更实战
  6. es6 Set的几种使用场景
  7. 【Sphinx】MySQL+Sphinx 全文检索的使用和测试
  8. JDBC连接MySQL
  9. python urllib的用法实例
  10. C++多小球非对心弹性碰撞(HGE引擎)