zoukankan      html  css  js  c++  java
  • 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese

    根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和

    我们可以转变问题,每个点在所有方案的贡献

    进而其实询问就是1-k的取值,有多少中方案再取个和

    事实上这样做就是将每个点抽离出来,虽然每种方案中可能包含多个可行点,但是我们每次考虑的都只是一个点的贡献,所以正确

    ps:指数不能取模

    代码很短

     1 #include<bits/stdc++.h>
     2 #define int long long
     3 using namespace std;
     4 int n,m,K;
     5 int mod=1e9+7;
     6 int poww(int x,int y)
     7 {
     8      int ans=1;
     9      while(y)
    10      {
    11          if(y&1)ans=ans*x%mod;
    12          x=x*x%mod;
    13          y>>=1;
    14      }
    15      return ans%mod;
    16 }
    17 int sum=0;
    18 signed main()
    19 {
    20     scanf("%lld%lld%lld",&n,&m,&K);        
    21     int zz=poww(K,n*m-n-m+1);
    22     int two=(n-1)+(m-1);
    23     for(int k=2;k<=K;++k)
    24     {
    25         int xx=poww(k-1,two);
    26         sum=(sum+(xx*zz)%mod)%mod;
    27     }
    28     printf("%lld
    ",sum*n%mod*m%mod);
    29 }
    View Code

    T2 physics

    正解没打,咕了

    用暴力剪枝水过的

    剪枝一:处理前缀和后O(1)查询,但是因为每次改变的值很小

    修改时只需判断修改符号是否在上一轮的答案中,是则输出答案,否则修改

    剪枝二:每次二分的长度右边界都是上一轮的答案

     1 #include<bits/stdc++.h>
     2 #define int long long
     3 #define MAXN 2011
     4 using namespace std;
     5 int n,m;
     6 char a[MAXN][MAXN];
     7 int sum[MAXN][MAXN];
     8 int last_x,last_y,last_len;
     9 int zuo_x,zuo_y;
    10 int get_sum1(int x1,int y1,int x2,int y2)
    11 {
    12     return sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2];
    13 }
    14 int work(int mid)
    15 {
    16     for(int i=1;i<=n-mid+1;++i)
    17     {
    18         for(int j=1;j<=m-mid+1;++j)
    19         {
    20             if(get_sum1(i,j,i+mid-1,j+mid-1)==0)
    21             {
    22                 last_x=i,last_y=j;last_len=mid;
    23                 return 1;
    24             }
    25         }
    26     }
    27     return 0;
    28 }
    29 void second_divied()
    30 {          
    31     int l=1;int r=last_len;
    32     while(l+1<r)
    33     {    
    34           int mid=(l+r)>>1;
    35           if(work(mid))l=mid;
    36           else r=mid;   
    37     }
    38     if(work(r))printf("%lld
    ",r);
    39     else if(work(l))printf("%lld
    ",l);
    40 }          
    41 int q;int ok=0;
    42 void the_yu(int x,int y)
    43 {
    44      for(int i=x;i<=n;++i)
    45      {
    46          for(int j=y;j<=m;++j)
    47          {
    48              sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
    49              if(a[i][j]=='-')sum[i][j]++;
    50          }
    51      }
    52 }
    53 bool pan(int x,int y)
    54 {
    55      if(x>=last_x&&y>=last_y&&x<=last_x+last_len-1&&y<=last_y+last_len-1)return 0;
    56      return 1;
    57 }
    58 signed main()
    59 {
    60     scanf("%lld%lld%lld",&n,&m,&q);last_len=min(n,m);
    61     for(int i=1;i<=n;++i)scanf("%s",a[i]+1);
    62     zuo_x=0x7fffff;zuo_y=0x7ffff;    
    63     for(int i=1;i<=q;++i)
    64     {
    65        int x,y;
    66        scanf("%lld%lld",&x,&y);
    67        a[x][y]='-';
    68        zuo_x=min(zuo_x,x);zuo_y=min(zuo_y,y);
    69        if(i>1&&pan(x,y))
    70        {
    71            printf("%lld
    ",last_len);
    72            continue;
    73        }
    74        else
    75        {
    76            if(i==1)the_yu(1,1);
    77            else the_yu(zuo_x,zuo_y);
    78            second_divied();
    79            zuo_x=0x7fffff;zuo_y=0x7fffff;
    80        }
    81     }
    82 }
    View Code

    T3 chemistry

    概率期望,仿佛不可做,咕了....

  • 相关阅读:
    AC自动机算法与AC自动机专辑
    hdu 2757 DNA repair AC自动机dp完全不懂
    hdu 3695 AC自动机模板题
    Magic Tree 水dp 错题!
    AC自动机模板
    UVa 10003 Cutting Sticks 区间dp
    hdu 3695 Computer Virus on Planet Pandora AC自动机
    [置顶] AC自动机算法与AC自动机专辑
    Trip 图dp
    利用数据库创建webservice
  • 原文地址:https://www.cnblogs.com/Wwb123/p/11428954.html
Copyright © 2011-2022 走看看