2020中國大學生程序設計競賽(CCPC) - 網絡選拔賽 hdoj6888-6900


1001.Art Class

1002.Graph Theory Class

Min25篩


1003.Express Mail Taking

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
typedef long long ll;
#define int ll
int n,m,k;
signed main() {
    int T,x;
    scanf("%lld",&T);
    while (T--){
        scanf("%lld%lld%lld",&n,&m,&k);
        int mi=k,ans=(k-1)*2;
        for (int i=1;i<=m;i++){
            scanf("%lld",&x);
            ans+=abs(k-x)*2;
            mi=min(mi,x);
        }
        ans-=(k-mi)*2;
        printf("%lld\n",ans);
    }
    return 0;
}

1004.Chess Class

1005.Lunch

nim game
2^k必贏,無法必輸,sg=1
奇數,例:9=3*3,有2個因數,相當於一個數量為2的nim game的堆,因為操作后可以變為3+3+3,3與3的sg異或必然為0,可以兩兩相消,只要考慮一個3,9->3->1,sg=奇質因子數
sg(2^k*奇數)=1+奇質因子數

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k;
int a[N],b[N];
int vis[N],prim[N];
int num;
void euler(int n) {
    num=0;
    for (int i=2;i<=n;i++) {
        if (vis[i]==0)prim[++num]=i;
        for (int j=1;j<=num&&prim[j]*i<=n;j++) {
            vis[i*prim[j]]=1;
            if (i%prim[j]==0)break;
        }
    }
}
signed main() {
    int T;
    euler(1e5);
    scanf("%d",&T);
    while (T--) {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
            bool f=0;
            while ((a[i]&1)==0) {
                a[i]>>=1;
                f=1;
            }
            b[i]=f?1:0;
        }
        for (int i=1;i<=n;i++) {
            for(int j=1;j<=num&&prim[j]*prim[j]<=a[i];j++){
                while (a[i]%prim[j]==0){
                    a[i]/=prim[j];b[i]++;
                }
            }
            if (a[i]>1)b[i]++;
        }
        int ans=0;
        for (int i=1;i<=n;i++)ans^=b[i];
        if (ans)puts("W");
        else puts("L");
    }
    return 0;
}

1006.Robotic Class

1007.CCPC Training Class

1008.PE Class

1009.Math Class

1010.Reports

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int n,m,k;
int a[N];
signed main() {
    int T;
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        bool f=0;
        for (int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if (i>1&&a[i]==a[i-1])f=1;
        }
        printf(f?"NO\n":"YES\n");
    }
    return 0;
}

1011.3x3 Convolution

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int n,m,k;
int a[N][N],b[N][N];
signed main() {
    int T;
    scanf("%d",&T);
    while (T--) {
        scanf("%d",&n);
        for (int i=1;i<=n;i++){
            for (int j=1;j<=n;j++){
                scanf("%d",&a[i][j]);
            }
        }
        int x=0;
        for (int i=1;i<=3;i++){
            for (int j=1;j<=3;j++){
                scanf("%d",&b[i][j]);
                x+=b[i][j];
            }
        }
        if (x==b[1][1]){
            for (int i=1;i<=n;i++){
                for (int j=1;j<=n;j++){
                    if (j!=1)printf(" ");
                    printf("%d",a[i][j]);
                }
                puts("");
            }
        }
        else{
            for (int i=1;i<=n;i++){
                for (int j=1;j<=n;j++){
                    if (j!=1)printf(" ");
                    printf("0");
                }
                puts("");
            }
        }
    }
    return 0;
}

1012.Xor

|x-y|<=k=>x-y+k>=0,y-x+k>=0

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int a,b,k,w;
int dp[35][3][3][2][2][2];
int dfs(int n,int s1,int s2,int fa,int fb,int fw){
    s1=min(s1,1ll);s2=min(s2,1ll);//>=1,之后無法減去,一直>0
    if(s1<-1||s2<-1)return 0;//<-1,之后無法加回來,一直<0
	if(n<0)return s1>=0&&s2>=0;
    if (~dp[n][s1+1][s2+1][fa][fb][fw])return dp[n][s1+1][s2+1][fa][fb][fw];
    int upa=fa?(a>>n&1):1;
    int upb=fb?(b>>n&1):1;
    int upw=fw?(w>>n&1):1;
    int ans=0;
    int t=(k>>n&1);
    for (int i=0;i<=upa;i++){
        for (int j=0;j<=upb;j++){
            if ((i^j)>upw)continue;
            ans+=dfs(n-1,s1*2+i-j+t,s2*2+j-i+t,fa&&i==upa,fb&&j==upb,fw&&(i^j)==upw);
        }
    }
    return dp[n][s1+1][s2+1][fa][fb][fw]=ans;
}
signed main(){
    int T;
    cin>>T;
    while (T--){
        cin>>a>>b>>k>>w;
        memset(dp,-1,sizeof dp);
        int ans=dfs(30,0,0,1,1,1);
        cout<<ans<<endl;
    }
    return 0;
}

1013.Residual Polynomial

模數較大要用NTT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM