• Codeforces 451(#258 (Div. 2) ) 解题报告


    第一次比赛的时候离4题最近的一次,可惜思维太慢加手速太慢最终没有能在比赛中A掉。

    A:可知,能且只能操作MIN(N,M)次,所以判断奇偶即可

     1 // File Name: a.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年07月24日 星期四 23时31分20秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 
    25 using namespace std;
    26 
    27 int main(){
    28   int n , m ; 
    29   scanf("%d %d",&n,&m);
    30   n = min(n,m);
    31   if(n % 2 == 1)
    32       printf("Akshat
    ");
    33   else printf("Malvika
    ");
    34 return 0;
    35 }
    View Code

    B:分几种情况讨论即可

     1 // File Name: b.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年07月24日 星期四 23时40分41秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 
    25 using namespace std;
    26 int a[100005];
    27 int b[100005];
    28 int main(){
    29   int n ;
    30   scanf("%d",&n);
    31   int ok = 0 ;
    32   for(int i = 1;i <= n;i ++)
    33   {
    34     scanf("%d",&a[i]);
    35     if(a[i] < a[i-1])
    36     {
    37         b[i] = b[i-1]+1;
    38         b[i-1] = 0;
    39     }
    40   }
    41   a[n+1] = 1e9+7;
    42   int sum = 0 ; 
    43   int site = 0 ;
    44   for(int i =1 ;i <= n;i ++)
    45   {
    46      if(b[i])
    47      {
    48          sum ++ ;
    49          site = i; 
    50      }
    51   }
    52 
    53   if(sum >= 2)
    54      printf("no
    ");   
    55   if(sum == 0 )
    56       printf("yes
    1 1
    ");
    57   if(sum == 1 )
    58   {
    59       if(a[site] > a[site -b[site]-1] && a[site-b[site]] < a[site+1])
    60         printf("yes
    %d %d
    ",site-b[site],site);
    61       else printf("no
    ");
    62   }
    63 return 0;
    64 }
    View Code

    C:二进制枚举所有情况,再看其是否满足K和M 的要求

     1 // File Name: c.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年07月24日 星期四 23时57分43秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 
    25 #define LL long long 
    26 using namespace std;
    27 
    28 int main(){
    29     int ca; 
    30     scanf("%d",&ca);
    31     while(ca--)
    32     {
    33        LL n , k ,d1,d2;
    34        scanf("%I64d %I64d %I64d %I64d",&n,&k,&d1,&d2);
    35        LL a[4];
    36        LL b[4];
    37        LL is = 0 ;
    38        for(LL i = 0;i <= 3; i ++)
    39        {
    40            memset(a,0,sizeof(a));
    41            memset(b,0,sizeof(b));
    42            LL t = k ; 
    43            if(i % 2 == 0 )
    44            {
    45                t -= d1;
    46                b[1] = d1;
    47            }
    48            else {
    49                t += d1;
    50                b[1] = -d1;
    51            }
    52            
    53            if(i /2 == 0 ){
    54                t -=d2;
    55                b[3] = d2; 
    56            }
    57            else{ t += d2;
    58               b[3] = -d2;
    59            }
    60            if(t % 3 != 0 )
    61                continue;
    62 
    63            LL ok = 0 ; 
    64            for(LL i = 1;i <= 3 ;i ++)
    65            {
    66               a[i] = t/3 + b[i];
    67               if(a[i] < 0)
    68                   ok = 1; 
    69            }
    70            if(ok == 1 )
    71                continue;
    72 
    73            if(n % 3 != 0)
    74                continue;
    75            LL p = n/3;
    76 
    77            ok = 0 ; 
    78            for(LL i =1;i <= 3;i ++)
    79            {
    80               if(a[i]>p)
    81                   ok = 1; 
    82            }
    83            if(ok == 1)
    84                continue;
    85            is = 1; 
    86            break;
    87        }
    88        if(is)
    89            printf("yes
    ");
    90        else printf("no
    ");
    91        
    92     }
    93 return 0;
    94 }
    View Code

    D:因为字符串只有A,B组成,可知一个字符串的字串个数有 len*(len+1)/2 种,所以只有两个端点取到相同的字符才能构成 good 字符串,分奇偶的话就只需要统计

    每种字符出现的位置有多少个偶数,多少个奇数,排除只有一个字母的字串的情况(单独计数)同为偶数或奇数的长度为奇数,奇偶互异的长度为偶数,想清楚这些就可以求解了。

      1 // File Name: d.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年07月25日 星期五 00时31分33秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long 
     25 using namespace std;
     26 char str[100005];
     27 int sum[100005];
     28 LL pike2(LL x)
     29 {
     30    return x*(x-1)/2;
     31 }
     32 int main(){
     33     scanf("%s",str);
     34     int len = strlen(str);
     35     int t= 0;
     36     int p = 0 ;
     37     for(int i =1 ;i < len ;i ++)
     38     {
     39         if(str[i] != str[i-1])
     40          {
     41             t ++ ; 
     42             sum[t] = i-p;
     43             p = i;    
     44          }        
     45     }
     46     t ++ ; 
     47     sum[t] = len -p ;
     48     LL sume ,sumo;
     49     sume = sumo = 0 ;
     50     LL sumek[3];
     51     LL sumok[3];
     52     LL ans = 1ll*len*(len+1)/2;
     53     LL tsum = 0 ;
     54     memset(sumek,0,sizeof(sumek));
     55     memset(sumok,0,sizeof(sumok));
     56     for(int i =1;i <= t ;i ++)
     57     {
     58         if(i % 2 == 1)
     59         {
     60           sumo += sum[i];
     61           if(sum[i] % 2 == 0 )
     62           {
     63               sumok[1] += sum[i]/2;
     64               sumok[2] += sum[i]/2;
     65           }else{
     66              if((tsum+1)%2 == 1)
     67              {
     68                 sumok[1] += sum[i]/2+1;
     69                 sumok[2] += sum[i]/2;
     70              }else{
     71                  sumok[1] += sum[i]/2;
     72                  sumok[2] += sum[i]/2+1;
     73              }
     74           }
     75            
     76         }else {
     77           if(sum[i] % 2 == 0 )
     78           {
     79               sumek[1] += sum[i]/2;
     80               sumek[2] += sum[i]/2;
     81           }else{
     82              if((tsum+1)%2 == 1)
     83              {
     84                 sumek[1] += sum[i]/2+1;
     85                 sumek[2] += sum[i]/2;
     86              }else{
     87                  sumek[1] += sum[i]/2;
     88                  sumek[2] += sum[i]/2+1;
     89              }
     90           }
     91           sume += sum[i] ; 
     92         }
     93         tsum += sum[i];
     94     }
     95 //    printf("%lld %lld %lld %lld
    ",sumok[1],sumok[2],sumek[1],sumek[2]);
     96     ans = ans - sumo*sume;
     97     LL temp = pike2(sumek[1])+pike2(sumek[2])+pike2(sumok[1]) + pike2(sumok[2])+sumo+sume;
     98     printf("%lld %lld
    ",ans-temp,temp); 
     99 return 0;
    100 }
    View Code

    又看到Bman巨简洁的代码,膜拜一下

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 const int maxn = 1e5 + 10;
     7 char s[maxn];
     8 int a[2][2];
     9 int main()
    10 {
    11     scanf("%s", s);
    12     long long x = 0, y = 0;
    13     for(int i = 0; s[i] != ''; i++)
    14     {
    15         a[i&1][s[i] - 'a']++;
    16         x += a[i&1][s[i] - 'a'];
    17         y += a[(i&1)^1][s[i] - 'a'];
    18     }
    19     cout << y << " " << x;
    20     return 0;
    21 }
    View Code

    E:容斥定理 未解

    没有梦想,何谈远方
  • 相关阅读:
    jqeuery $.ajax 与后台jsone交互
    SpringMVC3.2+JPA使用注解的方式环境搭建
    SpringMVC+JPA使用注入的方式环境搭建
    EasyUI_tree根据数据库数据生成树形结构JSON格式
    ACM竞赛高手比其他程序员水平高很多吗?
    hdu 1028 Ignatius and the Princess III(DP)
    9513 防空洞
    hdu 1398 Square Coins(简单dp)
    FZU 1608 Huge Mission(线段树)
    poj2528 Mayor's posters(线段树之成段更新)
  • 原文地址:https://www.cnblogs.com/zyue/p/3867178.html
Copyright © 2020-2023  润新知