Codeforces Round #762 (Div. 3)

A. Square String?

题目:

思路分析:

就是前半和后半都一样 匹配就行 

代码分析:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long  ull;
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}

ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}

const int MAX=5e5+1;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}
void solve(){
    string s;
    cin>>s;
    int n=s.size();
    if(n%2!=0) cout<<"NO"<<endl;
    else {
        for(int i=0;i<n/2;i++){
            if(s[i]!=s[i+n/2]){
                {cout<<"NO"<<endl;return;}
            }
        }cout<<"YES"<<endl;
    }
    
}
int main(){
    cin>>t;
    while(t--) solve();
//    solve();
    return 0;
}

B. Squares and Cubes

题目:

 

思路分析:

利用容斥定理 满足平方数的+满足立方数的-同时满足平方和立方的

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long  ull;
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}

ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}

const int MAX=5e5+1;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}

map<ll,int>mp;
vector<ll>v;
void solve(){
    ll n;cin>>n;
    if(n==1) {cout<<1<<endl;return;}
    cout<<ll(floor(sqrt(n)))+ll(floor(cbrt(n)))-ll(lower_bound(v.begin(),v.end(),n)-v.begin())<<endl;
}
int main(){
    cin>>t;
    
    for(int i=1;;i++){
        if(i*i>1e9){
            break;
        }
        mp[i*i]++;
    }
    for(int i=1;;i++){
        if(i*i*i>1e9){
            break;
        }
        if(mp[i*i*i]==1) v.push_back(i*i*i);
    }
    
    while(t--) solve();
//    solve();
    return 0;
}

C. Wrong Addition

题目:

思路分析:

类似于进制转化的思路 看代码吧! 

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long  ull;
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}

ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}

const int MAX=5e5+1;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}

map<ll,int>mp;
vector<ll>v;
void solve(){
    string a,b;
    cin>>a>>b;
    int n=a.size();
    int m=b.size();
//    cout<<n<<" "<<m<<endl;
    string s="";
    stack<int>s1;
    stack<int>s2;
    while (!s1.empty()) {
        s1.pop();
    }
    while (!s2.empty()) {
        s2.pop();
    }
    for(int i=0;i<n;i++){
        s1.push(a[i]-'0');
    }
    for(int i=0;i<m;i++){
        s2.push(b[i]-'0');
    }
//    cout<<s1.size()<<" "<<s2.size()<<endl;
    while (!s2.empty()) {
        if(s1.empty()) break;
        int nows=s2.top();
        int nowa=s1.top();
//        cout<<nows<<" "<<nowa<<endl;
        s2.pop();s1.pop();
        if(nows>=nowa){
            s+=(nows-nowa)+'0';
        }
        else{
            if(s2.empty()) {cout<<-1<<endl;return;}
            nows+=(s2.top()*10);
            if(nows-nowa>=10||nows<nowa){cout<<-1<<endl;return;}
            s2.pop();
            s+=(nows-nowa+'0');
            if(s2.size()<s1.size()){cout<<-1<<endl;return;}
        }
    }
    if(s1.empty()){
        while (!s2.empty()) {
            int now=s2.top();
            s2.pop();
            s+=now+'0';
        }
    }
    reverse(s.begin(),s.end());
    string ss="";
    int flag=1;
    int ans=0;
    for(int i=0;i<s.size();i++){
        if(s[i]!='0'){
            ans=i;break;
        }
    }
    for(int i=ans;i<s.size();i++){
        cout<<s[i];
    }
    cout<<endl;
}
int main(){
    cin>>t;
    while(t--) solve();
//    solve();
    return 0;
}

D. New Year's Problem

题目:

 

思路分析:

最大值的最小值可以考虑二分法

然后其实就是要让一个值满足大于每列的最小值 要大于至少二行的最小值

代码实现: 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long  ull;
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}

ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}

const int MAX=5e5+10;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}

int ch(int n,int m,vector<vector<int>>&a,int mid){
    for(int i=0;i<n;i++){
        int flag=0;
        for(int j=0;j<m;j++){
            if(a[j][i]>=mid){
                flag=1;
            }
        }
        if(!flag) return 0;
    }
    for(int i=0;i<m;i++){
        int t=0;
        for(int j=0;j<n;j++){
            if(a[i][j]>=mid){
                t++;
            }
        }
        if(t>=2){
            return 1;
        }
    }
    return 0;
}
void solve(){
    int m,n;cin>>m>>n;
    vector<vector<int>>v(m,vector<int>(n));
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>v[i][j];
        }
    }
    ll l=0,r=1e9;
    ll ans=0;
    while (l<=r) {
        int mid=l+r>>1;
        if(ch(n,m,v,mid)){ans=mid;l=mid+1;}
        else r=mid-1;
    }
    cout<<ans<<endl;
}
int main(){
    cin>>t;
    while(t--) solve();
//    solve();
    return 0;
}

E. MEX and Increments

题目:

 

思路分析:

题意就是让这个序列缺失的最小非负数的为i 的最小操作数

我们先预处理每个数出现的次数

然后找到第一个次数为0的数

之前的数都放入到优先队列中(大顶堆)

要让你一个数满足 首先要让之前的数都补全 然后这个数加上去

所以可以利用前缀和的思想 

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long  ull;
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}

ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}

const int MAX=5e5+10;
int t;
bool cmp(int a,int b){return a>b;}
ll max(ll a,ll b){if(a>b)return a;else return b;}


void solve(){
    priority_queue<int>p;
    while (!p.empty()) {p.pop();}
    int cnt[MAX];
    int n;cin>>n;
    for(int i=0;i<=n;i++) {cnt[i]=0;}
    for(int i=0;i<n;i++) {int x;cin>>x;cnt[x]++;}
    ll tot=0,d=0;
    for(int i=0;i<=n;i++){
        ll now=cnt[i];now+=tot;cout<<now<<" ";d=i+1;
        if(cnt[i]==0){
            if(p.empty()) break;
            tot+=i-p.top();p.pop();
        }
        while (cnt[i]>1) {p.push(i);cnt[i]--;}
    }
    for(int i=d;i<=n;i++) cout<<-1<<" ";
    cout<<endl;
}
int main(){
    cin>>t;
    while(t--) solve();
//    solve();
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值