HNOI2018尋寶遊戲

2022-07-13 19:18:09 字數 1119 閱讀 4251

題解我們首先按位考慮。

如果有一位最終的結果為1,那麼我們可以把樹的序列看成乙個二進位制數,先出現的在底位,後出現的在高位,操作序列也可以看做乙個二進位制數,\(and\)為1,\(or\)為0,先出現的在低位,後出現的在高位。

首先操作序列是不可能把0變成1的,那麼要使最後的結果為1,就得考慮數字序列最高位的1,那麼如果操作序列的更高位有1,結果肯定會變成0,否則如果操作序列這一位不是1,那麼結果肯定是1。

如果這兩種情況都不是,那麼說明這一位操作序列和數字序列都是1,這時就得往低位繼續判斷。

如此歸納下去,如果需要滿足這一位為1,必須要求數字序列》操作序列。

再考慮多位的情況,相當於是有很多的限制。

這樣我們就會得到乙個性質,合法的序列是一段連續的二進位制數。

我們直接把所有序列拍完序後對每個詢問暴力掃就好了。

注意邊界!!!!

**

#include#define n 5009 

#define m 1009

using namespace std;

typedef long long ll;

const int mod=1000000007;

char s[n];

int n,m,q,rnk[n];

ll ji[n],cnt[n];

inline void mod(ll &x)

inline ll rd()

while(isdigit(c))

return f?-x:x;

}struct skr

}a[n];

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)rnk[a[i].id]=i;

for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)if(a[i].a[j])mod(cnt[i]+=ji[n-j]);

for(int j=1;j<=n;++j)mod(cnt[0]+=ji[n-j]);mod(cnt[0]+=1);

while(q--)

return 0;

}

題解 HNOI 2018尋寶遊戲

洛谷 bzoj連題面都不貼 題面 題目概述 給定n nn個長為m mm的01串,q qq次詢問,每次給定乙個長為m mm的目標串,求有多少種在n nn個串間填 位與 和 位或 符的方法使得最終計算結果為目標串 考試時忘記拼接程式了 o 對於10 10 10 的部分分可以o q 2n o q cdot...

Hnoi2018 遊戲 拓撲排序

一次小g和小h在玩尋寶遊戲,有n個房間排成一列,編號為 1,2,n 1,2 n 相鄰的房間之間都有一道門。其中一部分們上鎖 因此需要有對應的鑰匙才能開門 其餘的門都能直接開啟。現在小g告訴了小h每把鎖的鑰匙在哪個房間裡 每把鎖鎖有且只有一把鑰匙與之對應 並作出p次指示 第i次讓小h從第 si s i...

5285 Hnoi2018 尋寶遊戲

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