国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

code vs 1553 互斥的數(shù) (map+dfs)

2019-11-08 02:18:10
字體:
供稿:網(wǎng)友

題目描述 Description

有這樣的一個(gè)集合,集合中的元素個(gè)數(shù)由給定的N決定,集合的元素為N個(gè)不同的正整數(shù),一旦集合中的兩個(gè)數(shù)x,y滿足y = P*x,那么就認(rèn)為x,y這兩個(gè)數(shù)是互斥的,現(xiàn)在想知道給定的一個(gè)集合的最大子集滿足兩兩之間不互斥。

輸入描述 Input Description

輸入有多組數(shù)據(jù),每組第一行給定兩個(gè)數(shù)N和P(1<=N<=10^5, 1<=P<=10^9)。接下來一行包含N個(gè)不同正整數(shù)ai(1<=ai<=10^9)。

輸出描述 Output Description

輸出一行表示最大的滿足要求的子集的元素個(gè)數(shù)。

樣例輸入 Sample Input

4 2

1 2 3 4

樣例輸出 Sample Output

3

題解:dfs+map 

這道題剛開始一直在想2-sat,但是發(fā)現(xiàn)只能判斷是否有合法的解,并不能找出滿足條件的最大子集(最起碼我不會(huì))。

然后開始想hash,又不是什么序列,hash個(gè)屁啊,根本不可做么。

然后開始分析互斥關(guān)系,發(fā)現(xiàn)所有的互斥關(guān)系形成的都是互不相交的鏈,對(duì)于鏈的話我們希望相鄰的元素不能同時(shí)入選,那么我們至少需要放棄n/2個(gè)點(diǎn)(其中n是鏈中點(diǎn)的個(gè)數(shù))

所有只要找出鏈計(jì)算一下就好了。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<map>#define N 100003#define LL long long using namespace std;map<int,int> mp;int n,p,a[N],b[N],nxt[N],vis[N],cnt,ans;int cmp(int x,int y){	return a[x]<a[y];}void dfs(int x){	//cout<<x<<" ";	++cnt;	vis[x]=1;	if (!nxt[x]) return;	dfs(nxt[x]);}int main(){	freopen("a.in","r",stdin);	scanf("%d%d",&n,&p);	for (int i=1;i<=n;i++) 	 scanf("%d",&a[i]),b[i]=i,mp[a[i]]=i;	sort(b+1,b+n+1,cmp);	for (int i=1;i<=n;i++) {		LL t=(LL)a[i]*p;		if (t>1000000000) continue;	    nxt[i]=mp[t];	}	for (int i=1;i<=n;i++)	 if (!vis[b[i]]) {	  cnt=0;	  dfs(b[i]);	  ans+=cnt/2;	//  cout<<endl;    }    PRintf("%d/n",n-ans);}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盐津县| 任丘市| 台北县| 肇州县| 稷山县| 嘉义县| 乌兰浩特市| 南投市| 独山县| 阳曲县| 乐陵市| 玛沁县| 乌鲁木齐县| 宜丰县| 江北区| 西峡县| 南康市| 龙门县| 小金县| 华容县| 淳安县| 科技| 周口市| 饶阳县| 兴城市| 沾益县| 班戈县| 行唐县| 无锡市| 商水县| 高邮市| 甘南县| 锡林郭勒盟| 乌拉特后旗| 江西省| 南皮县| 平定县| 竹山县| 金华市| 景德镇市| 福鼎市|