Educational Codeforces Round 33 (Rated for Div. 2)A-F
2017-11-30 14:36
507 查看
总的来说这套题还是很不错的,让我对主席树有了更深的了解
A:水题,模拟即可
F
A:水题,模拟即可
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 //#define ls l,m,rt<<1 //#define rs m+1,r,rt<<1|1 #define pii pair<int,int> using namespace std; const double g=10.0,eps=1e-12; const int N=100000+10,maxn=200000+10,inf=0x3f3f3f3f; int a ,d ,l ,r ,num; int maxd,pos ,res; int rt[N*20],ls[N*20],rs[N*20],value[N*20],tot; vector<int>v ; void dfs(int u,int c,int f) { ++num; l[u]=num; d[u]=c; maxd=max(maxd,c); for(int i=0;i<v[u].size();i++) { int x=v[u][i]; if(x==f)continue; dfs(x,c+1,u); } r[u]=num; } void build(int &o,int l,int r) { o=++tot; value[o]=1e9+10; if(l==r)return ; int m=(l+r)>>1; build(ls[o],l,m); build(rs[o],m+1,r); } void update(int &o,int l,int r,int last,int p,int va) { o=++tot; ls[o]=ls[last]; rs[o]=rs[last]; if(l==r) { value[o]=va; return ; } int m=(l+r)>>1; if(p<=m)update(ls[o],l,m,ls[last],p,va); else update(rs[o],m+1,r,rs[last],p,va); value[o]=min(value[ls[o]],value[rs[o]]); } int query(int o,int l,int r,int L,int R) { if(L<=l&&r<=R)return value[o]; int ans=1e9+10; int m=(l+r)>>1; if(L<=m)ans=min(ans,query(ls[o],l,m,L,R)); if(R>m) ans=min(ans,query(rs[o],m+1,r,L,R)); return ans; } void bfs(int n,int root) { queue<int>q; q.push(root); res=1; while(!q.empty()) { int u=q.front(); q.pop(); // cout<<u<<endl; pos[d[u]]=res;//对应深度在哪颗主席树中 update(rt[res],1,n,rt[res-1],l[u],a[u]); res++; for(int i=0;i<v[u].size();i++) { int x=v[u][i]; if(d[x]==d[u]+1)q.push(x); } } } void print(int o,int l,int r) { cout<<l<<" "<<r<<" "<<value[o]<<endl; if(l==r)return ; int m=(l+r)>>1; print(ls[o],l,m); print(rs[o],m+1,r); } int main() { /*ios::sync_with_stdio(false); cin.tie(0);*/ int n,root; scanf("%d%d",&n,&root); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<n;i++) { int a,b; scanf("%d%d",&a,&b); v[a].pb(b); v[b].pb(a); } num=tot=0; dfs(root,1,-1); /* for(int i=1;i<=n;i++) cout<<l[i]<<" "<<r[i]<<" "<<d[i]<<endl;*/ build(rt[0],1,n); // print(rt[0],1,n); bfs(n,root); /* for(int i=1;i<=n;i++) printf("%d\n",pos[i]);*/ int q,last=0; scanf("%d",&q); while(q--) { int x,k; scanf("%d%d",&x,&k); x=((x+last)%n)+1,k=(k+last)%n; k=k+d[x];k=min(k,maxd); last=query(rt[pos[k]],1,n,l[x],r[x]); printf("%d\n",last); } return 0; } /******************** 5 2 1 3 2 3 5 2 3 5 1 3 4 4 1 2 1 2 2 3 ********************/
F
相关文章推荐
- Educational Codeforces Round 33 (Rated for Div. 2) C
- Educational Codeforces Round 33 (Rated for Div. 2) D题. Credit Card(贪心)
- codeforces Educational Codeforces Round 33 (Rated for Div. 2)B
- Educational Codeforces Round 33 (Rated for Div. 2)【C】【并查集】
- Educational Codeforces Round 33 (Rated for Div. 2) 题解
- Educational Codeforces Round 33 (Rated for Div. 2)
- Educational Codeforces Round 33 (Rated for Div. 2)
- Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query (线段树)
- Educational Codeforces Round 33 (Rated for Div. 2)A-F
- Educational Codeforces Round 33 (Rated for Div. 2)
- Educational Codeforces Round 33 (Rated for Div. 2) A题. Chess For Three
- Educational Codeforces Round 33 (Rated for Div. 2) A - Chess For Three
- Educational Codeforces Round 33 (Rated for Div. 2) A-C题解
- Educational Codeforces Round 33 (Rated for Div. 2) B题. Beautiful Divisors
- Educational Codeforces Round 33 (Rated for Div. 2) B - Beautiful Divisors
- Educational Codeforces Round 33 (Rated for Div. 2) F - Subtree Minimum Query
- Educational Codeforces Round 33 (Rated for Div. 2) C - Rumor
- Educational Codeforces Round 33 (Rated for Div. 2) D. Credit Card
- Educational Codeforces Round 34 (Rated for Div. 2)
- Educational Codeforces Round 37 (Rated for Div. 2)