首页 > 其他分享 >CF-929(已更新:B-E)

CF-929(已更新:B-E)

时间:2024-02-28 20:00:10浏览次数:16  
标签:cout int sum CF 更新 cin 929 -- define

CF-929

开学以来打得最烂的一场(⊙﹏⊙)

B

两种操作:删除一个元素、把一个元素的权值增加1。求使得序列元素和整除于3的最小操作次数。

分析

如果序列和sum模3的余数为0,答案为0,若为2,可以进行第二种操作,答案为1,但是若为1,答案就不一定为2,因为若能进行第一种操作删去一个模3为1的元素,可以使sum模3的余数为0,答案为1,否则答案才为2。

如sum(4,9)%3=1,4%3=1,删去4后sum%3=0

代码

没错,赛时这题都没做出来……

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int a[N];
void solve(){
    int n,sum=0;cin>>n;
    int f=0;
    rep(i,1,n){
        cin>>a[i];
        sum+=a[i];
        if(a[i]%3==1){
            f=1;
        }
    }
    if(sum%3==0){
        cout<<"0";
    }
    else if(sum%3==2){
        cout<<"1";
    }
    else{
        if(f) cout<<"1";
        else{
            cout<<"2";
        }
    }
    cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--) 
    solve();
	return 0;
}

C

分析

数据量小,就是暴力枚举x,y,答案为满足条件的k的个数,但要注意枚举的条件,要满足整除于l

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
int fp(int b,int p){
	int res=1;
	while(p){
		if(p&1) res=res*b;
		b=b*b;
		p>>=1;
	}
	return res;
}
void solve(){
    int a,b,l;cin>>a>>b>>l;
    set<int>s;
    for(int i=0;l%fp(a,i)==0;i++){
        int tp=l/fp(a,i);
        for(int j=0;tp%fp(b,j)==0;j++){
            s.insert(tp/fp(b,j));
        }
    }
    cout<<s.size()<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--) 
    solve();
	return 0;
}

D

自己现在做构造题只能纯靠猜……

分析

由样例可知: 只要满足最小数只出现一次或者数列中有一个数模上最小数结果不为0,就输出yes,否则输出no

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int a[N];
void solve(){
    int n;cin>>n;
    map<int,int>mp;
    rep(i,1,n){
        cin>>a[i];
        mp[a[i]]++;
    }
    sort(a+1,a+n+1);
    int f=0;
    if(mp[a[1]]==1) f=1;
    else{
        rep(i,2,n){
            if(a[i]%a[1]!=0){
                f=1;
                break;
            }
        }
    }
    if(f) cout<<"YES";
    else cout<<"NO";
    cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--) 
    solve();
	return 0;
}

E

感觉甚至是这场里做法最清楚的一道题……

分析

就是找长度为r的区间[l,r],其区间和sum满足sum个序列pu{u,u-1,……0,-1,-2……}的和最大的r的最小值,为了取到尽量多的pu的正值,可以先找到满足sum<=u的sum的最大的区间,显然可以用二分与前缀和找这个区间,也就是sum<u,l=mid,再对是否取这个二分到的区间[l,r]外的第一个元素进行判断

如 3 1 4 1 5 9

l=1,u=8时,二分到的区间为[3,1,4],已去完pu的所有正权值,此时pu和就是最大

但对于 5 10 9 6 8 3 10 7 3

l=1,u=12时,二分到的区间为[5],还有7个pu的正权值没取到,而取下一个元素10的话就能取到所有正权值{12,11,10……,2,1}加三个负权值{-1,-2,-3},因此取下一个元素收益最大

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int p[N];
void solve(){
    int n,x;cin>>n;
    rep(i,1,n){
        cin>>x;
        p[i]=0;
        p[i]=p[i-1]+x;
    }
    int q,ll,u;cin>>q;
    while(q--){
        cin>>ll>>u;
        int l=ll,r=n+1,mid;
        while(r-l>1){
            mid=l+r>>1;
            if(p[mid]-p[ll-1]<=u) l=mid;
            else r=mid;
        }
        //判断是否取下一个元素
        if(u-p[l]+p[ll-1]>=p[l+1]-p[l]-(p[l+1]-p[l])/2) l++,l=min(l,n);
        cout<<l<<" ";
    }
    cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--) 
    solve();
	return 0;
}

标签:cout,int,sum,CF,更新,cin,929,--,define
From: https://www.cnblogs.com/mono-4/p/18041648

相关文章

  • Codeforces Round 929 (Div. 3) 题解(D-G)
    比赛链接:https://codeforces.com/contest/1933官解暂未放出。质量不错的一场D3。CF1933D.TurtleTenacity:ContinualMods题意将数组\(a_{1..n}\ge1\)重排,问是否能使\(((a_1\mathbin{\rmmod}a_2)\mathbin{\rmmod}a_3)\cdots\mathbin{\rmmod}a_n\ne0\)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)比赛链接A.TurtlePuzzle:RearrangeandNegate思路根据题意,很明显数组中所有元素的绝对值总和就是答案Code#include<bits/stdc++.h>usingnamespacestd;#defineall(x)x.begin()+1,x.end()#defineintlonglongvoidsolve(){......
  • 2024年性价比高的服务器多少钱?腾讯云最新更新
    在当今这个数据驱动的时代,选择一款合适的服务器对于企业和个人开发者来说至关重要。腾讯云,作为国内领先的云服务提供商,为广大用户提供了多样化的服务器选择。那么,在腾讯云的众多服务器产品中,我们该如何做出明智的选择呢?首先,对于轻量级应用或初创项目,轻量应用服务器无疑是一个经......
  • CF1209G2 Into Blocks (hard version) 题解
    Description给你\(n\),\(q\),\(n\)表示序列长度,\(q\)表示操作次数。我们需要达成这么一个目标状态:如果存在\(x\)这个元素,那么必须满足所有\(x\)元素都必须在序列中连续。然后你可以进行这么一种操作,将所有的\(x\)元素的变为任意你指定的\(y\)元素,并且花费\(cnt[x......
  • IDEA更新本地代码丢失,IDEA使用Update Project更新本地代码丢失
    问题原因提交代码前,IDEA更新Git本地代码丢失,IDEA使用UpdateProject更新Git本地代码丢失,更新代码时执行UpdateProject操作。执行完该操作会发现IDEA没有任何提示,默认覆盖了你本地还未提交的代码,本地呕心沥血写的代码瞬间人间蒸发解决办法LocalHistory(本地历史更改记录)当出现......
  • 题解 NKOJ2929 【[THUSC2014] 函数求解】
    代码:#include<iostream>#include<queue>#include<cstdio>#include<cmath>usingnamespacestd;typedefstruct{ intnxt; intend; intdis; doublecost;}Edge;constintN=2e3,M=400+7,K=80800+7;constdoubleep......
  • Mybatis 批量更新 PostgreSQL 数据库,返回更新行数
    1.拼接成1条sql语句,可返回修改行数。PostgreSQL的批量更新原生sql:updatepersonsetname=tmp.name,age=tmp.age,addr=tmp.addr,num=tmp.num,update_time=tmp.update_timefrom(values(1,'关羽',43,'成都',1,'2021-03-2617:32:2......
  • CF351D - Jeff and Removing Periods 题解
    首先做一点显然的转化:在进行第一次操作之后,可以将相同的数排在一起,这样一次就能删掉一种数。如果一开始就能删光一种数的话,那么次数就是区间颜色数,否则就是区间颜色数\(+1\)。所以现在原问题变成了两个问题:求区间内不同颜色数,判断区间内是否有某种颜色满足其出现位置构成等差数......
  • cf1748f-solution
    CF1748FSolutionlink题目也就是要我们交换每对\(a_i\)和\(a_{n-1-i}\)。考虑如何利用这个异或操作交换:我们自然地想到x^=y,y^=x,x^=y。如何操作使得x^=y?我们把环上\(x\)到\(y\)的路径拉出来,假装是个序列:\(a_x.a_{x+1},a_{x+2},\dots,a_{y-2},a_{y-1},a_y\)现在要使......
  • cf1621g-solution
    CF1621GSolutionlink考虑对每个位置\(i\)作为\(i_j\)时计算贡献。\(i\)对一次答案有贡献当且仅当:设其子序列内最右端的位置为\(r\),则要满足\(r\)右侧存在一个数大于\(a_{i}\)。即,设\(lst_i\)表示整个序列最右侧的大于\(a_i\)的数,要满足\(lst_i>r\)。现......