2019 Multi-University Training Contest 4 Diposting di 2019-07-31 1001 AND Minimum Spanning Tree(位运算)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#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 (结论)12345678910111213141516171819202122232425262728293031323334353637383940414243#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 (二分+主席树)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#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(分类讨论)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#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;}