BZOJ3275. Number
【题意】

【分析】
和BZOJ3158. 千钧一发基本一致
【代码】
#include<bits/stdc++.h> using namespace std; #define mp make_pair #define fi first #define se second #define lson now<<1 #define rson now<<1|1 typedef long long ll; const int maxn=3005; const int maxm=1000005; int n,m,a[maxn]; int S,T; const ll inf=1e17; int head[10005],tot=1,cur[10005]; struct edge { int to,nxt; ll v; }e[maxm<<1]; void add(int x,int y,ll z) { e[++tot].to=y; e[tot].nxt=head[x]; e[tot].v=z; head[x]=tot; e[++tot].to=x; e[tot].nxt=head[y]; e[tot].v=0; head[y]=tot; } int dep[10005]; bool bfs() { for(int i=S;i<=T;i++) dep[i]=-1,cur[i]=head[i]; // memset(dep,-1,sizeof(dep)); // memcpy(cur,head,sizeof(cur)); queue <int> q; dep[S]=0; q.push(S); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=e[i].nxt) { int to=e[i].to; if(dep[to]!=-1 || !e[i].v) continue; q.push(to); dep[to]=dep[u]+1; } } return (dep[T]!=-1); } ll dfs(int u,ll flow) { if(u==T) return flow; ll res=0; for(int &i=cur[u];i;i=e[i].nxt) { int to=e[i].to; if(dep[to]!=dep[u]+1 || e[i].v<=0) continue; ll tmp=dfs(to,min(e[i].v,flow)); flow-=tmp; res+=tmp; e[i].v-=tmp; e[i^1].v+=tmp; if(!flow) break; } if(!res) dep[u]=-1; return res; } ll ans; ll dinic() { ll ans=0; while(bfs()) { ans+=dfs(S,inf); } return ans; } int gcd(int x,int y) { if(!y) return x; return gcd(y,x%y); } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); S=0; T=n*2+1; ll sum=0; for(int i=1;i<=n;i++) sum+=a[i],add(S,i,a[i]),add(i+n,T,a[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(gcd(a[i],a[j])>1) continue; int k=sqrt(1LL*a[i]*a[i]+1LL*a[j]*a[j]); if(1LL*k*k!=1LL*a[i]*a[i]+1LL*a[j]*a[j]) continue; add(i,j+n,inf); } printf("%lld",sum-dinic()/2); return 0; }

浙公网安备 33010602011771号