2019 Multi-University Training Contest 4


layout: post
title: 2019 Multi-University Training Contest 4
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- ACM-ICPC


1001 AND Minimum Spanning Tree(位运算)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
set<int>mp;
int get(int x){
    for(int i=0;i<30;i++){
        if((x&(1<<i))==0)return (1<<i);
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    int p=0;
    for(int i=1;i<=2e5;i*=2){
        p+=i;
        mp.insert(p);
    }
    while(t--){
        int n;
        cin>>n;
        int ans=0;
        vector<int>oo;
        for(int i=2;i<=n;i++){
            if(i%2==0)oo.push_back(1);
            else{
                if(mp.count(i)&&(i+1)<=n){
                    oo.push_back(i+1);
                }
                else if(mp.count(i)){
                    oo.push_back(1);
                    ans++;
                }
                else{
                    int u=get(i);
                    oo.push_back(u);
                }
            }
        }
        cout<<ans<<endl;
        for(int i=0;i<oo.size();i++){
            if(i)cout<<" ";
            cout<<oo[i];
        }
        cout<<endl;
    }
    return 0;
}

1007 Just an Old Puzzle (结论)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;

int a[10][10];
int cal(int x,int y){
    int p=a[x][y];
    int cnt=0;
    for(int i=1;i<=x;i++){
        for(int j=1;j<=(i==x?y:4);j++){

            if(p<a[i][j])cnt++;
        }
    }
    return cnt;
}
int main(){
    std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int ix,iy;
        for(int i=1;i<=4;i++){
            for(int j=1;j<=4;j++){
                cin>>a[i][j];
                if(a[i][j]==0)ix=i,iy=j;
            }
        }
        int ans=ix;
        for(int i=1;i<=4;i++){
            for(int j=1;j<=4;j++){
                if(a[i][j]==0)continue;
                ans+=cal(i,j);
            }
        }
      //  cout<<"ans="<<ans<<endl;
        if(ans&1)cout<<"No"<<endl;
        else cout<<"Yes"<<endl;
    }

    return 0;
}

1008 K-th Closest Distance (二分+主席树)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
int e5=1e6;
int rt[maxn*40],num[maxn*40],ls[maxn*40],rs[maxn*40];
int cnt;
void update(int &o,int pre,int l,int r,int val){
    o=++cnt;
    ls[o]=ls[pre],rs[o]=rs[pre];
    num[o]=num[pre]+1;
    if(l==r)return ;
    int mid=(l+r)/2;
    if(val<=mid)update(ls[o],ls[pre],l,mid,val);
    else update(rs[o],rs[pre],mid+1,r,val);
}
int query(int o,int l,int r,int val){///这个区间内小于等于这个数的个数
    if(l==r){
        return num[o];
    }
    int mid=(l+r)/2;
    if(val<=mid)return query(ls[o],l,mid,val);
    else return num[ls[o]]+query(rs[o],mid+1,r,val);
}
int n;
bool check(int mid,int K,int L,int R,int p){ ///K需要大于K个 值在P附近
    int l1=max(p-mid,1),r1=min(e5,p+mid);
    int numr1=query(rt[R],1,1e6,r1)-query(rt[L-1],1,1e6,r1);
    int numl1=query(rt[R],1,1e6,l1-1)-query(rt[L-1],1,1e6,l1-1);
    if(numr1-numl1>=K)return true;
    else return false;
}
int a[maxn];
int main(){
    std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int m;
        cin>>n>>m;
        cnt=0;
        for(int i=1;i<=n*40;i++){
            num[i]=0;ls[i]=0;rs[i]=0;rt[i]=0;
        }
        for(int i=1;i<=n;i++){
            cin>>a[i];
            update(rt[i],rt[i-1],1,1e6,a[i]);
        }
        int x=0;
        for(int i=1;i<=m;i++){
            int L,R,p,K;
            cin>>L>>R>>p>>K;
            L^=x;R^=x;p^=x;K^=x;
            if(L>R)swap(L,R);
            int l=0,r=1e6,ans;
            while(l<=r){
                int mid=(l+r)/2;
                if(check(mid,K,L,R,p)){
                    r=mid-1;
                    ans=mid;
                }
                else l=mid+1;
            }
            cout<<ans<<endl;
            x=ans;
        }
    }
    return 0;
}

1010Minimal Power of Prime(分类讨论)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e4+50;
bool check[maxn];
ll prime[maxn],cnt;
void init(){
    for(int i=2;i<maxn;i++){
        if(!check[i]){
            prime[++cnt]=i;
        }
        for(int j=1;j<=cnt;j++){
            if(i*prime[j]>=maxn)break;
            check[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}
int get(ll &x){
    int ans=99999;
    for(ll i=1;i<=cnt&&1LL*prime[i]*prime[i]<=x;i++){
        if(x%prime[i]==0){
            int oo=0;
            while(x%prime[i]==0){
                oo++;
                x/=prime[i];
            }
            ans=min(oo,ans);
        }
    }
    return ans;
}
int main(){
    std::ios::sync_with_stdio(false);
    int t;
    init();
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        int ans=99999;
        if(n==1)ans=0;
        ll u=n;
        ans=get(u);
        if(u==1){
            cout<<ans<<endl;continue;
        }
        else{
            ll o4=powl(u,0.25)+0.5,o2=powl(u,0.5)+0.5,o3=powl(u,1.0/3.0)+0.5;
            if(o4*o4*o4*o4==u)ans=min(4,ans);
            else if(o3*o3*o3==u)ans=min(3,ans);
            else if(o2*o2==u)ans=min(2,ans);
            else ans=min(1,ans);
            cout<<ans<<endl;
        }
    }
    return 0;
}