题意:一串无限长的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],"
"[i==r-1]);
return 0;
}