zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Vue-cli
    vue—cli脚手架
    车联网——安全
    技术游玩
    高效寻找GitHub开源项目
    【孤*执】#2019SX# 最后der省选模板总结 ——BY.hss
    【浮*光】#状态压缩# 状压DPの相关练习题
    【浮*光】#字符串# 字符串の相关练习题
    【暖*墟】#数据结构# 可持久化Trie 与 XOR问题
    【浮*光】#数据结构# 数据结构の相关练习题
  • 原文地址:https://www.cnblogs.com/luowentao/p/11277779.html
Copyright © 2011-2022 走看看