ACM实验室周赛2020.3.6

B.

按要求建图,判欧拉路径

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+14;
//vector<int> g[maxn];
int N,M;
int T;
int x;
char s[maxn];
int inDegree[maxn];
int father[maxn];
int isRoot[maxn];
int findfather(int x) {
    int a=x;
    while(x!=father[x]) x=father[x];
    while(a!=father[a]) {
        int z=a;
        a=father[a];
        father[z]=x;
    }
    return x;
}
void Union (int a,int b) {
    int faA=findfather(a);
    int faB=findfather(b);
    if (faA!=faB) father[faA]=faB;
}
int main () {
    scanf("%d",&T);
    while(T--) {
        memset(inDegree,0,sizeof(inDegree));
        memset(isRoot,0,sizeof(isRoot));
        scanf("%d %d",&N,&M);
        for (int i=0;i<N*M;i++) father[i]=i;
        for (int i=0;i<N;i++) 
            for (int j=0;j<M;j++)
                cin>>s[i*M+j];
        for (int i=0;i<N;i++) {
            for (int j=0;j<M;j++) {
                scanf("%d",&x);
                if (s[i*M+j]=='u') {
                    if (i-x<0) continue;
                    inDegree[(i-x)*M+j]++;
                    Union(i*M+j,(i-x)*M+j);
                } 
                else if (s[i*M+j]=='d') {
                    if (i+x>=N) continue;
                    inDegree[(i+x)*M+j]++;
                    Union(i*M+j,(i+x)*M+j);
                }
                else if (s[i*M+j]=='l') {
                    if (j-x<0) continue;
                    inDegree[(i*M+j-x)]++;
                    Union(i*M+j,i*M+j-x);
                }
                else if (s[i*M+j]=='r') {
                    if (j+x>=M) continue;
                    inDegree[i*M+j+x]++;
                    Union(i*M+j,i*M+j+x);
                }
            }
        }
        int ans=0;
        for (int i=0;i<N*M;i++) isRoot[findfather(i)]++;
        for (int i=0;i<N*M;i++)  
            if (isRoot[i]) ans++;
        //printf("%d\n",ans);
        if (ans>1) {
            printf("No\n");
            continue;
        }
        int cnt=0;
        for (int i=0;i<N*M;i++) {
            if (inDegree[i]==0) cnt++;
        }
        if (cnt>=2) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}
View Code

C.

构造

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+14;
typedef long long ll;
ll a[5];
string s;
int main () {
    int T;
    scanf("%d",&T);
    while (T--) {
        for (int i=0;i<4;i++) a[i]=0;
        cin>>s;
        ll len=s.length();
        for (int i=0;i<len;i++) {
            if (s[i]=='0') a[0]++;
            if (s[i]=='6') a[1]++;
            if (s[i]=='8') a[2]++;
            if (s[i]=='9') a[3]++;
        }
        ll ans=(1+len)*(ll)len/2+1;
        ans-=(1+a[0])*a[0]/2;//0 
        ans-=(1+a[2])*a[2]/2;//8 
        ans-=a[1]*a[3];//69 
        if (a[1]==len||a[3]==len) ans--;
        printf("%lld\n",ans);
    }
    return 0;
}
View Code

D.

套个二分

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+14;
string s;
int a[maxn];
int b[maxn];
int len;
int cal (int l) {
    int ans=0;
    for (int i=1;i<=len;i++) {
        if (a[i]==1) {
            ans++;
            for (int j=i;j<i+l;j++) 
                if (a[j]) a[j]=0;
        }
    } 
    return ans;
}
int main () {
    int T,N,K;
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d",&N,&K);
        memset(a,0,sizeof(a));
        cin>>s;
        for (int i=1;i<=s.length();i++) 
            a[i]=s[i-1]=='1',b[i]=a[i];
        len=s.length();
        int l=1;
        int r=len;
        while (l<r) {
            int mid=(l+r)>>1;
            for (int i=1;i<=len;i++) a[i]=b[i];
            int ans=cal(mid);
            if (ans>K) l=mid+1;
            else {
                r=mid;
            }
        } 
        printf("%d\n",l);
    }
    return 0;
} 
View Code

猜你喜欢

转载自www.cnblogs.com/zhanglichen/p/12431751.html
今日推荐