第一次打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 "); 27 else 28 printf("%d ",ans); 29 } 30 }
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 ",ans); 29 } 30 }
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(" "); 60 } 61 }
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 ",ans); 45 } 46 }
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 ",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 ",ans); 78 } 79 } 80 }