Gym-101177B 递归想法题

题意:一串无限长的0,有m个操作(m<2e5),在每个x后面加一个y,最后一次查询L--R的数字,(L,R<1e6)

思路:看起来非常复杂,实际上突破口在于L,R很小,虽然操作复杂,直接模拟会单次操作on,但是我们可以考虑一个一个字符构造,实际上就是一个递归的过程。具体方法可以大家尝试一个一个字符构造,然后递归模拟就好了。

代码:

 

#include<bits/stdc++.h>
#define PB push_back
#define pii pair<int,int>
#define MP make_pair
#define X first
#define Y second
using namespace std;
const int maxn=2e6+10;
int ans[maxn],x,y,cnt=1,l,r,n;
vector<pii > v[maxn];
void dfs(int x,int y,int tim){
    if(y<0||cnt+5>maxn||v[x][y].Y<tim) return;
    ans[cnt++]=v[x][y].X;
    dfs(v[x][y].X,v[v[x][y].X].size()-1,v[x][y].Y);
    dfs(x,y-1,tim);
    return;
}
int main() {
    memset(ans,-1,sizeof(ans));
    ans[0]=0;
    scanf("%d%d%d",&n,&l,&r);
    for(int i=0;i<n;i++) scanf("%d%d",&x,&y),v[x].PB(MP(y,i));
    dfs(0,v[0].size()-1,-1);
    for(int i=l;i<r;i++) printf("%d%c",ans[i%cnt]," \n"[i==r-1]);
	return 0;
}



 

posted @ 2017-10-09 14:17  zhangxianlong  阅读(126)  评论(0编辑  收藏  举报