點此看題
1
11不可能多次出現,那麼我們只需要考慮為奇數的質數了,由於乙個質數是由乙個奇數和乙個偶數組成,故分成兩部分,把它當二分圖來看待,中間連的邊就表示這兩個相加為質數。
把中間邊設定為inf
infin
f,其他邊設為1
11,然後跑最大流,因為最大流等於最小割,然而這裡如果存在起終點聯通就是存在兩個求和為質數,所以我們需要求最小割,最後的答案為n−n-
n−最小割。
還有很重要的一點就是要用當前弧優化,這道題卡樸素din
ic
dinic
dinic。
#include
#include
#include
#include
using
namespace std;
#define inf 0x3f3f3f3f
const
int m =
3005
;const
int n =
200005
;int
read()
int n,flag,ans,tot,cnt,s,t,a[m]
,f[m]
,cur[m]
,dis[m]
,p[n]
,vis[n]
;queue<
int> q;
struct edge
e[m*m*2]
;void
sieve
(int n)}}
void
add(
int u,
int v,
int c)
,f[u]
=tot;
e[++tot]
=edge
,f[v]
=tot;
}int
bfs()}
}if(!dis[t]
)return0;
return1;
}int
dfs(
int u,
int ept)
}return flow;
}signed
main()
if(a[i]==1
) flag=1;
}for
(int i=
1; i<=n; i++
)for
(int j=
1; j<=n; j++
)for
(int i=
1; i<=n; i++
)while
(bfs()
)printf
("%d\n"
,n-ans)
;}
JSOI2016 最佳團隊
這種最大化形如 x y 的式子的題,很容易想到分數規劃。二分答案,對於當前的mid,設d i p i mid s i 考慮到當乙個節點i被選,那麼fa i 也要被選,那麼乙個想法是選取當前最大的d,然後把它的兒子的d放入堆裡。但是這個方法是錯誤的 然而我一開始就這麼打了,只有10分 題目給出的是一棵...
JSOI2016 最佳團隊
看到這個什麼比值最大,立馬想到了二分答案。然後就變成了乙個樹上揹包問題,直接暴力合併揹包即可。暴力合併不是o n3 的嗎?記錄一下子樹的大小,揹包時的上界設為這個,就降成o n2 感性證明 你可以想象兩個點只會在它們的lca處合併。code include include define fd i,x...
JSOI 2016 最佳團體
有 n n 名候選人,從 1 role presentation 11到 n n 編號,有乙個隊長的編號為 0 role presentation 0 0,每個候選人都由一位編號比他小的候選人推薦 如果為 0 0 則表示是隊長推薦的 隊長希望招募 k role presentation k k個人,...