XJTUOJ 1017 JM的完美集合

2022-04-14 02:36:19 字數 2206 閱讀 1543

jm是強迫症晚期患者,他執著於集合的完美性,他認為,如果乙個集合中所有元素之和恰好為\(0\),那麼這個集合是完美的。

給定乙個大小為\(n\)的可重複集合\(a\),判斷該集合存在多少個非空子集是完美的。

可重複集合的意思是集合中可能有重複的元素,此時也可能存在多個相同的滿足條件的子集,要按照多個來算。

第一行乙個正整數\(n\),表示集合大小。

第二行\(n\)個整數,表示集合中的元素。

一行乙個非負整數,表示滿足條件的非空子集的個數。

\(1\leq n \leq 35\)

\(-5 \times 10^7 \leq a_i \leq 5\times 10^7\)

乙個簡單的想法就是直接dfs,然而\(n\)範圍到\(35\),會炸。

那麼記憶化搜尋呢,不行,數太大,空間不夠。

所以我們做這樣的處理:我們把原集合分成兩半,在第乙個集合中,我們遍歷所有的取數可能,假設當前取到的sum為\(x\),然後,我們再在第二個集合中找————有多少種取數方法使\(sum'=-x\)

而對於這兩個小集合,集合大小都是18以內,計算一下\(2^=262144\),不會tle,完美!

所以我們先操作第二個集合,把所有可能的值扔到乙個multiset裡面便於查詢。

注意!!!我們這麼做會多算一種情況,就是什麼都不選,這是不合題意的,所以ans要-1

可是毒瘤出題人卡multiset,這種做法只能拿到95分(真是*疼的分數。。。)

不過,趁此機會練習一下資料結構也是不錯的呢。

#include #include #include #include #define ll long long

using namespace std;

ll a[40];

multisets;

int main()

s.insert(0);

t = 1 << (n >> 1);

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

s.insert(sum);

}t = 1 << ((n + 1) >> 1);

for (i = 0; i < t; i++)

ans += s.count(-sum);

}ans--;

printf("%lld", ans);

return 0;

}

#include #define ll long long

#define maxn 300000

using namespace std;

ll a[40];

struct splaytree tree[maxn];

int root, size;

private:

void zig(int x)

void zag(int x)

void splay(int x) else else if (tree[z].rson == y && tree[y].rson == x) else if (tree[z].lson == y && tree[y].rson == x) else }}

root = x;

}void insert(int pos, int x)

if (tree[pos].val < tree[x].val)

} else

}return;

}int build(ll x)

ll query(int pos, ll x)

int find(int pos, ll x)

public:

void push(ll x)

ll count(ll x)

void clear()

} s;

int main()

s.clear();

s.push(0);

t = 1 << (n >> 1);

for (register int i = 1; i < t; ++i)

s.push(sum);

}t = 1 << ((n + 1) >> 1);

for (register int i = 0; i < t; ++i)

ans += s.count(-sum);

}ans--;

printf("%lld", ans);

return 0;

}

1017 乘積最大

題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數...

1017 乘積最大

題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數...

10 17 考試總結

2017年10月17日 noip模擬賽 第一道題是模擬。大致的思路是判斷所有錯誤的情況,比如兩個運算子連用 括號不匹配。正確的情況很多,但是錯誤的型別就那麼幾種,依次判斷一下。在輸入的時候可以有乙個技巧,對於數字來說,乙個數字和連續的多個數字是一樣的,所以在前乙個字元是數字時,如果下乙個讀入的也是數...