Educational Codeforces Round 89 (Rated for Div. 2)

Educational Codeforces Round 89 (Rated for Div. 2)

这套题总的来说都不是很难,和昨天写的那套有一定的相似程度,就是算法比较少,思维比较多。
A B 没有昨天做的那么顺,还是卡了一会,尤其是B,还把题目看错了
C 题倒是做的比较顺,但是花的时间还是长了一点点
D 题不是很难,花的时间过于多了,导致E题结束之后才写完
这场的ABCDE都可以补一下,没什么算法,主要靠思维+细心观察

A. Shovels and Swords

这个假设 \(x\) 个 sword,\(y\) 个 shovel,

那么最后就是 \(2*x+y<=a\) \(x+2*y<=b\) 所以 \(x+y<=(a+b)/3\)

所以就可以把 \(x+y\) 求出来了,但是注意要和 \(a、b\) 取一个min。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 5e5+10;
 
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        int ans=min((n+m)/3,min(n,m));
        printf("%d\n",ans);
    }
    return 0;
}

B. Shuffle

题目大意:

首先在 \(x\) 位置有一个1,你有 \(m\) 次操作,对于第 \(i\) 次操作,你可以交换 \([li,ri]\) 的任意两个数,注意这两个数可以相同,也就是说你可以不进行交换。问最后可以出现1的位置有多少个?

题解:

这个其实就是一个区间不断往外扩展,第一次的区间就是 \([x,x]\) ,之后的操作区间如果和之前得到的区间有重叠,那么就可以加入之前的这个区间,最后输出区间的长度即可。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 5e5+10;
 
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,x,m;
        scanf("%d%d%d",&n,&x,&m);
        int l=x,r=x;
        for(int i=1;i<=m;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            if((a<=r&&a>=l)||(b<=r&&b>=l)||(b>=r&&a<=r)) {
                l=min(l,a);
                r=max(r,b);
            }
        }
        printf("%d\n",r-l+1);
    }
}

C. Palindromic Paths

题目大意:

给你一个 \(n*m\) 的矩阵,从 \((1,1)\) 开始走,每一步只能往右或者往下走,最后走到 \((n,m)\) ,给你这个矩阵每一个位置的值,这个值取0或者1,你可以对这个矩阵的值进行改变,问最少改变多少个值,可以让第一步的位置和最后一步的位置的值相同,第二步的位置和倒数第二个位置的值相同,以此类推。

题解:

这个不好讲,看代码吧

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn =55;
int a[maxn][maxn],num[110],sum[110];
 
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m,now=0;
        memset(sum,0,sizeof(sum));
        memset(num,0,sizeof(num));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
        for(int i=1;i<=n;i++){
            int x=i,y=1;
            ++now;
            while(true){
                sum[now]++;
                if(a[x][y]) num[now]++;
                x--,y++;
                if(x<1||y>m) break;
            }
        }
        for(int i=2;i<=m;i++){
            int x=n,y=i;
            ++now;
            while(true){
                sum[now]++;
                if(a[x][y]) num[now]++;
                x--,y++;
                if(x<1||y>m) break;
            }
        }
        int ans=0;
//        printf("now=%d\n",now);
        for(int i=1;i<=now/2;i++){
            ans+=min(num[i]+num[now-i+1],sum[i]+sum[now-i+1]-num[i]-num[now-i+1]);
//            printf("i=%d ans=%d\n",i,ans);
        }
        printf("%d\n",ans);
    }
}

D. Two Divisors

这个不是很难,仔细分析吧。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn =4e3;
int phi[maxn],pri[maxn],cnt,v[maxn];
void init() {
    cnt = 0;
    phi[1] = 1;
    memset(v,0,sizeof(v));
    for (int i = 2; i < maxn; ++i) {
        if (!v[i]) {
            v[i] = i;
            pri[cnt++] = i;
        }
        for (int j = 0; j < cnt; ++j) {
            if (1ll * i * pri[j] >= maxn) break;
            v[i * pri[j]] = pri[j];
        }
    }
}
int a[500005],ans1[500005],ans2[500005];
int gcd(int x,int y){
    return y==0?x:gcd(y,x%y);
}
int main(){
    int n;
    init();
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x,f=0;
        scanf("%d",&x);
        int y=x;
        for(int j=0;j<cnt;j++){
            while(x%pri[j]==0){
                f = pri[j];
                x/=pri[j];
            }
            if(f) break;
        }
        if(!f) f=x,x=1;
        ans1[i]=x,ans2[i]=f;
        if(ans1[i]==1||ans2[i]==1||gcd(ans1[i]+ans2[i],x)!=1) ans1[i]=ans2[i]=-1;
    }
    for(int i=1;i<=n;i++) printf("%d ",ans1[i]);
    printf("\n");
    for(int i=1;i<=n;i++) printf("%d ",ans2[i]);
    printf("\n");
}

E. Two Arrays

这个你首先要判断有没有方案,如果有方案则求出每一个区间的最小区间,然后用组合数求解。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn =2e5+10;
const int mod = 998244353;
int l[maxn],r[maxn];
int a[maxn],b[maxn];
struct node{
    int v,id;
    node(int v=0,int id=0):v(v),id(id){}
    bool operator<(const node & a)const {
        return a.v<v;
    }
};
priority_queue<node>que;
map<int,int>mp;
int main(){
    int n,m,f=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),que.push(node(a[i],i));
    for(int i=1;i<=m;i++) scanf("%d",&b[i]);
    b[m+1]=inf;
    for(int i=1;i<=m;i++){
        while(!que.empty()){
            node u = que.top();
//            printf("u.v=%d\n",u.v);
            if(u.v<b[i+1]) r[i]=max(r[i],u.id),que.pop();
            else break;
        }
        if(!r[i]) f=1;
    }
    for(int i=1;i<=n;i++){
        if(a[i]<b[1]) f = 1;
        mp[a[i]]=i;
    }
//    debug(f);
    for(int i=1;i<=m;i++) {
        l[i]=mp[b[i]];
        if(!l[i]) f = 1;
        if(l[i]>r[i]) f = 1;
        if(l[i]<=r[i-1]) f = 1;
    }
    l[1]=1;
    if(f) printf("0\n");
    else{
        ll ans = 1;
        for(int i=2;i<=m;i++){
            ll res = l[i]-r[i-1];
            ans=res*ans%mod;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
posted @ 2020-07-10 12:04  EchoZQN  阅读(104)  评论(0编辑  收藏  举报