您的位置:首页 > 其它

Educational Codeforces Round 33 (Rated for Div. 2)A-F

2017-11-30 14:36 507 查看
总的来说这套题还是很不错的,让我对主席树有了更深的了解

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: