Codeforces Round #620 (Div. 2) 【A - E】

题目来源:https://codeforces.com/contest/1304
fst真快乐233,好久没fst了 差点以为自己有光环


1304A — Two Rabbits

应该不用解释

#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);
int n,m;
int f[N];
char str[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); r(m);
        int a,b;
        r(a); r(b);
        int t=(m-n)/(a+b);
        if((m-n)%(a+b)==0){
            cout<<t<<endl;
        }
        else cout<<-1<<endl;
    }
    return 0;
}


1304B — Longest Palindrome

找最多的一对,然后不是一对的就是单个对称 选一个在中间即可

#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);
int n,m;
int f[N];
char str[M][M];
bool vis[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()
{
        r(n); r(m);
        FOR(i,1,n){
            scanf("%s",str[i]+1);
            //printf("%s",str[i]+1);
        }
        int cnt=0;
        vector<int> ans1,ans2;
        FOR(i,1,n){
            FOR(j,i+1,n){
                if(vis[j]==0){
                    bool flag=1;
                    FOR(k,1,m){
                        if(str[i][k]!=str[j][m-k+1]){
                            flag=0;
                            break;
                        }
                    }
                    if(flag){
                        vis[i]=1; vis[j]=1;
                        ans1.push_back(i);
                        ans2.push_back(j);
                        cnt+=2;
                        break;
                    }
                }
            }
        }
        int pos=-1;
        FOR(i,1,n){
            if(vis[i]==0){
                bool flag=1;
                FOR(j,1,m/2){
                    if(str[i][j]!=str[i][m-j+1]){
                        flag=0;
                        break;
                    }
                }
                if(flag){
                    cnt++;
                    pos=i;
                    break;
                }
            }
        }
        cout<<cnt*m<<endl;
        for(int i=0;i<ans1.size();i++){
            int tt=ans1[i];
            FOR(j,1,m) cout<<str[tt][j];
        }
        if(pos!=-1){
            FOR(j,1,m) cout<<str[pos][j];
        }
        for(int i=ans2.size()-1;i>=0;i--){
            int tt=ans2[i];
            FOR(j,1,m) cout<<str[tt][j];
        }
        if(cnt!=0) cout<<endl;
    return 0;
}

1304C — Air Conditioner

这题fst了 我一口老血喷了出来
就是简单的求线段并

#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);
int n,m;
struct node
{
    int t,l,r;
}f[M],g[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);
        FOR(i,1,n){
            rrr(f[i].t,f[i].l,f[i].r);
        }
        bool flag=1;
        int cnt=0;
        g[++cnt]=f[1];
        FOR(i,2,n){
            if(f[i].t==f[i-1].t){
                int l=max(f[i].l,g[cnt].l);
                int r=min(f[i].r,g[cnt].r);
                if(l>r){
                    flag=0;
                    break;
                }
                g[cnt].l=l; g[cnt].r=r;
            }
            else g[++cnt]=f[i];
        }
        if(flag==0){
            cout<<"NO\n";
            continue;
        }
        int l=m,r=m;
        FOR(i,1,cnt){
            int tt=g[i].t-g[i-1].t;
            int ll=l-tt,rr=r+tt;
            l=max(g[i].l,ll);
            r=min(g[i].r,rr);
            if(l>r){
                flag=0;
                break;
            }
        }
        if(flag==0){
            cout<<"NO\n";
        }
        else{
            cout<<"YES\n";
        }
    }
    return 0;
}

1304D — Shortest and Longest LIS

这题就是在满足大小关系的前提下 对于LIS最短 就是让右边的尽量取大 LIS最长就是让右边尽量取小嘛。。 但是我不会实现 实现了1h没搞出来…还以为是大模拟,结果std那么短,菜是原罪

#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);
int n,m;
char str[N];
int ans[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); scanf("%s",str+1);
        int num=n,pos=1;
        FOR(i,1,n){
            if(i==n||str[i]=='>'){
                for(int j=i;j>=pos;j--) ans[j]=num--;
                pos=i+1;
            }
        }
        FOR(i,1,n) cout<<ans[i]<<' ';
        cout<<endl;

        num=1,pos=1;
        FOR(i,1,n){
            if(i==n||str[i]=='<'){
                for(int j=i;j>=pos;j--) ans[j]=num++;
                pos=i+1;
            }
        }
        FOR(i,1,n) cout<<ans[i]<<' ';
        cout<<endl;
    }
    return 0;
}

1304E — 1-Trees and Queries

倍增求LCA,利用LCA快速求出两点之间的距离。
对于两点 如果距离为d 那就可以走 d+2*k步到达 因为可以来回走嘛 所以路径的区别只有奇偶 然后在树上加一条边 只会增加2种走法 设路径为(x-y) 加的边为(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=1e5+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const int bb=18;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
vector<int> v[N];
int dad[N][20];
int dep[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;
}
void build(int x,int fa)
{
    dep[x]=dep[fa]+1;
    dad[x][0]=fa;
    FOR(i,1,bb){
        dad[x][i]=dad[dad[x][i-1]][i-1];
    }

    for(int y:v[x]){
        if(y!=fa) build(y,x);
    }
}
int getLen(int x,int y)
{
    if(dep[x]>dep[y]) swap(x,y);
    int len=0;
    for(int i=bb;i>=0;i--){
        if(dep[dad[y][i]]>=dep[x]){
            y=dad[y][i];
            len+=(1<<i);

        }
    }//dep[x]==dep[y]
    if(x==y) return len;
    for(int i=bb;i>=0;i--){
        if(dad[x][i]!=dad[y][i]){
            x=dad[x][i];
            y=dad[y][i];
            len+=(1<<i+1);
        }
    }
    return len+2;
}
int main()
{
    r(n);
    FOR(i,1,n-1){
        int a,b;
        r(a); r(b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    build(1,0);
    r(m);
    while(m--){
        int a,b,x,y,c;
        rrr(a,b,x); r(y); r(c);
        int t=getLen(x,y);
        if(t<=c&&t%2==c%2){
            cout<<"YES\n";
            continue;
        }
        int t1=getLen(a,x)+1+getLen(b,y);
        int t2=getLen(a,y)+1+getLen(b,x);
        t=min(t1,t2);
        if(t<=c&&t%2==c%2) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}

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

猜你喜欢

转载自blog.csdn.net/weixin_43890662/article/details/104351262