codechef cook 103 div2

第一次打codechef。。。不太会用这oj。

A:

 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 inline int read() {
 6     int X=0,w=1; char c=getchar();
 7     while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
 8     while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
 9     return X*w;
10 }
11 typedef long long ll;
12 const int N = 1e5+5;
13 int t,n,b,p,w,h;
14 int main(){
15     t=read();
16     while (t--){
17         int ans=-1;
18         n=read();b=read();
19         while (n--){
20             w=read();h=read();p=read();
21             if(p<=b){
22                 ans=max(ans,w*h);
23             }
24         }
25         if(ans==-1)
26             printf("no tablet\n");
27         else
28             printf("%d\n",ans);
29     }
30 }
View Code

B:

 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 inline int read() {
 6     int X=0,w=1; char c=getchar();
 7     while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
 8     while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
 9     return X*w;
10 }
11 typedef long long ll;
12 const int N = 1e5+5;
13 int t,n,a[N];
14 int main(){
15     t=read();
16     while (t--){
17         n=read();
18         for(int i=1;i<=n;i++)a[i]=read();
19         sort(a+1,a+1+n);
20         int ans=0;
21         for(int i=1;i<=n;i++){
22             if(ans<a[i])
23                 break;
24             else{
25                 ans++;
26             }
27         }
28         printf("%d\n",ans);
29     }
30 }
View Code

C:找一个字符串的前缀,使得这个前缀在字符串里出现次数最多,如果一样多,找最长的前缀,怎么找哇。|S|<=1e6,只包含小写字母

做法很多,说说我的。 首先首字母确定了,最多的出现次数也确定了,保存每个首字母的后继首字母,二分长度。

 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 inline int read() {
 6     int X=0,w=1; char c=getchar();
 7     while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
 8     while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
 9     return X*w;
10 }
11 typedef long long ll;
12 const int N = 1e5+5;
13 int t,n;
14 char s[N];
15 int nxt[N];
16 int check(int len){
17     int tmp=1;
18     int st=0;
19     while (st<len)
20         st=nxt[st];
21     for(;st<n;st=nxt[st]){
22         bool f=1;
23         for(int i=0;i<len;i++){
24             if(s[st+i]!=s[i]){
25                 f=0;
26                 break;
27             }
28         }
29         if(f) tmp++;
30     }
31     return tmp;
32 }
33 int main() {
34     t = read();
35     while (t--) {
36         memset(nxt,0, sizeof(nxt));
37         n=read();scanf("%s",&s);
38         int mx=0;
39         int pre=0;
40         for (int i=0;i<n;i++){
41             if(s[i]==s[0]){
42                 mx++;
43                 nxt[pre]=i;
44                 pre=i;
45             }
46         }
47         nxt[pre]=n;
48         int l=1,r=n;
49         while (l<=r){
50             int mid=l+r>>1;
51             if(check(mid)==mx){
52                 l=mid+1;
53             } else{
54                 r=mid-1;
55             }
56         }
57         for(int i=0;i<r;i++)
58             printf("%c",s[i]);
59         printf("\n");
60     }
61 }
View Code

D:感觉比C简单多了。。。怎么印度友人也不太擅长这种沙比题啊。

就求个前缀,然后枚举删掉的是哪一步操作。。。就没了啊。。。

 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 inline int read() {
 6     int X=0,w=1; char c=getchar();
 7     while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
 8     while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
 9     return X*w;
10 }
11 typedef long long ll;
12 const int N = 1e5+5;
13 const int M = 1e5;
14 int t,n,k,l[N],r[N];
15 int pre[N],a1[N],a2[N];
16 int main(){
17     t=read();
18     while (t--){
19         n=read();
20         k=read();
21         memset(pre,0, sizeof(pre));
22         memset(a1,0, sizeof(a1));
23         memset(a2,0, sizeof(a2));
24         for(int i=1;i<=n;i++){
25             l[i]=read();r[i]=read();
26             pre[l[i]]++;
27             pre[r[i]+1]--;
28         }
29         for(int i=1;i<=M;i++){
30             pre[i]+=pre[i-1];
31             if(pre[i]==k)
32                 a1[i]++;
33             if(pre[i]==k+1)
34                 a2[i]++;
35         }
36         for(int i=1;i<=M;i++){
37             a1[i]+=a1[i-1];
38             a2[i]+=a2[i-1];
39         }
40         int ans=0;
41         for(int i=1;i<=n;i++){
42             ans=max(ans,a1[M]-a1[r[i]]+a1[l[i]-1]+a2[r[i]]-a2[l[i]-1]);
43         }
44         printf("%d\n",ans);
45     }
46 }
View Code

E:原根+一些神奇的战法,没做出来。

首先判f是不是0

非零的话求原根然后求出来每个数是原根的几次幂,

这个时候可以dp,但是我不会。

也可以不dp,我也不会。

就是我们随便选一个可以留下的数,那么这个数和他的倍数们都可以留下。然后更新ans。

代码抄别人的。我也看不懂。  我正在努力试图看懂。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 inline int read() {
 4     int X=0,w=1; char c=getchar();
 5     while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
 6     while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
 7     return X*w;
 8 }
 9 typedef long long ll;
10 int mod;
11 int qpow(int a,int x){
12     int res=1;
13     while (x){
14         if(x&1)
15             res=1ll*res*a%mod;
16         a=1ll*a*a%mod;
17         x/=2;
18     }
19     return res;
20 }
21 const int N = 1e5+5;
22 int t,n,f,p[N],st[N<<1];
23 vector<int> v;//
24 int root(){
25     v.clear();
26     int tmp=mod-1;
27     for(int i=2;i*i<=tmp;i++){
28         if(tmp%i==0){
29             v.push_back(i);
30             while (tmp%i==0)
31                 tmp/=i;
32         }
33     }
34     if(tmp!=1)v.push_back(tmp);
35     for(int i=2;i<=mod-1;i++){
36         bool f=1;
37         for(auto c:v) {
38             if (qpow(i, (mod - 1) / c) == 1) {
39                 f=0;
40                 break;
41             }
42         }
43         if(f)
44             return i;
45     }
46     return -1;
47 }
48 int main(){
49     t=read();
50     while (t--){
51         n=read();
52         mod=read();
53         f=read();
54         for(int i=1;i<=n;i++)
55             p[i]=read();
56         if(f==0){
57             int ans=0;
58             for(int i=1;i<=n;i++)
59                 ans+=(p[i]==0);
60             printf("%d\n",ans);
61         } else{
62             int g=root();
63             for(int i=0,cur=1;i<mod-1;i++,cur=cur*g%mod){
64                 st[cur]=i;
65             }
66             int ans=n;
67             for(int i=2;i<=mod-1;i++){
68                 if(st[f]%i==0)continue;
69                 if((mod-1)%i)continue;
70                 int tmp=0;
71                 for(int j=1;j<=n;j++){
72                     if(p[j]==0||st[p[j]]%i==0)continue;
73                     tmp++;
74                 }
75                 ans=min(ans,tmp);
76             }
77             printf("%d\n",ans);
78         }
79     }
80 }
View Code

 

posted @ 2019-02-18 11:46  MXang  阅读(135)  评论(0编辑  收藏  举报