当前位置:   article > 正文

Codeforces Round #291 (Div. 2) 解题报告 (A B C D)_codeforces round 921 (div. 2)

codeforces round 921 (div. 2)

Chewbaсca and Number

        贪心,每一位取t和9-t中较小的。注意首位不能为0。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4. #include <map>
  5. #include <vector>
  6. #include <stack>
  7. #include <queue>
  8. #include <string.h>
  9. #include <algorithm>
  10. #include <math.h>
  11. using namespace std;
  12. char num[22];
  13. int main(){
  14. scanf("%s",num);
  15. int len=strlen(num);
  16. for(int i=0;i<len;i++){
  17. int t=num[i]-'0';
  18. t=min(t,9-t);
  19. if(i==0&&t==0)t=9;
  20. printf("%d",t);
  21. }
  22. return 0;
  23. }

Han Solo and Lazer Gun

        首先,把x0,y0平移到原点。然后所有的x和y也跟着平移。判断的时候,暴力扫一遍,如果两个点的交叉乘积相等,它们的连线肯定过原点。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4. #include <map>
  5. #include <vector>
  6. #include <stack>
  7. #include <queue>
  8. #include <string.h>
  9. #include <algorithm>
  10. #include <math.h>
  11. using namespace std;
  12. int x[1010];
  13. int y[1010];
  14. bool flag[1010];
  15. int main(){
  16. int n;
  17. cin>>n>>x[0]>>y[0];
  18. for(int i=1;i<=n;i++){
  19. cin>>x[i]>>y[i];
  20. x[i]-=x[0];
  21. y[i]-=y[0];
  22. }
  23. int ans=0;
  24. for(int i=1;i<=n;i++){
  25. if(flag[i])continue;
  26. ans++;
  27. flag[i]=1;
  28. for(int j=i+1;j<=n;j++){
  29. if(x[i]*y[j]==x[j]*y[i])flag[j]=1;
  30. }
  31. }
  32. cout<<ans<<endl;
  33. return 0;
  34. }

Watto and Mechanism

        在字典树上dfs。因为整个串只会出现abc三种字符,所以在每个节点,尝试沿着三条不同的路径往下走,注意和原串不同的路径只能走一次且必须走一次。详见代码注释。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4. #include <map>
  5. #include <vector>
  6. #include <stack>
  7. #include <queue>
  8. #include <string.h>
  9. #include <algorithm>
  10. #include <math.h>
  11. using namespace std;
  12. struct node{
  13. int next[3];
  14. bool flag; //flag=1表示是串结尾
  15. }Trie[600010];
  16. char tmp[600010];
  17. //k为串的位置,index为字典树中节点位置
  18. bool dfs(int k,int index,bool diff){
  19. if(k!=0&&index==0)return 0; //找不到
  20. if(tmp[k]=='\0'){ //串的结尾
  21. if(Trie[index].flag&&diff) return 1; //字典树中也遇到结尾,且恰有一个字符不同
  22. else return 0;
  23. }
  24. bool f=Trie[index].flag;
  25. for(int i=0;i<3;i++){
  26. if(i+'a'==tmp[k]){ //与串的字符相同
  27. if(dfs(k+1,Trie[index].next[i],diff))return 1;
  28. }else{
  29. if(!diff){ //与串的字符不同,若之前没出现过不同,则可以继续搜索
  30. if(dfs(k+1,Trie[index].next[i],1))return 1;
  31. }
  32. }
  33. }
  34. return 0;
  35. }
  36. int main(){
  37. int n,m;
  38. cin>>n>>m;
  39. int pos=0;
  40. for(int i=1;i<=n;i++){
  41. scanf("%s",tmp);
  42. int len=strlen(tmp);
  43. int cur=0;
  44. for(int j=0;j<len;j++){
  45. int next=Trie[cur].next[tmp[j]-'a'];
  46. if(next==0){
  47. next=++pos;
  48. Trie[cur].next[tmp[j]-'a']=next;
  49. }
  50. if(j==len-1){
  51. Trie[next].flag=1;
  52. }
  53. cur=next;
  54. }
  55. }
  56. for(int i=1;i<=m;i++){
  57. scanf("%s",tmp);
  58. if(dfs(0,0,0)){
  59. printf("YES\n");
  60. }else{
  61. printf("NO\n");
  62. }
  63. }
  64. return 0;
  65. }

R2D2 and Droid Army

        注意到m非常小,我们可以用two pointers+spare table来解决。我们对每个特性都开一个spare table,就可以迅速查询该特性区间内的最大值。然后用two pointers扫一遍解决。

  two pointers扫一遍解决。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4. #include <map>
  5. #include <vector>
  6. #include <stack>
  7. #include <queue>
  8. #include <string.h>
  9. #include <algorithm>
  10. #include <math.h>
  11. using namespace std;
  12. const int maxn=100010;
  13. int a[5][maxn][18];
  14. int pow2n[18];
  15. int ans[5];
  16. int tmp[5];
  17. int query_max(int mec,int l,int r){
  18. int d=r-l+1;
  19. int k=-1;
  20. while(d){
  21. k++;
  22. d>>=1;
  23. }
  24. return max(a[mec][l][k],a[mec][r-(1<<k)+1][k]);
  25. }
  26. int main(){
  27. pow2n[0]=1;
  28. for(int i=1;i<18;i++)pow2n[i]=pow2n[i-1]<<1;
  29. int n,m,k;
  30. cin>>n>>m>>k;
  31. for(int i=1;i<=n;i++){
  32. for(int j=0;j<m;j++){
  33. scanf("%d",&a[j][i][0]);
  34. }
  35. }
  36. for(int i=0;i<m;i++){
  37. for(int j=1;pow2n[j]<=n;j++){
  38. for(int k=1;k+pow2n[j-1]<=n;k++){
  39. a[i][k][j]=max(a[i][k][j-1],a[i][k+pow2n[j-1]][j-1]);
  40. }
  41. }
  42. }
  43. int L=1;
  44. int R=1;
  45. int MAX=0;
  46. while(R<=n){
  47. int sum=0;
  48. for(int i=0;i<m;i++){
  49. tmp[i]=query_max(i,L,R);
  50. sum+=tmp[i];
  51. }
  52. if(sum>k){
  53. L++;
  54. if(R<L)R++;
  55. }else{
  56. if(R-L+1>MAX){
  57. MAX=R-L+1;
  58. memcpy(ans,tmp,sizeof(ans));
  59. }
  60. R++;
  61. }
  62. }
  63. for(int i=0;i<m;i++){
  64. printf("%d ",ans[i]);
  65. }
  66. return 0;
  67. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55131
推荐阅读
相关标签
  

闽ICP备14008679号