首页 > 其他分享 >Codeforces Round 961 (Div. 2)

Codeforces Round 961 (Div. 2)

时间:2024-07-24 16:39:49浏览次数:12  
标签:961 int ll Codeforces cin while Div sum mod

A. Joey Takes Money

--------------------------题解------------------------------------
选取x和y替换掉a[i],a[j],前提是两者乘积相同,最后要求和数组最大,其实很简单,我们只需要不对另x=1 y=a[j]*a[x]就行,从左到右遍历整个数组队a[i]和a[i+1]进行此操作,就可以得到我们想要的值了。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N];
int main()
{  
    ll t;
    cin>>t;
    while(t--)
    {
        ll n;
        ll sum=0;
        cin>>n;
        for(ll i=1;i<=n;i++)
        {
            cin>>a[i];
                
        }
        for(ll i=1;i<=n-1;i++)
        {
            ll q=a[i]*a[i+1];
            a[i]=1;
            a[i+1]=q;
            sum+=a[i];
        }
        sum+=a[n];
        sum=sum*2022;
        cout<<sum<<'\n';
    }

}

B. Kill Demodogs

-----------------------------------------题解-----------------------------------

这题我们要求i和j乘积的和的最大值,根据中学我们学的基本不等式可以知道当i==j的时候是一定范围内的乘积最大值,因此我们要走的就是对角线我们按照(1,1)(1,2)(2,2)(2,3)....这样的方法的走我们可以得到11+...nn加上12+23+34...(n-1)n。我故意这么写就是为了把这两步分开来计算 要分别求出两个公式来,公式推导过程我就不贴了,请自己去查询两个公式求和公式分别是
n(n+1)(2*n+1)/6

((n-1)n))(n+1)/6

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll qmi(ll a,ll b,ll q)
{
    ll res=1;
    while(b)
    {
        if(b&1)res=res*a%q;
        a=a*a%q;
        b=b/2;
    }
    return res;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        ll sum=0;
        ll q1=(((n*(n+1))%mod)*(2*n+1)%mod)%mod;
        ll q2=((((n-1)*n)%mod)*(n+1)%mod)%mod;
        sum+=q1*qmi(6,mod-2,mod)%mod*2022%mod;
        sum+=q2*qmi(6,mod-2,mod)%mod*2022*2%mod;
        //sum=sum*2022;
        sum=sum%mod;
        //if(sum==999584486)sum=999589541;
        cout<<sum<<'\n';
    }
}



C. Even Subarrays

-----------------------------题解----------------------------
这题用到了一个理论,只有完全平方数的因子个数才是奇数个,其他的全是偶数个。总子数组的个数是(n*n+1)/2个,我们用总子数组的个数减去区间异或和为完全平方数的个数就行了

然后我们用异或前缀和的另a[i]^a[i-1]这样出来的一个新数组 如果我们想求 a[i]a[i+1]....a[j]的值只需要用整个新数组的b[i]^b[j]就好了

这么处理完之后我们对于数组中每个值,我们设一个数为x 如果x^b[i]=jj(完全平方数) 那么jj^b[i]=x,由此可知,我们需要找出所有x就需要对每一个b[i]枚举j*j

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int a[N];
int b[N];

signed main()
{
   int t;
   cin>>t;
   while(t--)
   {
    int n;
    cin>>n;
    b[0]=0;
    int ans=0;
    
    int x=1;
    while(x<=n) x=x<<1;
    
    vector<int> c(x, 0);
    c[0]=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        
        b[i]=a[i]^b[i-1];
    
    for(int j=0;j*j<x;j++)
    {
        ans+=c[(j*j)^b[i]];  
    }
     c[b[i]]++;
   }
   cout<<n*(n+1)/2-ans<<'\n';
}
}

D. Valiant's New Map

d很简单,二分+二位前缀和检验,直接贴代码了,icpc比赛中做过很多了

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3;
int n, m;
int a[N][N];
 
int check(int x){
  vector<vector<int>> g(n + 1, vector<int>(m + 1, 0));
  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
      g[i][j] = (a[i][j] >= x);
  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
      g[i][j] += g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1];
  for(int i = 1; i + x - 1 <= n; i++)
    for(int j = 1; j + x - 1 <= m; j++)
      if(g[i + x - 1][j + x - 1] - g[i + x - 1][j - 1] - g[i - 1][j + x - 1] + g[i - 1][j - 1] == x * x)
        return true;
  return false;
}
 
int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t;
  cin >> t;
  while(t--){
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
      for(int j = 1; j <= m; j++)
        cin >> a[i][j];
    int l = 0, r = n + 1;
    while(l + 1 < r){
      int mid = l + r >> 1;
      if(check(mid)) l = mid;
      else r = mid;
    }
    cout << l << "\n"; 
  }
  return 0;
}

标签:961,int,ll,Codeforces,cin,while,Div,sum,mod
From: https://www.cnblogs.com/qau-marisa3/p/18321225

相关文章

  • Codeforces Round 961 (Div. 2)
    题目链接:CodeforcesRound961(Div.2)总结:B1wa两发可惜,C出得有点小慢。A.Diagonalsfag:贪心Description:给定一个\(n*n\)的棋盘,给定\(k\)个棋子,每个格子只能放一个棋子,求将棋子全部放入棋盘,至少需要占几条对角线。Solution:求最少占用,显然贪心处理,从最长的对角线开始占用,对......
  • Codeforces Round 961 (Div. 2)
    题目链接:CodeforcesRound961(Div.2)总结:B1wa两发可惜,C出得有点小慢。A.Diagonalsfag:贪心Description:给定一个n∗nn*n......
  • Codeforces Round 961 (Div. 2)
    A#include<bits/stdc++.h>usingnamespacestd;inta[200];voidsolve(){intn,k;cin>>n>>k;a[1]=n;for(intj=n-1,i=2;i<=1+(n-1)*2;i+=2,j--){a[i]=a[i+1]=j;}if(!k){cout<<0<<"\n......
  • Codeforces Round 961 (Div. 2) 补题记录(A~D)
    上大分,赢!A考虑将每一条对角线上可以存放的砝码数量都记录一下,从大到小排序,然后直接暴力贪心选择。此时可以发现数量一定形如\(n,n-1,n-1,n-2,n-2,n-3,n-3,\ldots,1,1\)这样的形式。直接暴力减即可。时间复杂度为\(O(n)\)。#include<bits/stdc++.h>#defineintlonglong......
  • Codeforces 1987C
    codeforcesP1987C给定一个n长度的数组,每一步都要遍历整个数组。如果某个元素是末尾元素或是比其后一个元素大,则该元素减去1直到该元素为0,求解总步数,算法复杂度要求\(O(n)\)先给出暴力解法,复杂度\(O(n^2)\): intt=0; do{ for(inti=0;i<n-1;i++){ if(a[i]......
  • C. Divisor Chain
    原题链接题解任何数一定可以被二进制表示下最低位的一及以下的二次方数整除code#include<bits/stdc++.h>#definelllonglong#definelowbit(x)((x)&(-x))usingnamespacestd;voidsolve(){intn;cin>>n;intm=log2(n);intn1=1<<m;vector......
  • Codeforces Round 957 (Div. 3)复盘
    今天打了一下DIV3,专业转了就是不一样T1Onlypluses这道题主要就是理解乘法分配律,最多的绝对是两数相乘数最大的。T2AngryMonkey这道题一遍AC,虽然很简单还是值得鼓励,主要还是数学问题,用笔写下来找到数学规律之后做起来就很快T3GorillaandPermutation这道题还是很简单......
  • Codeforces Round 952 (Div. 4)复盘
    第一次打比赛的总结Q1CreatingWords这道题其实主要考的就是对于输入语句的理解,最开始我想的是运用scanf,puts,一个语句一个语句的去读取,但是确实对各个输入语句的了解过于肤浅了,特别是哪个读不读空格之类的,其实也算是没有把题目看清楚,它的难度其实没有自己以为的那么难,因为是限......
  • Codeforces 2400+ flows 大杂烩
    CF903GYetAnotherMaxflowProblem2700关键点:最大流转最小割显然我们需要用其他方式维护最大流,考虑到最大流等于最小割,于是我们去求最小割。考虑这个图的特性不难发现左边和右边两列都至多割掉一条边,于是我们直接枚举割掉的位置,剩下的左边前缀和右边后缀所有相连的边都要割......
  • Codeforces Round 960 (Div. 2)
    xht真的好强好强,好厉害这场打得有点史,共四发罚时还是抽象了,如果没有xht就真的完了呜呜。不过也说明我是真的菜,还有把做法想出来之后验证不到位。A.SubmissionBait罚时了,15min才过/lh稍微想一下可以知道,对于最大数\(x\),若其出现次数为奇数,那么A是必胜的,反之则只能从更小......