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
",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;
}

  

原文地址:https://www.cnblogs.com/wang9897/p/7890810.html