萌新求助卡常。
查看原帖
萌新求助卡常。
317459
RyexAwl新暗车楼主2023/2/3 10:48

rt。拉插。TLE 85 pts。

#include <bits/stdc++.h>

#define rep(i,l,r) for (int i = l; i <= r; i++)
#define per(i,r,l) for (int i = r; i >= l; i--)
#define fi first
#define se second
#define pb push_back
#define mp std::make_pair
#define gin std::cin
#define prt std::cout
#define edl std::endl

namespace Main {
  const int N = 305,mod = 1e9 + 7;
  int n,pre[N],suf[N],invfac[N];
  int A[N],B[N];
  std::vector<int> a;
  int y[2][2205][N];
  int id[N][N],f[305][2205],tot;
  bool vis[305][2205],flag[N][N];
  std::vector<std::pair<int,int>> range;
  inline int lag(int len,int x,int y[]) {
    if (x <= len) return y[x]; 
    pre[0] = suf[len + 1] = 1;
    rep(i,1,len) pre[i] = 1ll * pre[i - 1] * (x - i + mod) % mod;
    per(i,len,1) suf[i] = 1ll * suf[i + 1] * (x - i + mod) % mod;
    int res = 0;
    rep(i,1,len) {
      int cur = y[i];
      if (cur == 0) continue; 
      cur = 1ll * cur * pre[i - 1] % mod * suf[i + 1] % mod;
      cur = 1ll * cur * invfac[i - 1] % mod * invfac[len - i] % mod;
      if ((len - i) & 1) cur = (mod - cur) % mod;
      res = (res + cur) % mod;
    }
    return res;
  } 
  void dfs(int l,int r) {
    if (l > r) return;
    if (flag[l][r]) return;
    flag[l][r] = true;
    id[l][r] = ++ tot; range.push_back({l,r});
    rep(k,l,r) if (abs((k - l) - (r - k)) <= 2) {
      dfs(l,k - 1); dfs(k + 1,r);
    }
  }
  int DP(int l,int r,int i,int j) {
    if (l > r) return 1;
    if (vis[j][id[l][r]]) return f[j][id[l][r]];
    vis[j][id[l][r]] = true;
    if (j == 0) {
      if (i == 0) {
        f[j][id[l][r]] = 0;
        return f[j][id[l][r]];
      }
      if (a[i] - a[i - 1] <= n + 1) {
        f[j][id[l][r]] = y[(i - 1) & 1][id[l][r]][a[i] - a[i - 1]];
      } else f[j][id[l][r]] = lag(r - l + 2,a[i] - a[i - 1],y[(i - 1) & 1][id[l][r]]); 
      return f[j][id[l][r]];
    }
    f[j][id[l][r]] = DP(l,r,i,j - 1);
    int mid = (l + r) >> 1;
    for (int k = std::max(l,mid - 1); k <= std::min(r,mid + 1); k++) {
      if (a[i] + j - 1 < A[k] || a[i] + j - 1 > B[k]) continue;
      if (abs((r - k) - (k - l)) > 2) continue;
      int ls = DP(l,k - 1,i,j),rs = DP(k + 1,r,i,j - 1);
      if (!ls || !rs) continue; 
      f[j][id[l][r]] = (1ll * f[j][id[l][r]] + 1ll * DP(l,k - 1,i,j) * DP(k + 1,r,i,j - 1) % mod) % mod;
    }
    y[i & 1][id[l][r]][j] = f[j][id[l][r]];
    return f[j][id[l][r]];
  }
  void main() {
    scanf("%d",&n); rep(i,1,n) scanf("%d%d",&A[i],&B[i]);
    invfac[0] = invfac[1] = 1; rep(i,2,n + 1) invfac[i] = 1ll * (mod - mod / i) * invfac[mod % i] % mod;
    rep(i,2,n + 1) invfac[i] = 1ll * invfac[i - 1] * invfac[i] % mod;
    rep(i,1,n) {
      a.push_back(A[i]); a.push_back(B[i] + 1);
    } dfs(1,n);
    std::sort(a.begin(),a.end()); a.erase(std::unique(a.begin(),a.end()),a.end());
    for (int i = 0; i + 1 < (int)a.size(); i++) {
      memset(vis,false,sizeof vis);
      for (auto j : range) {
        per(k,std::min(a[i + 1] - a[i],n + 1),1) DP(j.first,j.second,i,k); 
      }
    }
    int k = (int)a.size() - 2; printf("%d",lag(n + 1,a[k + 1] - a[k],y[k & 1][id[1][n]]));
  }
} signed main() { Main::main(); return 0; }
2023/2/3 10:48
加载中...