把輸入的 \(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 ...