2020HDU多校第十场 By Rynar 6877-6887

1003.Mine Sweeper

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=25+10;
const int mod=1e9+7;
int n,m,k;
int a[N][N];
int main(){
    int T,x,y,s;
    scanf("%d",&T);
    while (T--){
        scanf("%d",&s);
        if (s==0)cout<<"1 1"<<endl<<"."<<endl;
        else if (s<=16){
            for (int i=1;i<=25;i++){
                if (i%3!=2)s--;
                if (((i+1)%3!=2||i%3==2)&&!s){
                    cout<<1<<" "<<i<<endl;
                    for (int j=1;j<=i;j++){
                        if (j%3==2)cout<<"X";
                        else cout<<".";
                    }
                    break;
                }
            }
            puts("");
        }
        else{
            cout<<25<<" "<<25<<endl;
            memset(a,0,sizeof a);
            int k=(s-8)/8,r=s-k*8;
            for (int i=2;i<=25;i+=2){
                for (int j=2;j<=25;j+=2){
                    a[i][j]=1;
                    --k;
                    if (k==0)break;
                }
                if (k==0)break;
            }
            if (r==8)a[24][24]=1;
            else if (r==9)a[25][1]=a[25][2]=a[25][25]=1;
            else if (r==10)a[25][2]=a[25][5]=1;
            else if (r==11)a[25][1]=a[25][2]=a[25][5]=1;
            else if (r==12)a[25][1]=a[25][2]=a[25][24]=a[25][25]=1;
            else if (r==13)a[24][2]=a[25][5]=1;
            else if (r==14)a[25][1]=a[25][2]=a[25][25]=a[25][5]=1;
            else if (r==15)a[25][7]=a[25][2]=a[25][5]=1;
            for (int i=1;i<=25;i++){
                for (int j=1;j<=25;j++){
                    if (a[i][j]==1)printf("X");
                    else printf(".");
                }
                puts("");
            }
        }
    }
    return 0;
}

1004.Permutation Counting

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N=5000+10;
const int mod=1e9+7;
int n,m,k;
int a[N];
int dp[N][N];//dp[i][j]表示第i位对应的数字是j对应的种类数
signed main(){
    int T,x,y,s;
    scanf("%lld",&T);
    while(T--){
        scanf("%lld",&n);
        for (int i=1;i<n;i++)scanf("%lld",&a[i]);
        for (int i=1;i<=n;i++){
            for (int j=1;j<=n;j++){
                dp[i][j]=0;
            }
        }
        dp[1][1]=1;
        if (a[1])dp[2][1]=1;
        else dp[2][2]=1;
        for (int i=2;i<n;i++){
            if (a[i]){
                for(int j=i;j>=1;j--){
                    dp[i+1][j]=(dp[i+1][j+1]+dp[i][j])%mod;
                }
            }
            else{
                for(int j=2;j<=i+1;j++){
                    dp[i+1][j]=(dp[i][j-1]+dp[i+1][j-1])%mod;
                }
            }
        }
        int res=0;
        for(int i=1;i<=n;i++) res=(res+dp[n][i])%mod;
        printf("%lld\n",res);
    }
    return 0;
}

1005.Tree Cutting

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define SZ(X) ((ll)X.size())
using namespace std;
const int maxn=1e6+10;
int n,K;
struct edge{
    int y,nex;
}a[maxn<<1];
int len,fir[maxn];
inline void ins(const int x,const int y){ a[++len]=(edge){y,fir[x]};fir[x]=len; }
int seg[maxn<<2],flag[maxn<<2];
int loc,c,lx,rx;
void pushdown(const int x){
    if(flag[x]){
        int fl=flag[x]; flag[x]=0;
        int lc=x<<1,rc=lc|1;
        seg[lc]+=fl,seg[rc]+=fl;
        flag[lc]+=fl,flag[rc]+=fl;
    }
}
void upd(const int x,const int l,const int r){
    if(l==r) { seg[x]=c;return; }
    int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
    pushdown(x);
    if(loc<=mid) upd(lc,l,mid);
    else upd(rc,mid+1,r);
    seg[x]=max(seg[lc],seg[rc]);
}
void upd2(const int x,const int l,const int r){
    if(rx<l||r<lx) return;
    if(lx<=l&&r<=rx){
        seg[x]+=c;
        flag[x]+=c;
        return;
    }
    pushdown(x);
    int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
    upd2(lc,l,mid); upd2(rc,mid+1,r);
    seg[x]=max(seg[lc],seg[rc]);
}
int query(const int x,const int l,const int r){
    if(l==r)return seg[x];
    pushdown(x);
    int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
    if(loc<=mid) return query(lc,l,mid);
    else return query(rc,mid+1,r);
}
int query2(const int x,const int l,const int r){
    if(rx<l||r<lx) return 0;
    if(lx<=l&&r<=rx) return seg[x];
    pushdown(x);
    int mid=(l+r)>>1,lc=x<<1,rc=lc|1;
    return max(query2(lc,l,mid),query2(rc,mid+1,r));
}
int dis[maxn],son[maxn];
void dfs(int x,int fa){
    dis[x]=0;
    int mxd=0;
    for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa){
        dfs(y,x);
        if(mxd<=dis[y]) mxd=dis[y],son[x]=y;
        dis[x]=max(dis[x],dis[y]+1);
    }
}
int ans;
void dp(const int x,const int fa,const int L){
    if(!son[x]){
        loc=L,c=1,upd(1,1,2*n);
        return;
    }
    dp(son[x],x,L+1);
    loc=L,c=1; upd(1,1,2*n);
    lx=L+1,rx=L+dis[x],c=1; upd2(1,1,2*n);
    for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa&&y!=son[x]){
        dp(y,x,L+dis[x]+1);
        for(int u=min(dis[y]+1,K),i=u;i>=1;i--){
            int fx,fy;
            loc=L+i,fx=query(1,1,2*n);
            loc=L+dis[x]+1+i-1,fy=query(1,1,2*n);
            int temp=fx;
            lx=L+dis[x]+1+0,rx=L+dis[x]+1+min(K-i-1,i-1);
            if(lx<=rx) temp=max(temp,fx + query2(1,1,2*n) );
            lx=L+0,rx=L+min(K-i,i);
            if(lx<=rx) temp=max(temp,fy + query2(1,1,2*n) );
            loc=L+i,c=temp,upd(1,1,2*n);
        }
        if(K-1-dis[y]>dis[y]+1){
            lx=L+dis[x]+1,rx=min(L+dis[x]+1+dis[y],L+dis[x]+1+K);
            c=query2(1,1,2*n);
            lx=L+dis[y]+2,rx=min(L+K-1-dis[y],L+dis[x]);
            if(lx<=rx) upd2(1,1,2*n);
        }
        if(dis[x]+dis[y]+1>K){
            int fy=0;
            for(int i=0;i<dis[y]&&K-i-1>dis[y]+1;i++){
                loc=L+K-i-1;
                int fx=query(1,1,2*n);
                loc=L+dis[x]+1+i;
                fy=max(fy,query(1,1,2*n));
                loc=L+K-i-1,c=fx+fy;
                upd(1,1,2*n);
            }
        }
        for(int i=0;i<=dis[y];i++){
            loc=L+dis[x]+1+i,c=0;
            upd(1,1,2*n);
        }
    }
    lx=L+0,rx=L+K;
    ans=max(ans,query2(1,1,2*n));
}
int main(){
    int T;
    scanf("%d",&T);
    while (T--){
        scanf("%d%d",&n,&K);
        ans=0;
        len=0;for (int i=0;i<=n;i++)fir[i]=0,dis[i]=0,son[i]=0;
        for (int i=0;i<=4*n;i++)seg[i]=0,flag[i]=0;
        for(int i=1;i<n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            ins(x,y),ins(y,x);
        }
        dfs(1,0);
        dp(1,0,1);
        printf("%d\n",n-ans);
    }
    return 0;
}

1010.Tic-Tac-Toe-Nim

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[4][4];
int main(){
    int T;
    scanf("%d",&T);
    while (T--){
        for (int i=1;i<=3;i++){
            for (int j=1;j<=3;j++){
                scanf("%d",&a[i][j]);
            }
        }
        int tot=0;
        for (int i=1;i<=3;i++){
            for (int j=1;j<=3;j++){
                int ans=1;
                for (int k=1;k<=3;k++){
                    for (int p=1;p<=3;p++){
                        if (k==i||p==j)continue;
                        int r=0;
                        for (int x=1;x<=3;x++){
                            for (int y=1;y<=3;y++){
                                if (x==i&&y==j)continue;
                                if (x==k&&y==p)continue;
                                if (x==k||x==i||y==p||y==j)r^=a[x][y]-1;
                                else r^=a[x][y];
                            }
                        }
                        if (r==0)ans=0;
                    }
                }
                if (ans==1)tot++;
            }
        }
        cout<<tot<<endl;
    }
    return 0;
}

1011.Task Scheduler

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5000+10;
const int mod=1e9+7;
int n,m,k;
struct node{
    int id,w;
}a[N];
bool cmp(node a,node b){
    if (a.w==b.w)return a.id<b.id;
    return a.w>b.w;
}
signed main(){
    int T,x,y,s;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&k);
        for (int i=1;i<=n;i++){
            scanf("%d",&a[i].w);
            a[i].id=i;
        }
        if (k==0){
            for (int i=1;i<=n;i++){
                if (i!=1)printf(" ");
                printf("%d",i);
            }puts("");
            continue;
        }
        sort(a+1,a+1+n,cmp);
        for (int i=1;i<=n;i++){
            if (i!=1)printf(" ");
            printf("%d",a[i].id);
        }puts("");
    }
    return 0;
}
posted @ 2020-08-21 11:46  Rynar  阅读(654)  评论(0)    收藏  举报