Gym-101177B 遞迴想法題
阿新 • • 發佈:2018-12-01
題意:一串無限長的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; }