11 1二中校內模擬賽T1 trie樹 遞迴

2021-08-30 15:57:34 字數 1621 閱讀 2257

玩具裝箱

(eirt.cpp/c/pas)

【問題描述】

你有兩堆物品分別有n1,n2個,每個物品有兩個屬性ai,bi。你要從兩堆中分別選乙個物品,滿足a1^a2<=m( ^表示異或)的前提下最大化b1+b2。

【輸入格式】

輸入檔名為eirt.in。

第一行包含 3 個整數 n1,n2,m。

接下來的 n1行每行包含兩個整數ai,bi。

接下來的 n2 行每行包含兩個整數ai,bi。

【輸出格式】

輸出檔名為eirt.out。

輸出1行最大sum。

【樣例輸入】

1 1 1

1 21 2

【樣例輸出】

4【資料規模與約定】

對於50% 的資料:1我們把n1裡的a值建乙個01trie樹,把a1的末尾賦為b1。

我們再用dfs+回溯求出這個點子樹中最大的b1值,記為mx[i]

好了,現在我們有乙個包含n1所有資訊的trie樹,我們考慮列舉n2的每乙個a2,只要在trie樹中找乙個合法的a1且這個a1的b1最大就行(我們把這個b1加上n2中a2的b2,再在所有b1+b2中取最大值即可

如何??

我們把m認為是代價,對於a2的每一位,走與a2相同的邊一定不花費代價,走不相同的會花費1《深度 的代價。

如果可以走不相同的邊,那相同邊所對應的那一部分子樹一定在m的代價內都能達到,所以直接取max(ans,mx)。如果可以走不相同的邊,那相同邊所對應的那一部分子樹一定在m的代價內都能達到,所以直接取max(ans,mx)。

如果不行,那麼遞迴求解相同的那一部分子樹

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=1e5+100;

inline int read()

while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();

return x*f;

}int tol;

int val[32*n];

int ch[32*n][2];

void init()

void insert(int x,int y)

u=ch[u][v];

} val[u]=max(val[u],y);

}int mx[32*n];

void dfs(int u)

if(ch[u][0])

if(ch[u][1]) }

int query(int x,int mm)

else

if(u==0) break;

if(i==0) ret=max(ret,mx[u]);

} return ret;

}int main()

dfs(0);

int ans=0;

for(i=1;i<=n2;i++)

printf("%d\n",ans);

return 0;

}

2017 9 3 校內模擬T1卡片card

題意 有三種字母,可以用兩個不同的換乙個第三種字母,兩個相同的換乙個同種字母 即消去乙個 問最後剩下的字母。第一題顯然是if題,總體來說只有三種情況 1.有三種不同的 輸出 bgr 2.有兩種不同的 3.只有一種字母 輸出這個字母 極醜 1 include2 include3 include4 us...

4 21小A模擬賽 T1

description 乙個無限長的01 序列,初始全為0,每次選擇乙個區間 l,r 進行操作,有三種操作 1 l r 將 l,r 中所有元素變成1。2 l r 將 l,r 中所有元素變成0。3 l r 將 l,r 中所有元素異或上1。每次操作後詢問最左邊的0 在哪個位置。input format ...

YCH的模擬賽 T1

括號序列問題,往往就是把左括號看成 1,右括號看成 1,我們只需要保證任意乙個字首大於等於0,且總和為0,就代表是個合法括號序列了。令 f i j 表示當前到第 i 個字元,現在的字首和 j 那麼分三種情況考慮。若第 i 1 個字元是左括號,則能轉移到 f i 1 j 1 若第 i 1 個字元是右括...