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

Codeforces Round 907 (Div. 2)

时间:2023-11-01 19:45:50浏览次数:36  
标签:连击 907 int sum Codeforces long 血量 Div ll

Codeforces Round 907 (Div. 2)

A. Sorting with Twos

题意:

给一个长度为n的数组,可以做任意次以下操作:选择一个整数m,将1-2m 的数减1。若能使数组变为一个单调递增的数组则输出YES,否则输出NO

分析:

只需要保证2m+1 -2m+1单调递增即可

代码:

#include <bits/stdc++.h>
using namespace std ;
const int max_N=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;

void solve(){
	int n;
    cin>>n;
    int a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int flag=1;
    for(int i=4;i<=4&&i<=n;i++){
        if(a[i]<a[i-1]){
            flag=0;
            break;
        }
    }
    for(int i=6;i<=8&&i<=n;i++){
        if(a[i]<a[i-1]){
            flag=0;
            break;
        }
    }
    for(int i=10;i<=16&&i<=n;i++){
        if(a[i]<a[i-1]){
            flag=0;
            break;
        }
    }
    for(int i=18;i<=20&&i<=n;i++){
        if(a[i]<a[i-1]){
            flag=0;
            break;
        }
    }
    if(flag==1){
        cout<<"YES"<<endl;
    }else{
        cout<<"NO"<<endl;
    }
    
}

int main(){
	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

B. Deja Vu

题意:

给一个长度为n的数组,做q次询问,若这个数能被2xi整除,则这个数加上2xi-1

分析:

一个数能被2xi整除且加上2xi-1后仍然能被2k(1<=k<xi)整除,但反之则不行,所以处理x数组,若x[i-1]<=x[i]则删去x[i],从后往前求2x[i]-1的前缀和,然后对于一个数就可以用二分查找求能被整除的最大的xi,找到后加上前缀和,时间复杂度O(n*logn)。但好像不需要二分查找,O(nm)也能过?

代码:

#include <bits/stdc++.h>
using namespace std ;
const int max_N=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;

long long ksm(long long a, long long b)
{ 
    long long res = 1; 
    while(b) 
    { 
        if(b & 1)  
            res = res * a ; 
            a = a * a ; 
            b >>= 1; 
    } 
    return res; 
}

void solve(){
	int n,q;
    cin>>n>>q;
    ll a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int x[q+1];
    for(int i=1;i<=q;i++){
        cin>>x[i];
    }
    vector< int > xc;
    xc.push_back(x[1]);
    for(int i=2;i<=q;i++){
        if(x[i]<xc[xc.size()-1]){
            xc.push_back(x[i]);
        }
    }
    ll presum[q+1];
    ll xcksm[q+1];
    presum[xc.size()-1]=ksm(2,xc[xc.size()-1]-1);
    xcksm[xc.size()-1]=ksm(2,xc[xc.size()-1]);
    for(int i=xc.size()-2;i>=0;i--){
        xcksm[i]=ksm(2,xc[i]);
        presum[i]=presum[i+1]+xcksm[i]/2;
    }
    for(int i=1;i<=n;i++){
        if(a[i]%xcksm[xc.size()-1]!=0){
            cout<<a[i]<<" ";
            continue;
        }
        int left=0,right=xc.size()-1;
        while(left<right){
            int mid=(left+right)/2;
            if(a[i]%xcksm[mid]==0){
                right=mid;
            }else{
                left=mid+1;
            }
        }
        int ind=right;
        a[i]+=presum[ind];
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

int main(){
    ios::sync_with_stdio(false);
	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

C. Smilo and Monsters

题意:

有一组怪物,每个怪物有血量,你可以使用一次普通攻击并积累一次连击,也可以使用终极攻击,并清空连击,求最少的攻击次数

分析:

积累的连击优先攻击血量最大的怪物,先求总血量,并除以2得到连击伤害,将怪物排序,从后往前遍历,若连击伤害大于等于怪物血量,则连击伤害减去怪物血量,怪物血量清零,并增加一次攻击次数;若连击伤害小于怪物血量,怪物血量减去连击伤害,连击伤害清零,增加一次攻击次数。最后攻击次数加上剩下的怪物血量

代码:

#include <bits/stdc++.h>
using namespace std ;
const int max_N=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;

void solve(){
	int n;
    cin>>n;
    ll a[n+1];
    ll sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sort(a+1,a+1+n);
    sum>>=1;
    ll ans=0;
    for(int i=n;i>=1;i--){
        if(sum>=a[i]){
            sum-=a[i];
            a[i]=0;
            ans++;
        }else if(sum){
            a[i]-=sum;
            sum=0;
            ans++;
            break;
        }
    }
    for(int i=1;i<=n;i++){
        ans+=a[i];
    }
    cout<<ans<<endl;
}

int main(){
	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

标签:连击,907,int,sum,Codeforces,long,血量,Div,ll
From: https://www.cnblogs.com/beater/p/17803936.html

相关文章

  • Man or Honor 怒海潜将,壮志潜龙 美军的Navy Dive Carl Brashear
    上午路上刷到一个电影解说,讲的是CarlBrashear,从一位黑人少年,成长为美军中潜水不对MasterChief的传奇经历。人啊,凡事要靠自己,自我成长比什么都重要。剧中的那句ASNF-ASonNeverForgets,赤子之心,是发人深省的警句。......
  • Codeforces Round 906 Div. 1 (CF1889)
    貌似现在发周六的CF题解已经失去了时效性,不过问题不大。A.QingshanLovesStrings2Description定义一个长度为\(k\)的\(01\)串\(s\)是好的,当且仅当\(\foralli\in[1,k],s_i\neqs_{k-i+1}\)。现给你一个串,每次操作你可以在任意位置插入一对\(01\)。请构造操作方......
  • Codeforces Round 906 (Div. 2)A-E1
    A.Doremy'sPaint3记数组中数的种类数为\(k\),当\(k=1\)时,答案为\(yes\);当\(k=2\)时,记两个种类的数的个数差为\(d\),当\(d≤1\)时,答案为\(yes\);其他情况答案为\(no\)。时间复杂度:\(O(nlogn)\)1voidsolve()2{3intn;cin>>n;45map<int,int>mp;6......
  • Codeforces Round 895
    提炼感觉这种题还是很金典的我们看到乘积就应该想到其很容易爆而我们省1的话也最多就是2e5数量级的我们为了省事不用算上界可以直接把这个上界设为1e9也不会爆LL只要乘积突破这个上界我们就肯定要是有旁边的大于1的数我们都要吃掉因为增量都超过了1e9那么多我们只要......
  • codeforces 1829G. Hits Different 容斥原理+记忆化搜索
    题目描述:给定一个n,把n给打倒,然后递归的求出包含n在内的上面所有的会倒下的瓶子值的平方和。这里使用二分先求出目前给定的n的行号i和列号j。观察可以发现,对于所有的列号j,j=1或者j=i时,是需要考虑往上单边的总和,其他情况都有两个分支。再观察可以发现,两个分支在再上一行的重合部......
  • CodeForces 1246F Cursor Distance
    洛谷传送门CF传送门发现一个性质:能跳不超过\(j\)步到达\(i\)的所有点形成一段区间。设这这段区间为\([L_{i,j},R_{i,j}]\)。那么答案即为:\[\sum\limits_{i=1}^n\sum\limits_{j=0}n-R_{i,j}+L_{i,j}-1\]并且:\[[L_{i,j},R_{i,j}]=\bigcup\limits_......
  • 视频直播app源码,CSS div水平垂直居中和div置于底部
    视频直播app源码,CSSdiv水平垂直居中和div置于底部一、水平居中 .hor_center{  margin:0auto;}​二、水平垂直居中 .content{  width:360px;  height:240px;} .ver_hor_center{  position:absolute;  top:50%;  left:50%;  margi......
  • Codeforces Round 906 (Div. 2) A-E1
    比赛地址A.Doremy'sPaint3题意:给出一个数组\(b\),问能否通过重新排序使得数组满足\(b_1+b_2=b_2+b_3=...=b_{n-1}+b_{n}\)Solution首先判断元素个数如果是1,则满足条件如果是2,需判断不同元素个数的差是否小于等于1其余的均不满足条件voidsolve(){intn;cin>......
  • 无涯教程-Clojure - Accessing Individual Fields函数
    可以通过与结构对象一起访问键来访问结构的各个字段。AccessingIndividual-语法:keystructure-name参数   - "key"是结构中的键值,"structure-name"是作为相应关键字的结构。返回值 - 将返回与键关联的值。以下程序显示了有关如何使用它的示例。AccessingI......
  • Codeforces Round 904 (Div. 2) C. Medium Design(前缀和+差分)
    CodeforcesRound904(Div.2)C.MediumDesign思路:因为出现的线段应该为不相同的线段,所以最小值应该为\(1\)或\(m\)因此我们可以通过差分储存线段范围内的加值,再用前缀和表示这个范围内的最大加值sl为不包含\(1\)的线段的差分,sr为不包含\(m\)的线段差分记录用于差分的......