「PKUSC2018」真实排名(排列组合,数学)

前言

为什么随机跳题会跳到这种题目啊?

Solution

我们发现可以把这个东西分情况讨论:
1.这个点没有加倍

  • 这一段相同的可以看成一个点,然后后面的都可以。
  • 这一段看成一个点,然后前面的不能对他造成影响的都可以。

2.这个点加倍了

  • 这一段相同的看做一个点,然后前面的都可以
  • 这一段相同的看成一个点,然后后面的如果对他的排名有影响,一定要加倍。

剩下的用组合数随便乱算一下就好了。

代码实现

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int N=100010,Mod=998244353;
struct node{int id,val;};
bool cmp(node a,node b){return a.val>1;
            if(a[mid].val*2>=a[i].val){wh=mid;r=mid-1;}
            else l=mid+1;
        }
        have+=i-1;
        if(wh)have-=i-wh;
        ans[now]=C(have,k);
        have=i-1;int K=k-1;
        l=1,r=n;wh=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(a[mid].val

转载于:https://www.cnblogs.com/mleautomaton/p/10254926.html

你可能感兴趣的:(「PKUSC2018」真实排名(排列组合,数学))