玩具裝箱
(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 個字元是右括...