CF第一rated教育场
http://codeforces.com/contest/893
A:水题,暴力模拟即可
#include<bits/stdc++.h> using namespace std; #define LL long long #define N 10010 int n,a[N],tt,t; int t1=1,t2=2,t3=3; int main(){ cin>>n; int flag=0; for(int i=0;i<n;i++){ cin>>a[i]; if(a[i]!=t1&&a[i]!=t2){ cout<<"NO"<<endl; flag=1; break; } else if(a[i]==t1){ tt=t2; t2=t3; t3=tt; } else if(a[i]==t2){ tt=t1; t1=t3; t3=tt; } } if(flag==0)cout<<"YES"<<endl; return 0; }
B:数很小 可以打表判断即可 (看错题 WA了一发
#include <bits/stdc++.h> long long a[20]; long long ans[20]; long long power(int t){ long long sum=1; for(int i=1;i<=t;i++){ sum*=2; } return sum; } using namespace std; int main(){ a[0]=1; for(int i=1;i<=17;i++){ a[i]=power(i); } for(int i=0;i<=8;i++){ long long sum=0; for(int j=i+1;j<=2*i+1;j++){ sum+=a[j-1]; } ans[i]=sum; } int n;cin>>n; for(int i=8;i>=0;i--){ if(n%ans[i]==0){ printf("%d\n",ans[i]); break; } } return 0; }
C:并查集把具有朋友关系划为一类 最后不同类的最小值相加就是解(并查集写戳了 233333
#include <bits/stdc++.h> #define N 100005 #define ll long long #define INF 1000000010 using namespace std; ll a[N]; int fa[N];ll rnd[N];ll ans[N]; void csh(int n){ for(int i=1;i<=n;i++){ fa[i]=i;rnd[i]=1; } } int find1(int x){ if(x!=fa[x]) return fa[x]=find1(fa[x]); else return x; } void hebin(int x,int y){ if(rnd[x]<rnd[y]) fa[x]=y; else{ fa[y]=x; if(rnd[x]==rnd[y]) rnd[x]++; } } int main(){ int n,m; cin>>n>>m; csh(n); for(int i=1;i<=n;i++) ans[i]=INF; long long sum=0; int t1,t2; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++){ cin>>t1>>t2; int tt1=find1(t1);int tt2=find1(t2); if(tt1!=tt2){ hebin(tt1,tt2); } } for(int i=1;i<=n;i++){ int tt=find1(i); ans[tt]=min(ans[tt],a[i]); } for(int i=1;i<=n;i++){ if(ans[i]!=INF) sum+=ans[i]; } cout<<sum<<endl; return 0; }
F:一直 没看题 昨晚队友告诉我可能是线段树 早上爬起来一看 ....裸主席树 就是对一个颗树按照先序遍历的方式编号 对于不同点按照深度排序 并对于深度建主席树 最后查询即可(可能姿势不太对 跑的有点慢2333
#include <bits/stdc++.h> #define N 100005 #define INF 1000000010 using namespace std; int a[N]; vector<int>vec[N]; int dep[N];int L[N];int R[N]; int od[N];int id=0;int cnt; int rot[N]; void dfs(int v,int pre,int d){ od[v]=v;dep[v]=d;L[v]=++id; for(int i=0;i<vec[v].size();i++){ int u=vec[v][i]; if(u!=pre){ dfs(u,v,d+1); } } R[v]=id; } typedef struct node{ int l;int r;int date; }node; bool cmp(int x,int y){ return dep[x]<dep[y]; } node d[N*20]; void built(int &x,int y,int l,int r,int t,int e){ d[++cnt]=d[y];x=cnt; if(l==r){ d[x].date=min(d[x].date,e); return ; } int mid=(l+r)>>1; if(t<=mid) built(d[x].l,d[y].l,l,mid,t,e); else if(t>mid) built(d[x].r,d[y].r,mid+1,r,t,e); d[x].date=min(d[d[x].l].date,d[d[x].r].date); } int ans; void querty(int x,int l,int r,int l1,int r1){ if(l1<=l&&r<=r1){ ans=min(d[x].date,ans); return ; } int mid=(l+r)>>1; if(l1<=mid) querty(d[x].l,l,mid,l1,r1); if(r1>mid) querty(d[x].r,mid+1,r,l1,r1); } int main(){ int n,root;cin>>n>>root; d[0].date=INF; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++){ int t1,t2;cin>>t1>>t2; vec[t1].push_back(t2); vec[t2].push_back(t1); } dfs(root,-1,1); sort(od+1,od+1+n,cmp); int maxx=-1; for(int i=1;i<=n;i++){ maxx=max(maxx,dep[od[i]]); if(i==1) {built(rot[1],rot[0],1,n,L[od[i]],a[od[i]]); // cout<<rot[1]<<" "<<d[rot[1]].date<<endl; continue; } built(rot[dep[od[i]]],rot[dep[od[i-1]]],1,n,L[od[i]],a[od[i]]); // cout<<L[od[i]]<<"====="<<a[od[i]]<<endl; } for(int i=maxx+1;i<=n;i++){ rot[i]=rot[maxx]; } int q;cin>>q; int last=0;int x1,k1; for(int i=1;i<=q;i++){ cin>>x1>>k1; x1=((x1+last)%n)+1;k1=(k1+last)%n; int t=min(n,dep[x1]+k1); ans=INF; querty(rot[t],1,n,L[x1],R[x1]); // cout<<L[x1]<<" "<<R[x1]<<endl; last=ans; cout<<ans<<endl; } return 0; }