zoukankan      html  css  js  c++  java
  • 洛谷 U45568 赌神:决斗

    题目描述

    mathcal{tomoo}tomoo决定与mathcal{CYJian}CYJian进行决斗!

    已知mathcal{tomoo}tomoo有mathcal{N}N张扑克牌,每张扑克牌有一个mathcal{RP}RP值mathcal{A_i}Aimathcal{CYJian}CYJian有mathcal{M}M张扑克牌,每张扑克牌有一个mathcal{RP}RP值mathcal{B_i}Bi

    mathcal{CYJian}CYJian与mathcal{tomoo}tomoo将会各自从他们的牌里任意取一段连续区间的牌决斗,谁的区间内的牌的mathcal{RP}RP值的和更大,谁就赢了,请你帮忙求出mathcal{tomoo}tomoo赢的概率。

    输入输出格式

    输入格式:

    • 第一行22个正整数mathcal{N,M}N,M
    • 第二行NN个正整数mathcal{A_i}Ai
    • 第三行MM个正整数mathcal{B_i}Bi

    输出格式:

    一个数表示mathcal{tomoo}tomoo获胜的概率,如果答案可以表示成frac{P}{Q}QP的形式,则输出frac{P}{Q}\%998244353QP%998244353(不懂的左转P3811

    输入输出样例

    输入样例#1: 复制
    5 5
    1 2 3 4 5
    1 3 5 7 9
    输出样例#1: 复制
    754229067
    输入样例#2: 复制
    10 15
    7 8 5 1 2 3 6 5 4 1 
    52 10 5 6 3 2 1 4 5 8 7 4 5 6 3
    输出样例#2: 复制
    181952721
    输入样例#3: 复制
    1 1
    5
    5
    输出样例#3: 复制
    0
    输入样例#4: 复制
    5 5
    1254125 36521421 25362142 12514221 25362142
    857412252 36322411 2236232 1254112 36224125
    输出样例#4: 复制
    261761853
    输入样例#5: 复制
    2 2
    2 4
    2 5
    输出样例#5: 复制
    332748118

    说明

    样例解释

    • 样例33:不管怎么抽都是平均,胜率为00
    • 样例55:共有99种方案,其中33次tomoo会赢,胜率为1/31/3

    数据范围

    • 对于20\%20%的数据,0<N,Mle500<N,M50
    • 对于另外20\%20%的数据,sum_{i=1}^NA_ile10^6,sum_{j=1}^MB_jle10^6i=1NAi106,j=1MBj106
    • 对于100\%100%的数据,0<N,Mle2000,0<A_i,B_ile10^90<N,M2000,0<Ai,Bi109

    做法:

    由于最多只有20002000个数,我们可以算出一个长度为N的数列,它共有(N+1)N/2个区间,也就是说最多只会有2001000个区间和,所以我们对于每一个数列,用一个数组将每一个区间和储存下来就好了。

    然后将两个数组排序(其实排一个数组就行了),再枚举其中的一个数组,同时用尺取来统计答案。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #define N 4007
     6 #define LL long long
     7 #define mo 998244353
     8 using namespace std;
     9 int n,m,tot1,tot2,a[N],b[N],sum;
    10 LL qa[N],qb[N];
    11 LL suma[N*N],sumb[N*N];
    12 
    13 LL ksm(LL a,LL b){
    14     LL q=1,base=a;
    15     while(b){
    16         if(b&1) q*=base,q%=mo;
    17         base*=base;
    18         base%=mo;
    19         b>>=1;
    20     }
    21     return q;
    22 }
    23 
    24 int main(){
    25     scanf("%d%d",&n,&m);
    26     for(int i=1;i<=n;i++) scanf("%d",&a[i]),qa[i]=qa[i-1]+a[i];
    27     for(int i=1;i<=m;i++) scanf("%d",&b[i]),qb[i]=qb[i-1]+b[i];
    28     for(int i=1;i<=n;i++){
    29         for(int j=i;j<=n;j++)
    30             suma[++tot1]=qa[j]-qa[i-1];
    31     }
    32     for(int i=1;i<=m;i++){
    33         for(int j=i;j<=m;j++)
    34             sumb[++tot2]=qb[j]-qb[i-1];
    35     }
    36     sort(suma+1,suma+tot1+1);
    37     sort(sumb+1,sumb+tot2+1);
    38     int j=0;
    39     for(int i=1;i<=tot1;i++){
    40         while(suma[i]>sumb[j+1]&&j+1<=tot2) j++;
    41         sum+=j;
    42         if (sum>mo) sum-=mo;
    43     }
    44     LL g=n*(n+1)/2;
    45     g=g*m%mo*(m+1)%mo;
    46     g=g*ksm(2,mo-2)%mo;    
    47     printf("%lld",sum*ksm(g,mo-2)%mo);
    48 }
  • 相关阅读:
    黄聪:WordPress 启用HTTPS设置(转)
    黄聪:实用WordPress SQL查询方法
    ArcGIS Pro二次开发,定制开发,参考资料
    ArcGIS Pro二次开发--数据库篇
    ArcGIS Pro二次开发-插入文本,图例和指北针
    ArcGIS Pro二次开发地图MapSeries序列设置
    ArcGIS Pro二次开发-获得Objectid字段
    ArcGIS Pro定制和开发-执行GP环境变量的设置
    ArcGIS Pro二次开发-图层标注
    ArcGIS Pro二次开发-获得一个要素的字段
  • 原文地址:https://www.cnblogs.com/traveller-ly/p/9885448.html
Copyright © 2011-2022 走看看