首页 > 其他分享 >Codeforces round 919 (div2)

Codeforces round 919 (div2)

时间:2024-01-24 22:01:24浏览次数:30  
标签:int Codeforces long 因数 919 mod div2 equiv

Problem - A - Codeforces

暴力枚举 就可以;

#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int>a;
int n;
signed main()
{
    int _;
    cin >> _;
    while(_ --)
    {
        a.clear();
        cin >> n;
        int p = 1 , q = 1e9;
        
        while(n --)
        {
            int x , k;
            cin >> x >> k;
            
            if(x == 1) p = max(p , k);
            else if(x == 2) q = min(q , k);
            else a.push_back(k);
        }
        int num = 0;
        for(int i = 0 ; i < a.size() ; i ++)
            if(a[i] <= q && a[i] >= p) num ++;
        if(q < p) cout << 0 << endl;
        else cout << q - p + 1 - num << endl;

    }
    
    return 0;
}

Problem - B - Codeforces

对于这道题,因为鲍勃需要将数组总和变得最小,所以他一定会用尽每次数次将最大的数几个数乘上-1,而爱丽丝需要将数组的总和变得最大,所以他可以进行删除操作,来防止 鲍勃将大数乘上-1从而使数组总和变小,所以我们可以使用前缀的方法,来进行判断;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
#define int long long
int a[N];
int p[N];

void solve()
{
    int n , k , x;
    cin >> n >> k >> x;

    for(int i = 1 ; i <= n ; i ++)  cin >> a[i];
    
    sort(a + 1 , a + 1 + n); //进行排序;
    
    for(int i = 1; i <= n ; i ++) p[i] = p[i - 1] + a[i];
    
    int res = -2e9;
    
    for(int i = 0 ; i <= k ; i ++) //枚举所删的个数
    {
        res = max(res , p[max(n - i - x ,(LL)0)] - (p[n - i] - p[max(n - x - i, (LL)0)]));
    }
    cout << res << endl;
}

signed main()
{
    int _;
    cin >> _;
    
    while(_ --)
    {
        solve();
    }
    
    return 0;
}

Problem - C - Codeforces

​ 这一题,用到数学的知识,我们发现 每一段 必须均匀分割,那么也就是说 这个分割的长度k必须是数组长度n的因数;这是第一;然后我们需要 让每一段的数 对k取模之后 与 后一段 的同一位置的数 对k取模之后的余数 要想等,也就是说

\[\{x_1+...+x_{k}\} \ + \ \{x_{k + 1}+...+x_{2k}\}\ + \ \{x_{n-k + 1} + ...+x_{n}\} \]

按照上面所说就是要保证

\[x_1\ \equiv\ x_{k+1}\ (mod\ k) \]

\[x_2\ \equiv\ x_{k+2}\ (mod\ k) \]

\[x_k\ \equiv\ x_{2k}\ (mod\ k) \]

这只是拿两段来举例,对于每一段来说 都是这样,让每一段相同位置的数取模k余数相同

根据这个同余公式移向,我们可以得出:$ |x-x_{k+1}|\equiv 0 \ (mod\ k) $

如果k是|x_1-x_{k+1}|的因数, 那么x和x_{k+1}一定同余k\

所以当k为|x_1-x_{k+1}|的因数时,可以满足这个式子,若k又是|x_2-x_{k+2}|的因数,就满足上面 两个式子\

所以如果 k是 \(|x_1−x_{1+k}| , |x_2−x_{2+k}| ,..., |x_{n-k}−x_{n}|\)的因数,则满足所有条件:

所以k就为\(gcd(x_1−x_{1+k} , |x_2−x_{2+k}| ,..., |x_{n-k}−x_{n}|)\)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
#define int long long
int a[N];
int n;

void init()
{
    for(int i = 1 ; i <= n ; i ++) a[i] = 0;
}

void solve()
{
    
    int n;
    cin >> n;
    
    init();
    
    int ans = 0;
    
    for(int i = 1 ; i <= n ; i ++) cin >> a[i];
    
    for(int k = 1 ; k <= n ; k ++) //枚举因数
    {
        if(n % k != 0) continue;
        else //如果可以被n整除
        {
            int res = 0;
            for(int i = 1 ; i + k <= n ; i ++)//从x1开始枚举一直枚举到第x_n-k
            {
                res = __gcd(res , abs(a[i + k] - a[i])); //公约数;
            }

            if(res != 1) ans ++;//找到公约数,如果不是1的话就会得分
        }
    }
    
    cout << ans << endl;
}

signed main()
{
    int _;
    cin >> _;
    
    while(_ --)
    {
        solve();
    }
    
    return 0;
}

标签:int,Codeforces,long,因数,919,mod,div2,equiv
From: https://www.cnblogs.com/volapex-lord/p/17985954

相关文章

  • hey_left 15 Codeforces Round 835 (Div. 4)
    题目链接A.总和-最小值-最大值即为中间数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){inta,b,c;cin>>a>>b>>c;cout<<a+b+c-min({a,b,c})-max({a,b,c})<<'\n';}signedmain(){io......
  • Codeforces Round 170 (Div. 1)A. Learning Languages并查集
    如果两个人会的语言中有共同语言那么他们之间就可以交流,并且如果a和b可以交流,b和c可以交流,那么a和c也可以交流,具有传递性,就容易联想到并查集,我们将人和语言看成元素,一个人会几种语言的话,就将这些语言和这个人所在的集合合并,最后求一下人一共在几个连通块中,连通块的个数-1就是答案,......
  • CodeForces 1010F Tree
    洛谷传送门CF传送门educational的。另一道类似的题是[ABC269Ex]Antichain(但是我还没写)。考虑令\(b_u=a_u-\sum\limits_{v\inson_u}a_v\)。那么\(\sum\limits_{i=1}^nb_i=a_1=x\),且\(\foralli\in[1,n],b_i\ge0\)。所以最后连通块内有\(y\)个点,那......
  • hey_left 14 Codeforces Round 849 (Div. 4) 续
    题目链接F.区间修改,单点查询,考虑用树状数组可以维护每个点需要操作的次数然后直接对询问的点进行操作#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;#defineintlonglongstructTreeArray{vector<int>tree;TreeArray(intn){......
  • hey_left 13 Codeforces Round 849 (Div. 4)
    题目链接A.可用map标记这几个字符,判在不在即可#include<bits/stdc++.h>usingnamespacestd;strings="codeforces";map<char,bool>mp;voidsolve(){charc;cin>>c;if(mp[c]){cout<<"YES"<<'\n';......
  • Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)
    题意简述有一个以\(1\)为根的有根树,每个点有权值\(v_i\)。你需要选出一个点集\(S\),使得点集里任意两个元素\(x,y\),若\(x\)在原树上是\(y\)的祖先,则要满足\(v_x>v_y\)。求选出的点集的最大大小是多少。解法原题限制相当于:在选出的点集构成的新树\(T\)中,每个点到根节......
  • CodeForces 1609G A Stroll Around the Matrix
    洛谷传送门CF传送门我独立做出一道*3000?考虑对于单次询问,除了\(O(nm)\)的dp,有没有什么方法能快速算出答案。发现若\(a_{i+1}-a_i<b_{j+1}-b_j\)则\(i\getsi+1\),否则\(j\getsj+1\)是最优的。这个贪心的证明不难,考虑当前新走到某一行或某一列的贡献......
  • CodeForces 1609F Interesting Sections
    洛谷传送门CF传送门看到\(\max,\min\)考虑单调栈。枚举右端点,计算有多少个符合条件的左端点。单调栈维护的是对于每个右端点,以每个点为左端点的后缀\(\max,\min\)形成的极长的段。先枚举\(\text{popcount}=k\),然后如果一个段的\(\max\)的\(\text{popcount}=k\)......
  • (区间覆盖问题)P5019 [NOIP2018 提高组] 铺设道路和Educational Codeforces Round 158 (
    区间覆盖问题这里EducationalCodeforcesRound158(RatedforDiv.2)b题和[NOIP2018提高组]铺设道路两道典型题目,本质是相同的。这里由于题目多次出现,特此记录。解题思路:首先我们得对区间做划分,那么划分思路可以是从小到大也可以是从大到小的异常点来做划分(我这是由大到......
  • hey_left 12 Codeforces Round 859 (Div. 4) 续
    F.模拟题,不难只是比较繁琐,需要分情况讨论debug:如何判断永远走不到终点格?原思路是这个点同时这个点指向的方向被经过了,那么就是走的重复的路,走不到终点但不知为何map出了一些问题后来看题解,只要步数很大了还走不到那么就永远走不到于是我把map删了,过了#include<bits/stdc......