Educational Codeforces Round 53 (Rated for Div. 2)

http://codeforces.com/contest/1073

A. Diverse Substring

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define minv 1e-6
 5 #define inf 1e9
 6 #define pi 3.1415926536
 7 #define nl 2.7182818284
 8 const ll mod=1e9+7;//998244353
 9 const int maxn=1e3+10;
10 
11 char s[maxn];
12 
13 int main()
14 {
15     int n,i;
16     scanf("%d",&n);
17     scanf("%s",s);
18     for (i=0;i<=n-2;i++)
19         if (s[i]!=s[i+1])
20             break;
21     if (i==n-1)
22         printf("NO");
23     else
24     {
25         printf("YES
");
26         printf("%c%c",s[i],s[i+1]);
27     }
28     return 0;
29 }

B. Vasya and Books

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int maxn=2e5+10;
 5 
 6 int f[maxn];
 7 
 8 int main()
 9 {
10     int n,a,v=0,i;
11     scanf("%d",&n);
12     for (i=1;i<=n;i++)
13     {
14         scanf("%d",&a);
15         f[a]=i;
16     }
17     for (i=1;i<=n;i++)
18     {
19         scanf("%d",&a);
20         if (i!=1)
21             printf(" ");
22         if (f[a]<v)
23             printf("0");
24         else
25             printf("%d",f[a]-v);
26         v=max(f[a],v);
27     }
28     return 0;
29 }

C. Vasya and Robot

奇偶,负数取模

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=2e5+10;
 5 const ll inf=1e9;
 6 
 7 int px[maxn],py[maxn];
 8 
 9 int main()
10 {
11     char c;
12     int n,x,y,ax,ay,i,l,r,m,re;
13     scanf("%d
",&n);
14     for (i=1;i<=n;i++)
15     {
16         scanf("%c",&c);
17         if (c=='U')
18             x=0,y=1;
19         else if (c=='D')
20             x=0,y=-1;
21         else if (c=='L')
22             x=-1,y=0;
23         else
24             x=1,y=0;
25         px[i]=px[i-1]+x;
26         py[i]=py[i-1]+y;
27     }
28     scanf("%d%d",&ax,&ay);
29     if (px[n]==ax && py[n]==ay)
30     {
31         printf("0");
32         return 0;
33     }
34     if (abs(ax+ay+n)%2==1)
35     {
36         printf("-1");
37         return 0;
38     }
39     re=inf;
40     for (i=1;i<=n;i++)
41     {
42         l=i;
43         r=n;
44         while (l<=r)
45         {
46             m=(l+r)>>1;
47             ///change [i,m] ; use [1,i-1] [m+1,n]
48             if (m-i+1>=abs(px[i-1]+px[n]-px[m]-ax)+abs(py[i-1]+py[n]-py[m]-ay))
49                 r=m-1;
50             else
51                 l=m+1;
52         }
53         if (l!=n+1)
54             re=min(re,l-i+1);
55     }
56     if (re==inf)
57         re=-1;
58     printf("%d",re);
59     return 0;
60 }

D. Berland Fair

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=2e5+10;
 5 
 6 int nex[maxn],a[maxn];
 7 
 8 int main()
 9 {
10     int n,i,j,g;
11     ll m,tot=0,num=0;
12     scanf("%d%lld",&n,&m);
13 
14     for (i=0;i<n;i++)
15         scanf("%d",&a[i]),tot+=a[i];
16     for (i=0;i<n;i++)
17         nex[i]=(i+1)%n;
18     g=n;
19     i=0;
20     j=n-1;
21     while (nex[i]!=i)
22     {
23         num+=m/tot*g;
24         m%=tot;
25         while (nex[i]!=i)
26         {
27             if (a[i]<=m)
28             {
29                 m-=a[i];
30                 num++;
31                 j=i;
32             }
33             else
34             {
35                 nex[j]=nex[i];
36                 tot-=a[i];
37                 g--;
38             }
39             i=nex[i];
40             if (m>=tot)
41                 break;
42         }
43     }
44     num+=m/a[i];
45     cout<<num;
46     return 0;
47 }
48 /*
49 1 100
50 1
51 
52 3 1000
53 1 2 100
54 */

E. Segment Sum

代码是错的,以待后续埋坑

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const ll mod=998244353;
 5 const double minv=1e-10;
 6 
 7 ll sum=0,shi[20],k,f[20][20];
 8 
 9 void work(ll a,int w,int g,int hav,ll num,int ori,int cond)
10 {
11     int s,gg,i,j,c;
12     if (a==0)
13         return;
14     s=a/shi[w];
15     for (i=0;i<=s;i++)
16     {
17         gg=g-(!((hav>>i) & 1) && (!(i==0 && ori==1)));
18         if (gg>=0)
19         {
20             if (i<s)
21             {
22                 /**
23                 这一位选的是i,
24                 除去这一位,还有w位,
25                 从gg个数中选j个数作为需要添加的数(之前没出现过的),
26                 每一位都有k-gg+j种选择
27                 **/
28                 f[0][0]=1;
29                 for (j=1;j<=w;j++)
30                 {
31                     f[j][0]=f[j-1][0]*(k-gg)%mod;
32                     ///already k-gg numbers
33                     sum=(sum+f[j-1][0]* sum of k-gg numbers )%mod;
34 
35 
36                     for (c=1;c<=min(gg,j);c++)
37 
38                             sum=(sum+f[j-1][c]* k-gg+c numbers + f[j-1][c-1]* any number(random average of gg numbers))
39 
40 
41                         f[j][c]=(f[j-1][c]*(k-gg+c)+f[j-1][c-1]*(10-(k-gg+c-1)))%mod;
42                 }
43                 for (c=0;c<=min(gg,w);c++)
44                     sum=(sum+f[w][c]*cond)%mod;
45 
46 
47                 ///geshu
48 //                f[0][0]=1;
49 //                for (j=1;j<=w;j++)
50 //                {
51 //                    f[j][0]=f[j-1][0]*(k-gg)%mod;
52 //                    for (c=1;c<=min(gg,j);c++)
53 //                        f[j][c]=(f[j-1][c]*(k-gg+c)+f[j-1][c-1]*(10-(k-gg+c-1)))%mod;
54 //                }
55 //                for (c=0;c<=min(gg,w);c++)
56 //                    sum=(sum+f[w][c]*cond)%mod;
57             }
58             else
59                 work(a%shi[w],w-1,gg,hav|(1<<i),ori&(i==0),cond);
60         }
61     }
62 }
63 
64 int main()
65 {
66     ll l,r;
67     int i,w;
68     scanf("%lld%lld%d",&l,&r,&k);
69     shi[0]=1;
70     for (i=1;i<=18;i++)
71         shi[i]=shi[i-1]*10;
72 
73     w=log(r+minv)/log(10);
74     work(r,w,k,0,0,1,1);
75     if (l!=1)
76     {
77         w=log(l-1+minv)/log(10);///l=1???
78         work(l-1,w,k,0,0,1,-1);
79     }
80     printf("%lld",(sum+mod)%mod);
81     return 0;
82 }
原文地址:https://www.cnblogs.com/cmyg/p/9887196.html