• AtCoder Beginner Contest 254【VP记录】


    ABC 略

    D - Together Square

    遇到这种题,没思路,首先想到打表。

    观察发现没啥规律,然后看差值。

     可发现:当N 本身为平方数时,与前一项的差值分别为【1,3,5,7...】 ,很明显可以观察到是一个等差为 2 的等差数列。

    当 N 不是平方数时,与前一项的差值实质上是 N 的最大平方数因子对应的贡献。如 8 的最大平方数因子为  ,而 4  的贡献对应是等差数列的贡献也就是 3 。

    找到规律,递推到 n ,我们就可以算出答案了。

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define sc(x) scanf("%d",&x)
    4. #define sl(x) scanf("%lld",&x)
    5. #define ll long long
    6. #define pb push_back
    7. const int Max=2e5+5;
    8. int vis[Max];
    9. int mp[Max];
    10. int cnt=0;
    11. void init(ll n){
    12. int sum=1;
    13. for(int i=1;i<=n;i++){
    14. ll num=sqrt(i);
    15. if(num*num==i){
    16. vis[cnt++]=i,mp[i]=sum,sum+=2;
    17. }
    18. }
    19. }
    20. int main(){
    21. int n;sc(n);
    22. init(n);
    23. ll ans=0;
    24. for(int i=1;i<=n;i++){
    25. for(int j=cnt-1;j>=0;j--){
    26. if(i%vis[j]==0&&mp[vis[j]]){
    27. // cout<<j/i<<' '<<mp[j/i]<<endl;
    28. ans+=mp[vis[j]];break;
    29. }
    30. }
    31. }
    32. cout<<ans<<endl;
    33. }

    E - Small d and k

            E题很容易发现,每个点的度数至多为3,故可在查询之前直接将所有结点的结果预处理,用BFS或者DFS暴力枚举即可,每个点最多也就是操作10次,时间复杂度允许。下面时BFS的代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define sc(x) scanf("%d",&x)
    4. #define sl(x) scanf("%lld",&x)
    5. #define ll long long
    6. #define pb push_back
    7. const int Max=2e5+5;
    8. vector<int>mp[Max];
    9. bool vis[Max];
    10. int low[Max];
    11. ll sum[Max][4];
    12. vector<int>ve;
    13. void bfs(int fa){
    14. ve.pb(fa);
    15. vis[fa]=true;
    16. sum[fa][0]=fa;
    17. low[fa]=0;
    18. queue<int>q;
    19. int start,next;
    20. start=fa;
    21. q.push(fa);
    22. while(!q.empty()){
    23. start=q.front();
    24. q.pop();
    25. for(auto v:mp[start]){
    26. if(low[start]+1>3||vis[v]) continue;
    27. ve.pb(v);
    28. vis[v]=true;
    29. sum[fa][low[start]+1]+=v;
    30. low[v]=low[start]+1;
    31. q.push(v);
    32. }
    33. }
    34. }
    35. int main(){
    36. int n;sc(n);int m;sc(m);
    37. for(int i=0;i<=n;i++) low[i]=1e9+5;
    38. for(int i=1;i<=m;i++){
    39. int u,v;
    40. sc(u);sc(v);
    41. mp[u].pb(v);
    42. mp[v].pb(u);
    43. }
    44. // bfs(2);
    45. for(int i=1;i<=n;i++){
    46. for(auto v:ve) vis[v]=false;
    47. ve.clear();
    48. bfs(i);
    49. }
    50. int q;sc(q);
    51. while(q--){
    52. int x,k;
    53. sc(x);sc(k);
    54. ll ans=0;
    55. for(int i=0;i<=k;i++) ans+=sum[x][i];
    56. printf("%lld\n",ans);
    57. }
    58. }

    F - Rectangle GCD

    做这题需要预备一个知识。

    gcd(a1,a2,a3,a4,a5...an) = gcd(a1,a2-a1,a3-a2,a4-a3...an-an-1)

     

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define sc(x) scanf("%d",&x)
    4. #define sl(x) scanf("%lld",&x)
    5. #define ll long long
    6. #define pb push_back
    7. const int Max=2e6+5;
    8. const int mod=1e9+7;
    9. ll tree[Max];
    10. ll suma[Max],sumb[Max];
    11. ll a[Max],b[Max];
    12. void build(int node,int l,int r){
    13. // if(l>r) return ;
    14. // cout<<l<<' '<<r<<endl;
    15. if(l==r){
    16. // cout<<suma[l]<<"---\n";
    17. tree[node]=suma[l];return ;
    18. }
    19. int mid=(l+r)>>1;
    20. build(node*2,l,mid);
    21. build(node*2+1,mid+1,r);
    22. tree[node]=__gcd(tree[node*2],tree[node*2+1]);
    23. return;
    24. }
    25. ll query(int node,int l,int r,int left,int right){
    26. ll ret;
    27. if(l>=left&&r<=right) ret=tree[node];
    28. else{
    29. int mid=(l+r)>>1;
    30. if(right<=mid) ret=query(node*2,l,mid,left,right);
    31. else if(left>mid) ret=query(node*2+1,mid+1,r,left,right);
    32. else {
    33. ret=query(node*2,l,mid,left,right);
    34. ret=__gcd(ret,query(node*2+1,mid+1,r,left,right));
    35. }
    36. }
    37. return ret;
    38. }
    39. ll treeb[Max];
    40. void build_b(int node,int l,int r){
    41. // if(l>r) return ;
    42. // cout<<l<<' '<<r<<endl;
    43. if(l==r){
    44. // cout<<suma[l]<<"---\n";
    45. treeb[node]=sumb[l];return ;
    46. }
    47. int mid=(l+r)>>1;
    48. build_b(node*2,l,mid);
    49. build_b(node*2+1,mid+1,r);
    50. treeb[node]=__gcd(treeb[node*2],treeb[node*2+1]);
    51. return;
    52. }
    53. ll query_b(int node,int l,int r,int left,int right){
    54. ll ret;
    55. if(l>=left&&r<=right) ret=treeb[node];
    56. else{
    57. int mid=(l+r)>>1;
    58. if(right<=mid) ret=query_b(node*2,l,mid,left,right);
    59. else if(left>mid) ret=query_b(node*2+1,mid+1,r,left,right);
    60. else {
    61. ret=query_b(node*2,l,mid,left,right);
    62. ret=__gcd(ret,query_b(node*2+1,mid+1,r,left,right));
    63. }
    64. }
    65. return ret;
    66. }
    67. int main(){
    68. int n;sc(n);int q;sc(q);
    69. for(int i=1;i<=n;i++){
    70. sl(a[i]);
    71. if(i!=1) suma[i-1]=a[i]-a[i-1];
    72. }
    73. if(n!=1) build(1,1,n-1);
    74. for(int i=1;i<=n;i++){
    75. sl(b[i]);
    76. if(i!=1) sumb[i-1]=b[i]-b[i-1];
    77. }
    78. if(n!=1) build_b(1,1,n-1);
    79. while(q--){
    80. int h1,h2,w1,w2;
    81. sc(h1);sc(h2);sc(w1);sc(w2);
    82. ll ret=a[h1]+b[w1];
    83. if(h1!=h2) ret=__gcd(ret,query(1,1,n-1,h1,h2-1));
    84. if(w1!=w2) ret=__gcd(ret,query_b(1,1,n-1,w1,w2-1));
    85. printf("%lld\n",abs(ret));
    86. }
    87. }
    88. /*
    89. 1
    90. 3
    91. 3 3 1
    92. */

     Ex - Multiply or Divide by 2

     

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define sc(x) scanf("%d",&x)
    4. #define sl(x) scanf("%lld",&x)
    5. #define ll long long
    6. #define pb push_back
    7. const int Max=2e5+5;
    8. const int Mod=998244353;
    9. int main(){
    10. int n;sc(n);
    11. priority_queue<int>qa,qb;
    12. for(int i=1;i<=n;i++){
    13. int k;sc(k);
    14. qa.push(k);
    15. }
    16. for(int i=1;i<=n;i++){
    17. int k;sc(k);
    18. qb.push(k);
    19. }
    20. ll ans=0;
    21. bool flag=true;
    22. while(!qa.empty()){
    23. int nx=qa.top();
    24. int ny=qb.top();
    25. qa.pop(),qb.pop();
    26. if(nx==ny) ;
    27. else if(nx>ny) ans++,qa.push(nx/2),qb.push(ny);
    28. else{
    29. if(ny%2==1){
    30. flag=false;break;
    31. }else ans++,qa.push(nx),qb.push(ny/2);
    32. }
    33. }
    34. if(!flag) printf("-1\n");
    35. else printf("%lld\n",ans);
    36. }

    D,F,EX题解引用于:AtCoder Beginner Contest 254 A-Ex - 知乎 (zhihu.com)

  • 相关阅读:
    J9数字论:以太坊合并?以太坊合并又会带来哪些影响?
    Spring MVC注解Controller源码流程解析---请求匹配中的容错处理
    持续集成部署-k8s-配置与存储-配置管理:ConfigMap 的热更新
    随机过程:布朗运动
    16、架构-可观测性-事件日志详细解析
    Linux:环境变量
    B站付费视频使up主掉粉过万
    DBeaver报错:can‘t load driver class ‘com.mysql.cj.jdbc.Driver‘
    信奥中的数学:整除
    ORA-27102: out of memory
  • 原文地址:https://blog.csdn.net/weixin_53745698/article/details/125621933