bzoj 5285 Hnoi2018 尋寶遊戲

2022-05-11 01:42:06 字數 970 閱讀 3326

把輸入的 \(n\) 個二進位制數看作乙個大小為 \(n*m\) 的矩陣

把每一列壓成乙個二進位制數,其中最高位是最下面的元素

然後就有了 \(m\) 個二進位制數 \(b_i\),然後逐位考慮

我們把操作序列也變成乙個二進位制數 \(x\),\(1\) 為 \(\&\),\(0\) 為 \(|\)

那麼第 \(i\) 位最後的結果為 \(1\) 當且僅當 \(x(注意最高位是最下面的元素)

然後就是確定 \(x\) 的取值範圍了

如果我們把 \(b\) 陣列從大到小排序,如果確定了 \(x\) ,那麼就相當與把 \(b\) 從某個地方斷開,前面的二進位制位變成 \(1\),後面的變成 \(0\)

考慮每乙個詢問: \(r_i\)

首先滿足條件的情況一定是:在 \(b\) 陣列中,\(r\) 中所有的 \(1\) 位都在 \(0\) 位前面

找到斷點 \(i\) 之後,答案就是 \(b[i-1]-b[i]\) 了

#includeusing namespace std;

const int n=5010,mod=1000000007;

int n,m,q,p[n];char s[n];

struct data

int main()

for(int i=1;i<=m;i++)a[i].id=i;

sort(a+1,a+m+1);

for(int i=1;i<=m;i++)p[a[i].id]=i;

for(int i=1;i<=n;i++)a[0].b[i]=1;

while(q--)

t=w[i]^1;

}if(flag)puts("0");

else}}

} return 0;

}

5285 Hnoi2018 尋寶遊戲

鏈結分析 從下面依次確定運算符號,然後在確定的過程中,需要確定的位數會逐漸減少。比如最後有乙個1,如果在從下往上確定了乙個or 1,那麼再往前可以隨便選了。那麼就是要求從下往上,第乙個出現的or 1要在and 0之前。如果將這一位上的每乙個數字拿出來,從下往上構成乙個二進位制數a,把and看成1,o...

bzoj 2326 HNOI2011 數學作業

題目大意 給你n,m,求concatenate 1.n mod m的值 concatenate 1.n 代表把1到n連起來 比如n 13時 concatenate 1.n 就是12345678910111213 n 10 1 m 10 9 這題很水,對於n,將其分開,比如145,就分成1 9,10 ...

BZOJ1010 HNOI2008 玩具裝箱toy

先把程式放著,週末來更新 華麗的分割線 不想寫題解了。照著網上的題解推一邊即可 注意有的題解最後推倒出來明明是求上 下 凸包的形式,但配的圖卻是下 上 凸包的。不過斜率優化還不是搞的很懂。time limit 1 sec memory limit 162 mb submit 6661 solved ...