求助卡常
查看原帖
求助卡常
556366
FFTotoro楼主2023/11/12 15:18

RT,最后一个点死活过不去。

代码:

#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
int query(int,int);
pii solve(int k){
  vector<tuple<int,int,int,int> > q;
  function<void(int,int,int)> dfs=[&](int l,int r,int w){
    if(l==r)return;
    q.emplace_back(l,l+r>>1,w-1,0);
    q.emplace_back(l+r+1>>1,r,w-1,1);
    dfs(l,l+r>>1,w-1);
    dfs(l+r+1>>1,r,w-1);
  };
  dfs(1,1<<k,k);
  set<pii> t; t.emplace(1,1<<k);
  vector<tuple<vector<pii>,int,int,int,int> > s;
  for(auto [l,r,w,b]:q){
    if(t.find(make_pair(l,r))==t.end()){
      vector<pii> v; int p=(b?l:r);
      for(int i=w-1;i>=0;i--){
        v.emplace_back(b?p-(1<<i):p+1,b?p-1:p+(1<<i));
        b?p-=(1<<i):p+=(1<<i);
      }
      if(b){
        bool b2=false;
        if(r<(1<<k)){
          b2=true,p=r;
          for(int i=w;i>=0;i--){
            v.emplace_back(p+1,p+(1<<i));
            p+=(1<<i);
          }
        }
        s.emplace_back(v,l-(1<<w)+1,b2?(r<<1)-l+(1<<w):r,l,r);
      }
      else s.emplace_back(v,l,r+(1<<w)-1,l,r);
      for(auto [l1,r1]:v)t.emplace(l1,r1);
      t.emplace(l,r);
    }
  }
  stable_sort(s.begin(),s.end(),[](auto x,auto y){
    return get<0>(x).size()>get<0>(y).size();
  });
  for(auto [v,la,ra,l,r]:s)
    if(query(la,ra)){
      for(auto [l1,r1]:v)
        if(query(l1,r1))return make_pair(l1,r1);
      return make_pair(l,r);
    }
  return make_pair(1,1<<k);
}
2023/11/12 15:18
加载中...