Codeforces Round #619 (Div. 2) 【A - D 待补E】

题目来源:https://codeforces.com/contest/1301
过几天准备复习 (预习) 一下RMQ 然后补一下E

1301A - Three Strings

既然c一定要变成a或b中的一个,那如果他和a或b中对应的某一位相等,那换另一个不相等的就可以了,即判断c是不是每一位都可以在a或b中找到对应相等

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
double n,m;
int f[N];
char s3[N];
char s1[N],s2[N];
template<class T>
inline void read(T &x)
{
    char c; x=1;
    while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
    T res=c-'0';
    while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
    x*=res;
}
int main()
{
    int t;
    r(t);
    while(t--){
        scanf("%s",s1+1);
        scanf("%s",s2+1);
        scanf("%s",s3+1);
        int len=strlen(s1+1);
        bool flag=1;
        FOR(i,1,len){
            if(s1[i]==s3[i]||s2[i]==s3[i]){
                flag=1;
            }
            else{
                flag=0;
                break;
            }
        }
        if(flag) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}


1301B - Motarack’s Birthday

完全可以把和-1相邻的正数放到一个x轴上,然后我们找一个点p使得p到这些点的距离的最大值最小。这么一说好像特别像牛客寒假训练营的某题,不过简单多了,因为没有y轴。我们直接取最大值和最小值的中间值即可

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
double n,m;
int f[N];
int g[N];
template<class T>
inline void read(T &x)
{
    char c; x=1;
    while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
    T res=c-'0';
    while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
    x*=res;
}
int main()
{
    int t;
    r(t);
    while(t--){
        r(n);
        FOR(i,1,n) r(f[i]);
        int cnt=0;
        FOR(i,1,n){
            if(f[i]==-1){
                if(i+1<=n&&f[i+1]!=-1) g[++cnt]=f[i+1];
                if(i-1>=1&&f[i-1]!=-1) g[++cnt]=f[i-1];
            }
        }
        sort(g+1,g+cnt+1);
        //cout<<g[1]<<' '<<g[cnt]<<endl;
        int mid=(g[cnt]+g[1])/2;
        FOR(i,1,n) if(f[i]==-1) f[i]=mid;
        int ans=0;
        FOR(i,1,n-1) ans=max(ans,abs(f[i+1]-f[i]));
        cout<<ans<<' '<<mid<<endl;
    }
    return 0;
}


1301C - Ayoub’s function

这题我想了好久,关键是这个数据忒巧妙了,它前几个都是 1 2 3 4 5 6 之类的 我以为有什么规律… 找半天发现不太对。后来转换了角度,其实总的可以求出来,减去连续0的情况就好了

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
LL n,m;
template<class T>
inline void read(T &x)
{
    char c; x=1;
    while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
    T res=c-'0';
    while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
    x*=res;
}
int main()
{
    int t;
    r(t);
    while(t--){
        r(n); r(m);
        LL ans=n*(n+1)/2;
        LL rest=n-m;
        LL get=rest/(m+1);
        LL cnt=rest%(m+1);
        LL ans1=cnt*(get+1)*(get+2)/2;
        ans1+=(m+1-cnt)*(get+1)*get/2;
        cout<<ans-ans1<<endl;
    }
    return 0;
}


1301D - Time to Run

这题我写的时候就对自己的推论存在疑虑,但是我还是相信自己的,虽然最后还是没敲出来233 最后发现自己的推论错了,这个人有方法走完所有的路 !
①:往右走到尽头 然后折返
②:往下走一步
③:继续往右走到尽头
④:往上走一步,再往下走一步,再往左走一步 重复这三个操作 直到回到最左边
⑤:重复② ③ ④ 直到不能往下走
⑥:往上走到尽头

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,string> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
template<class T>
inline void read(T &x)
{
    char c; x=1;
    while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
    T res=c-'0';
    while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
    x*=res;
}
int main()
{
    int k;
    rrr(n,m,k);
    if(4*n*m-2*n-2*m<k){
        cout<<"NO\n";
        return 0;
    }
    vector<pt> ans;
    FOR(i,1,n){
        if(i==1){
            if(m-1>0){
                if(k>m-1){
                    k-=(m-1);
                    ans.push_back(mp(m-1,"R"));
                    if(k>m-1){
                        ans.push_back(mp(m-1,"L"));
                        k-=(m-1);
                    }
                    else{
                        ans.push_back(mp(k,"L"));
                        k=0;
                        break;
                    }
                }
                else{
                    ans.push_back(mp(k,"R"));
                    k=0;
                    break;
                }
            }
        }
        else{
            ans.push_back(mp(1,"D"));
            k--;
            if(k==0) break;
            if(m-1>0){
                if(k>m-1){
                    k-=(m-1);
                    ans.push_back(mp(m-1,"R"));
                    if(k>3*(m-1)){
                        k-=3*(m-1);
                        ans.push_back(mp(m-1,"UDL"));
                    }
                    else{
                        int cnt=k/3;
                        if(cnt>0) ans.push_back(mp(cnt,"UDL"));
                        int ext=k%3;
                        if(ext==1){
                            ans.push_back(mp(1,"U"));
                        }
                        else if(ext==2){
                            ans.push_back(mp(1,"UD"));
                        }
                        k=0;
                        break;
                    }
                }
                else{
                    ans.push_back(mp(k,"R"));
                    k=0;
                    break;
                }
            }
        }
    }
    if(k!=0){
        ans.push_back(mp(k,"U"));
    }
    cout<<"YES\n";
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++){
        cout<<ans[i].first<<' '<<ans[i].second<<endl;
    }
    return 0;
}


1301E - Nanosoft

虽然这题超出我当前的水平很多了,但我还是想补补,保证不咕

发布了75 篇原创文章 · 获赞 93 · 访问量 9802

猜你喜欢

转载自blog.csdn.net/weixin_43890662/article/details/104321406
今日推荐