1. 程式人生 > >Gym-101177B 遞迴想法題

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