NOIP校內模擬 T2 字胡串(分治)

2021-08-30 11:41:28 字數 945 閱讀 9153

%%%%%%%%%%%lst神仙 這是他的做法 吊了標算

對於這種有多少區間滿足要求的 我們套路的用分治做 每次都統計左端點在左半邊 右端點在右半邊的個數

設f(i) 表示當前點到中間分割點的最大值,g(i)表示當前點到中間分割點的或和

我們發現 g(i)≥f(i) 所以只需找到g[i]=f[i]的區間就好

然後f肯定是單調遞增的

所以可以維護雙指標

邊界條件很壞壞 膜lst神仙啊

#include#define n 1000005

#define int long long

using namespace std;

templateinline void read(t &x)

int n,s[n],f[n],g[n],ans;

inline void solve(int l,int r)

{ if(l>=r) return;

int mid=(l+r)>>1;

f[mid]=s[mid],f[mid+1]=s[mid+1];

for(int i=mid-1;i>=l;i--) f[i]=max(s[i],f[i+1]);

for(int i=mid+2;i<=r;i++) f[i]=max(s[i],f[i-1]);

g[mid]=s[mid],g[mid+1]=s[mid+1];

for(int i=mid-1;i>=l;i--) g[i]=s[i]|g[i+1];

for(int i=mid+2;i<=r;i++) g[i]=s[i]|g[i-1];

int pos=mid;

for(int i=mid;i>=l;i--) //左端點

{if(f[i]==g[i])

{while(posl&&((g[pos-1]|g[i])==g[i])&&f[pos-1]

NOIP校內模擬 T2 字胡串(分治)

lst神仙 這是他的做法 吊了標算 對於這種有多少區間滿足要求的 我們套路的用分治做 每次都統計左端點在左半邊 右端點在右半邊的個數 設f i 表示當前點到中間分割點的最大值,g i 表示當前點到中間分割點的或和 我們發現 g i f i 所以只需找到g i f i 的區間就好 然後f肯定是單調遞增...

NOIP模擬 字胡串(單調棧)

只剩5分鐘的時候打了乙個三重迴圈。完全沒想到固定左端點減少1個n。被diss了一波。對於乙個區間,如果他合法,那麼一定是有乙個非最大數在二進位制下與最大數有不同的地方,所以對於乙個數,利用單調棧記錄他作為最大數的區間 左右第乙個至少有一位與他不同的地方,利用容斥原理計算一下統計答案即可,複雜度 然後...

NOIP 模擬題 T2 寶藏(樹形dp)

題解 樹形dp 其實這道題說起來很簡單,用四個陣列 d1 d0 u0 u1分別表示從當前點向下更新,不返回 從當前點向下更新再回到當前點 從當前點向上更新回到當前點 從當前點向上更新不返回。用兩遍dfs求出這四個陣列 實現起來細節會比較多,耐心處理 include include include d...