Codeforces Round #572 (Div. 2) 前5题题解

A. Keanu Reeves

题意(水题)

一个字符串0和1的个数不同则是good;把一个不好的字符串切割成最少的good串;
如果是good串,直接输出,不是,则切成两个good串,一个是S1串,另一个是S2S3…Sn串。

B. Number Circle

题意:

一个数组组成一个环,要求任意一个数小于相邻两个数的和,按从大到小排序,最大数的小于第2和第3大的数的和,则说明可行,在把最大的数放他们中间输出即可。

C. Candies!

思维题:

一个区间内,两两之和,如果它大于10就可以得到一颗糖,并把它模10,组成一个新的序列;重复上面的步骤知道只有一个数位置

当时我直接暴力的,时间复杂度肯定暴了,当没有想到好的方法还是暴力了一发,心里默念 过过过 ,当然还是超时了,看了一下别人的思路是真的?比,原来是一个求区间和除10向下取整,弱鸡一个Orz,太菜了,然后就自己想吧

前缀和就好了(这里Orz大佬 ):

#include <bits/stdc++.h>
#include <iostream>
 
using namespace std;
 
#define  ll long long
const int maxn=2e5+5;
 
int a[maxn],tmp[maxn];
map<pair<int,int>,int> mp;
map<pair<int,int>,int> ::iterator it;
 
ll mod=1e9+7;
struct edge{
    ll e,v;
    ll ans;
};
//struct edge a[maxn];
bool cmp(struct edge a,struct edge b){
    if(a.e*b.v>a.v*b.e) return true;
    else return false;
}
 
ll mulit(ll base,ll k ){
    ll ans=1;
    while(k){
        if(k%2) ans=base*ans%mod;
        base=base*base%mod;
        k>>=1;
    }
    return ans%mod;
}
 
int main(){
    std::ios::sync_with_stdio (false);
    int n,q;
    cin>>n;
    for(int i=1; i<=n; ++i) cin>>a[i];
    tmp[0]=0;
    for(int i=1; i<=n; ++i) tmp[i]=tmp[i-1]+a[i];
    cin>>q;
    for(int i=0; i<q; ++i) {
        int l,r;
        cin>>l>>r;
        cout<<(tmp[r]-tmp[l-1])/10<<endl;
    }
    return 0;
}

D1. Add on a Tree

题看了半天( qwq~~)都没看懂,瞎写了一通 (?)

翻译过来:找一下看看有没有度数为二的点,就这么简单 ,证明:一个有三个的度顶点的简单图,可以对半添加吧(说不清 qwq )
1.Add x/2 on the path u,l1.
2.Add x/2 on the path u,l2.
3Add −x/2 on t he path l1,l2.
可以把这个看做一个结论吧,虽然不知道什么时候能用到

E. Count Pairs

一个数论题,看题解的,学到了学到了 请看官方证明
在这里插入图片描述
ac代码:

#include <bits/stdc++.h>
#include <iostream>
 
using namespace std;
 
#define  ll long long
const int maxn=2e5+5;
 
int a[maxn],tmp[maxn];
map<ll,int> mp;
map<ll,int> ::iterator it;
 
//ll mod=1e9+7;
struct edge{
    ll e,v;
    ll ans;
};
//struct edge a[maxn];
bool cmp(struct edge a,struct edge b){
    if(a.e*b.v>a.v*b.e) return true;
    else return false;
}
 
ll mulit(ll base,ll k ,ll mod){
    ll ans=1;
    while(k){
        if(k%2) ans=base*ans%mod;
        base=base*base%mod;
        k>>=1;
    }
    return ans%mod;
}
ll sub(ll a, ll b, ll mod){
    ll ans=a-b;
    if(ans<0) ans+=mod;
    return ans;
}
int main(){
    std::ios::sync_with_stdio (false);
    int n,p,k;
    memset(a,0,sizeof(a));
    cin>>n>>p>>k;
    ll ans=0;
    for(int i=0; i<n; ++i){
        ll x;
        cin>>x;
        ll val=sub(mulit(x,4,p),((k%p)*(x%p)%p),p);
        ans+=mp[val];
        ++mp[val];
    }
    cout<<ans<<"\n";
    return 0;
}

总结:
自己还是太菜了qwq,Orz cf大佬,看ac人数基本上可以看出题目的难度,也可以帮助自己不把简单的想复杂,或者是自己题目还没看懂,还有其他简单的方法,总结,做题吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值