求剪枝优化,tle4
查看原帖
求剪枝优化,tle4
1122530
elpsconr楼主2024/9/26 22:34

只会暴力是这样的

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep_(i,a,b) for(int i=a;i>=b;--i)
#define all(x) x.begin(),x.end()
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define lc (rt<<1)
#define rc (rt<<1|1)
mt19937_64 rnd(time(0));
const int N=5e5+5,yyx=998244353;
vector<int> ls[N],rs[N],fa[N];
int n,mi;
string s;
void dfs(int x,int now,int cnt){
  if(x>n) return;
  if(!ls[now].size()&&!rs[now].size()){
    mi=min(mi,cnt);return;
  }
  if(s[now]=='R'){
    if(rs[now].size()) dfs(x+1,rs[now][0],cnt);
    if(ls[now].size()) dfs(x+1,ls[now][0],cnt+1);
    if(fa[now].size()) dfs(x+1,fa[now][0],cnt+1);
  }
  else if(s[now]=='L'){
    if(ls[now].size()) dfs(x+1,ls[now][0],cnt);
    if(rs[now].size()) dfs(x+1,rs[now][0],cnt+1);
    if(fa[now].size()) dfs(x+1,fa[now][0],cnt+1);
  }
  else if(s[now]=='U'){
    if(fa[now].size()) dfs(x+1,fa[now][0],cnt);
    if(ls[now].size()) dfs(x+1,ls[now][0],cnt+1);
    if(rs[now].size()) dfs(x+1,rs[now][0],cnt+1);
  }
}
inline void solve(){
  cin>>n;
  mi=1e9;
  cin>>s;
  s=' '+s;
  rep(i,1,n) fa[i].clear(),ls[i].clear(),rs[i].clear();
  rep(i,1,n){
    int l,r;cin>>l>>r;
    if(l) ls[i].push_back(l),fa[l].push_back(i);
    if(r) rs[i].push_back(r),fa[r].push_back(i);
  }
  dfs(1,1,0);
  cout<<mi<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  cin>>_;
  while(_--)
  solve();
  return 0;
}
2024/9/26 22:34
加载中...