这个条件非常妙啊,奇数和奇数一定满足1,因为\( (2a+1)2+(2b+1)2=4a2+4a+4b2+4b+2=2(2(a2+a+b2+b)+1) \)里面这个一定不是平方数因为除二后是个奇数不能再分一个2出来;偶数和偶数一定满足2,因为gcd>=2

考虑最小割,先加上所有收益然后求割之后满足条件的最小代价

所以对于a[i]&1,连接(s,i,b[i]),否则连接(i,t,b[i]),对于不能同时选的i,j来说,连(i,j),表示要么割掉i的收益要么割掉j的收益

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<cmath>
  6. using namespace std;
  7. const int N=2005;
  8. int n,a[N],b[N],h[N],cnt=1,le[N],s,t,ans;
  9. struct qwe
  10. {
  11. int ne,to,va;
  12. }e[N*N];
  13. int read()
  14. {
  15. int r=0,f=1;
  16. char p=getchar();
  17. while(p>'9'||p<'0')
  18. {
  19. if(p=='-')
  20. f=-1;
  21. p=getchar();
  22. }
  23. while(p>='0'&&p<='9')
  24. {
  25. r=r*10+p-48;
  26. p=getchar();
  27. }
  28. return r*f;
  29. }
  30. void add(int u,int v,int w)
  31. {
  32. cnt++;
  33. e[cnt].ne=h[u];
  34. e[cnt].to=v;
  35. e[cnt].va=w;
  36. h[u]=cnt;
  37. }
  38. void ins(int u,int v,int w)
  39. {
  40. add(u,v,w);
  41. add(v,u,0);
  42. }
  43. bool bfs()
  44. {
  45. memset(le,0,sizeof(le));
  46. queue<int>q;
  47. le[s]=1;
  48. q.push(s);
  49. while(!q.empty())
  50. {
  51. int u=q.front();
  52. q.pop();
  53. for(int i=h[u];i;i=e[i].ne)
  54. if(e[i].va>0&&!le[e[i].to])
  55. {
  56. le[e[i].to]=le[u]+1;
  57. q.push(e[i].to);
  58. }
  59. }
  60. return le[t];
  61. }
  62. int dfs(int u,int f)
  63. {
  64. if(u==t||!f)
  65. return f;
  66. int us=0;
  67. for(int i=h[u];i&&us<f;i=e[i].ne)
  68. if(e[i].va>0&&le[e[i].to]==le[u]+1)
  69. {
  70. int t=dfs(e[i].to,min(e[i].va,f-us));
  71. e[i].va-=t;
  72. e[i^1].va+=t;
  73. us+=t;
  74. }
  75. if(!us)
  76. le[u]=0;
  77. return us;
  78. }
  79. int dinic()
  80. {
  81. int r=0;
  82. while(bfs())
  83. r+=dfs(s,1e9);
  84. return r;
  85. }
  86. int gcd(int a,int b)
  87. {
  88. return !b?a:gcd(b,a%b);
  89. }
  90. long long clc(int a,int b)
  91. {
  92. return 1ll*a*a+1ll*b*b;
  93. }
  94. int main()
  95. {
  96. n=read();
  97. for(int i=1;i<=n;i++)
  98. a[i]=read();
  99. for(int i=1;i<=n;i++)
  100. b[i]=read();
  101. s=0,t=n+1;
  102. for(int i=1;i<=n;i++)
  103. {
  104. if(a[i]&1)
  105. ins(s,i,b[i]);//,cerr<<i<<endl;
  106. else
  107. ins(i,t,b[i]);
  108. ans+=b[i];
  109. }
  110. for(int i=1;i<=n;i++)
  111. if(a[i]&1)
  112. for(int j=1;j<=n;j++)
  113. if(!(a[j]&1)&&gcd(a[i],a[j])==1&&(long long)sqrt(clc(a[i],a[j]))*(long long)sqrt(clc(a[i],a[j]))==clc(a[i],a[j]))
  114. ins(i,j,1e9);//,cerr<<i<<" "<<j<<endl;
  115. printf("%d\n",ans-dinic());
  116. return 0;
  117. }

bzoj 3158: 千钧一发【最小割】的更多相关文章

  1. bzoj 3158 千钧一发 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 \( a[i] \) 是奇数则满足条件1,是偶数则显然满足条件2: 因为如果把两个奇数 ...

  2. BZOJ 3158 千钧一发 最小割

    分析: 偶数对满足条件2,所有奇数对满足条件1. 如果你能一眼看出这个规律,这道题就完成了一半. 我们只需要将数分为两类,a值为奇数,就从S向这个点连容量为b值的边,a值为偶数,就从这个点向T连容量为 ...

  3. bzoj 3158 千钧一发(最小割)

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 767  Solved: 290[Submit][Status][Discuss] ...

  4. 【BZOJ-3275&3158】Number&千钧一发 最小割

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 748  Solved: 316[Submit][Status][Discus ...

  5. BZOJ 3158: 千钧一发

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1201  Solved: 446[Submit][Status][Discuss ...

  6. bzoj 3158 千钧一发——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 发现偶数之间一定满足第二个条件:奇数之间一定满足第一个条件 ( \( (2m+1)^{ ...

  7. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  8. BZOJ 3158 千钧一发 (最大流->二分图带权最大独立集)

    题面:BZOJ传送门 和方格取数问题很像啊 但这道题不能像网格那样黑白染色构造二分图,所以考虑拆点建出二分图 我们容易找出数之间的互斥关系,在不能同时选的两个点之间连一条流量为$inf$的边 由于我们 ...

  9. bzoj 2229 [Zjoi2011]最小割(分治+最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...

随机推荐

  1. js怎么select 选中的值

    var obj = document.getElementById(”SelectID”); var index = obj.selectedIndex; // 选中索引var text = obj. ...

  2. 九度OJ 1127:简单密码 (翻译)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1218 解决:721 题目描述: Julius Caesar曾经使用过一种很简单的密码. 对于明文中的每个字符,将它用它字母表中后5位对应的 ...

  3. java中Integer在JDK1.6和JDK1.7中的区别

    运行下面这段代码: System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); Sy ...

  4. Express中的Ejs模板传值问题

    在Ejs模板传值过程中,route下的变量值通过res.sender()中的变量参数传给views, 这时在views中若该变量在javascript代码中使用,可直接使用该变量,不必使用<% ...

  5. ZOJ - 3950 How Many Nines 【前缀和】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3950 题意 给出两个日期 求 这个日期 经过 到 另外一个日期 ...

  6. iOS 9已下的获取APP进程信息

    - (NSDictionary *)getAppInfo:(NSString *)exec withBundleID:(NSString *)bundle { if ([exec isKindOfCl ...

  7. iOS 打开应用与系统功能的调用

    [[UIApplication sharedApplication] openURL:url]; 通过给url不同的值,可以实现调用系统自带 电话/短信/邮箱/浏览器/...   1.调用 电话pho ...

  8. hdu 6058

    \(f(l,r,k)=\)区间[\(l\),\(r\)]的第k大. \(\sum_{l=1}^{n}{\sum_{r=l}^{n}{f(l,r,k)}}\) 参考题解,claris大佬题解.赛后AC. ...

  9. bzoj 1096 仓库建设 —— 斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1096 设 f[i] 为 i 作为最后一个仓库时前 i 个工厂的答案,最后的答案当然是 f[n ...

  10. bzoj 4300 绝世好题 —— 思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 记录一下 mx[j] 表示以第 j 位上是1的元素结尾的子序列长度最大值,转移即可. ...