首页 > 代码库 > Codeforces Round #420 (Div. 2)

Codeforces Round #420 (Div. 2)

/******************************************************************************************************************

因为发现不敲题会变蠢...所以没事还是做两道题吧....

很久没做过题然后发现C和E全都是因为没用LL给卡住了......  我真的是太蠢了

*******************************************************************************************************************/

 A. Okabe and Future Gadget Laboratory

暴力判断就行了

 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 int Map[55][55]; 6 int main() 7 { 8     int n; 9     scanf("%d",&n);10     for(int i=1;i<=n;++i)11         for(int j=1;j<=n;++j)12         scanf("%d",&Map[i][j]);13     int Ans=1;14     for(int i=1;i<=n;++i)15       for(int j=1;j<=n;++j)16       if(Map[i][j]!=1)17      {18          int flag=0;19          for(int k=1;k<=n;++k)20          if(k!=i&&!flag)21           for(int q=1;q<=n;++q)22           if(q!=j&&Map[i][q]+Map[k][j]==Map[i][j]&&!flag)23               flag=1;24          if(!flag)25              Ans=0;26      }27      printf("%s\n",Ans?"Yes":"No");28     return 0;29 }

 

B. Okabe and Banana Trees

发现高度会很小,所以直接遍历高度,然后就是一个等差数列求前缀和了

 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define LL long long 6 LL Sum[10000005];  7 int main() 8 { 9     int m,b;10     scanf("%d%d",&m,&b);11     for(int i=1;i<=m*b;++i)12     Sum[i]=Sum[i-1]+i;13     LL Ans=0;14     for(LL i=0;i<=b;++i)15     {16         LL x=m*(b-i);17         LL tmp=0;18         tmp+=(i+1)*Sum[x];19         tmp+=(i*(i+1))*(x+1)/2;20         Ans=max(Ans,tmp);21     }22     printf("%lld\n",Ans);23     return 0;24 }

C. Okabe and Boxes

这道题比较巧妙

暴力解法:(当然是不行滴

1.如果刚好能拿走就拿走

2.不能拿走我就排序

题目说肯定存在一个答案能满足条件,就说明在第i次remove的时候i一定在序列里

所以我们在remove的时候栈顶只有两种情况

1.刚好是我们需要的

2.是我们不需要的值(这时候就直接排序

然后我们考虑之前说过的条件,remove时候i一定在序列里,然后我们考虑把所有排过序的数字给标记一下(并不排序,只是标记一下

就有了第三种情况

3.遇到了我们标记过的值

这时候因为i一定在序列里,然后考虑比i小的全都remove走了,所以如果遇到了标记的说明这时候直接把i拿走就好了,因为这时候栈里面肯定全都是排好序的

然后我们就发现了栈的相对顺序是不变的,所以每次排序我们只需要标记栈顶的那个元素

然后说是要取i,其实就是假装i取取走了,其实还是在栈里

总的来说就是当delete的时候

1.如果刚好能拿走就拿走

2.不能拿走我就标记一下栈顶(假装排序

 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define LL long long 6 #define maxn 500005 7 int stac[maxn]; 8 char str[15]; 9 int main()10 {11     int n;12     int st=0,ed=0;13     scanf("%d",&n);14     int pos=0,Ans=0;15     for(int i=1;i<=n*2;++i)16     {17         scanf("%s",str);18         if(str[0]==a)19         {20             int x;21             scanf("%d",&x);22             stac[ed++]=x;23         }24         else25         {26             pos++;27             if(stac[ed-1]==pos)28             {29                 ed--;30                 continue;31             }32             else if(stac[ed-1]==0)33             {34                 continue;35             }36             else37             {38                 Ans++;39                 stac[ed-1]=0;40             }41         }42     }43     printf("%d\n",Ans);44     return 0;45 }

D. Okabe and City

待补

E. Okabe and El Psy Kongroo

这道题第一眼递推,然后发现k有点大.然后发现n特别小,所以就很明显的按阶段来跑矩阵快速幂

f[i+1][j]=f[i][j-1] + f[i][j] + f[i][j+1]然后判断一下会不会溢出就好了,中间用个数组存放中间值,主要是害怕用到本来应该溢出的值

  1 #include<stdio.h>  2 #include<string.h>  3 #include<iostream>  4 #include<algorithm>  5 #include<math.h>  6 #include<queue>  7 #include<stack>  8 #include<string>  9 #include<vector> 10 #include<map> 11 #include<set> 12 using namespace std; 13 #define lowbit(x) (x&(-x)) 14 typedef long long LL; 15 const int maxn = 100005; 16 const int inf=(1<<28)-1; 17 #define Matrix_Size 20 18 LL MOD=1000000007; 19 int Size; 20 struct Matrix 21 { 22     LL mat[Matrix_Size][Matrix_Size]; 23     void clear() 24     { 25         memset(mat,0,sizeof(mat)); 26     } 27     void output() 28     { 29         for(int i = 0;i < Size;i++) 30         { 31             for(int j = 0;j < Size;j++) 32                 printf("%d ",mat[i][j]); 33             printf("\n"); 34         } 35     } 36     Matrix operator *(const Matrix &b)const 37     { 38         Matrix ret; 39         for(int i = 0;i < Size;i++) 40             for(int j = 0;j < Size;j++) 41             { 42                 ret.mat[i][j] = 0; 43                 for(int k = 0;k < Size;k++) 44                 { 45                     long long tmp = (long long)mat[i][k]*b.mat[k][j]%MOD; 46                     ret.mat[i][j] = (ret.mat[i][j]+tmp); 47                     if(ret.mat[i][j]>=MOD) 48                         ret.mat[i][j] -= MOD; 49  50                 } 51             } 52         return ret; 53     } 54 }; 55 Matrix pow_M(Matrix a,long long n) 56 { 57     Matrix ret; 58     ret.clear(); 59     for(int i = 0;i < Size;i++) 60         ret.mat[i][i] = 1; 61     Matrix tmp = a; 62     while(n) 63     { 64         if(n&1)ret = ret*tmp; 65         tmp = tmp*tmp; 66         n>>=1; 67     } 68     return ret; 69 } 70 int S[17]; 71 int main() 72 { 73     Matrix A,B; 74     S[0]=1; 75     LL n,k; 76     scanf("%lld%lld",&n,&k); 77     for(int i=1;i<=n;++i) 78     { 79         LL st,ed,h; 80         scanf("%lld%lld%lld",&st,&ed,&h); 81         if(i==n) 82             ed=k; 83              84         Size=h+1; 85          86         B.clear(); 87         for(int j=0;j<=h;++j) 88         { 89             B.mat[0][j]=S[j]; 90         }     91          92         A.clear(); 93         for(int j=0;j<=h;++j) 94         { 95             if(j>0) 96                 A.mat[j-1][j]=1; 97             A.mat[j][j]=1; 98             if(j<h) 99                 A.mat[j+1][j]=1;100         }101         102         A=pow_M(A,ed-st);103         B=B*A;104         105         for(int j=0;j<17;++j)106             S[j]=0;107         108         for(int j=0;j<=h;++j)109             S[j]=B.mat[0][j];110         111     }112     printf("%d\n",B.mat[0][0]);113     return 0;114 } 

 

Codeforces Round #420 (Div. 2)