51nod 1557 兩個集合 hash

2021-08-07 13:29:28 字數 1252 閱讀 4491

1557 兩個集合

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

小x有n個互不相同的整數: p1

,p2,

...,

pn。他想把這些整數分到兩個集合a和b裡邊。但是要符合下面兩個條件。

·        如果x屬於a,那麼a-x也肯定屬於a。

·        如果x屬於b,那麼b-x也肯定屬於b。

判斷一下是否存在一種方案來分配這些數字到集合a,b中。

注意:如果乙個集合為空也是可以的。

input

單組測試資料。

第一行有三個整數n,a,b (1≤n≤10^5; 1≤a,b≤10^9)。

第二行有n個不一樣的整數 p1,p2,...,pn (1≤pi≤10^9).

output

如果可行,那麼輸出yes,否則輸出no。
input示例

樣例輸入1

4 5 9

2 3 4 5

output示例

樣例輸出1

yes

題目給的條件往往都是非常有用的,這題有乙個很有用的條件就是每乙個數都不同,如果有乙個數既能屬於a集合又能屬於b集合,就看他在這個集合a中對應的那個數

如果那個數只能和這個數匹配存在於集合a,那麼匹配,否則這個數應該屬於集合b;

坑點太多。。。

#include#include#include#include#include#include#include#include using namespace std;

const int n = 1e6+10;

typedef long long ll;

mapq;

ll s[n];

ll a, b;

int judge(ll x)

int main()

int cnt=0;

int flag=0;

for(int i=1; i<=n; i++)

}if(b>=s[i]&&q[b-s[i]]==1)

flag=1;

break;

}if(cnt!=n) flag=1;

if(flag) puts("no");

else puts("yes");

return 0;

}

51nod 1557 兩個集合

首先,我們只用分析 no 的情況,其他的都是 yes,no 的情況有兩種 one x 既不在 a 中,也不在 b 中,即找不到 a x 和 b x,no two x 既可以在 a 中,也可以在 b 中,也就是找到了 a x 和 b x,如果 x 在 a 中,那麼 b x 一定不在 b 中,因為數唯一...

51nod 1557 兩個集合

思路 暴力搜尋判斷,兩年前寫的自己都看不懂了。code include includeusing namespace std const int max n 100005 int n,a,b int c max n int d max n 2 bool book max n 2 int find i...

兩個集合 51Nod 1557

不考慮特殊情況 將x a與 x與x b建邊的話 得到很多條鏈 判一下長度奇偶就行 但是會出現a x x即a 2 x的情況 比如n 2 a 2 b 3 x 1 2,x 2 1 這時就要分個先後了 可以貪心的從鏈的端點開始 如果碰到a b 2 x這種情況就不用管x了 include using name...