【BZOJ】【3275】Numbers

网络流/最小割



  Orz了Jiry_2神犇,蒟蒻网络流建模什么的完全不会啊T_T

  按奇偶性来分组实在太巧妙了……然后相关的点之间连边表示只能选其一,来求最小割……

  1 /**************************************************************
  2     Problem: 3275
  3     User: Tunix
  4     Language: C++
  5     Result: Accepted
  6     Time:1252 ms
  7     Memory:1708 kb
  8 ****************************************************************/
  9
 10 //BZOJ 3275
 11 #include<cmath>
 12 #include<vector>
 13 #include<cstdio>
 14 #include<cstring>
 15 #include<cstdlib>
 16 #include<iostream>
 17 #include<algorithm>
 18 #define rep(i,n) for(int i=0;i<n;++i)
 19 #define F(i,j,n) for(int i=j;i<=n;++i)
 20 #define D(i,j,n) for(int i=j;i>=n;--i)
 21 #define pb push_back
 22 using namespace std;
 23 inline int getint(){
 24     int v=0,sign=1; char ch=getchar();
 25     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
 26     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
 27     return v*sign;
 28 }
 29 const int N=3100,M=30010,INF=~0u>>2;
 30 typedef long long LL;
 31 /******************tamplate*********************/
 32 int n,m,a[3010],tot,ans;
 33 struct edge{
 34     int to,v;
 35 };
 36 int gcd(int a,int b){if (!b) return a;else return gcd(b,a%b);}
 37 bool judge(int a,int b){
 38     int s=a*a+b*b;
 39     int q=int(sqrt(s));
 40     if (q*q!=s) return 0;
 41     if (gcd(a,b)!=1) return 0;
 42     return 1;
 43 }
 44 struct Net{
 45     edge E[M];
 46     int head[N],next[M],cnt;
 47     bool vis[110][110];
 48     void ins(int x,int y,int v){
 49         E[++cnt]=(edge){y,v};
 50         next[cnt]=head[x]; head[x]=cnt;
 51     }
 52     void add(int x,int y,int v){
 53         ins(x,y,v); ins(y,x,0);
 54     }
 55     int s,t,cur[N],d[N],Q[N];
 56     void init(){
 57         n=getint();cnt=1;
 58         tot=ans=0;
 59         s=0; t=n+1;
 60         F(i,1,n){
 61             a[i]=getint();tot+=a[i];
 62             if (a[i]&1) add(s,i,a[i]);
 63             else add(i,t,a[i]);
 64         }
 65         F(i,1,n) if (a[i]&1)
 66             F(j,1,n) if ((a[j]&1)==0)
 67                 if (judge(a[i],a[j])) add(i,j,INF);
 68     }
 69     bool mklevel(){
 70         memset(d,-1,sizeof d);
 71         d[s]=0;
 72         int l=0,r=-1;
 73         Q[++r]=s;
 74         while(l<=r){
 75             int x=Q[l++];
 76             for(int i=head[x];i;i=next[i])
 77                 if (d[E[i].to]==-1 && E[i].v){
 78                     d[E[i].to]=d[x]+1;
 79                     Q[++r]=E[i].to;
 80                 }
 81         }
 82         return d[t]!=-1;
 83     }
 84     int dfs(int x,int a){
 85         if (x==t) return a;
 86         int flow=0;
 87         for(int &i=cur[x];i && flow<a;i=next[i])
 88             if (E[i].v && d[E[i].to]==d[x]+1){
 89                 int f=dfs(E[i].to,min(a-flow,E[i].v));
 90                 E[i].v-=f;
 91                 E[i^1].v+=f;
 92                 flow+=f;
 93             }
 94         if (!flow) d[x]=-1;
 95         return flow;
 96     }
 97     void Dinic(){
 98         while(mklevel()){
 99             F(i,s,t) cur[i]=head[i];
100             ans+=dfs(s,INF);
101         }
102     }
103 }G1;
104 int main(){
105 #ifndef ONLINE_JUDGE
106     freopen("3275.in","r",stdin);
107     freopen("3275.out","w",stdout);
108 #endif
109     G1.init(); G1.Dinic();
110     printf("%d\n",tot-ans);
111     return 0;
112 }

时间: 2024-08-22 13:10:38

【BZOJ】【3275】Numbers的相关文章

P2433 - 【BZOJ 3262三维偏序】陌上花开------三维偏序

P2433 - [BZOJ 3262三维偏序]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

【BZOJ 2820】 YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 807  Solved: 404 [Submit][Status] Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示

HDOJ 2817 A sequence of numbers【快速幂取模】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2817 A sequence of numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3754    Accepted Submission(s): 1152 Problem Description Xinlv wrote so

【BZOJ】3319: 黑白树

http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种:1.查询u到根的第一条黑边的编号.2.将u到v的路径全部染成黑色 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>

【bzoj】4538: [Hnoi2016]网络

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4538 维护一个数据结构支持对于一颗树的操作,需要支持: 1.对于树上的一条路径上的每个点上放一个值. 2.撤销某次操作的路劲放. 3.查询除了经过这个点的路径的最大值. 往一个路径上丢值相当于往不经过条路径的所有点上丢值. 用一个树链剖分即可维护,对于操作区间取反. 直接查询单点最大值即可. 为了维护单点最大值,线段树中的每一个点对应两个堆,用于维护插入誉删除. 防止爆空间,所以标记永久

【BZOJ】【1089】【SCOI2003】严格n元树

高精度/递推 Orz Hzwer…… 然而我想多了…… 理解以后感觉黄学长的递推好精妙啊 顺便学到了一份高精度的板子= =233 引用下题解: f[i]=f[i-1]^n+1 ans=f[d]-f[d-1] 然后加个高精度... 话说这个数据范围是虚的吧... 极限数据根本不会做.. 1 /************************************************************** 2 Problem: 1089 3 User: Tunix 4 Language:

【BZOJ】【1050】【HAOI2006】旅行comf

枚举/暴力/Kruskal orz……我sb了……其实是sb题<_< 有一道题问的是最小极差生成树……(不记得是什么名字了,就是求最大边权与最小边权差最小的生成树)做法是枚举最小边,然后kruskal找最大边 这题同理,因为$m\leq 5000$,所以$m^2$的算法即可…… 1 /************************************************************** 2 Problem: 1050 3 User: Tunix 4 Language: C

【BZOJ】【1038】【ZJOI2008】瞭望塔

计算几何/半平面交 说是半平面交,实际上只是维护了个下凸壳而已……同1007水平可见直线 对于每条线段,能看到这条线段的点都在这条线段的“上方”,那么对所有n-1条线段求一个可视区域的交,就是求一个半平面交……(好扯) 一开始我想的是:直接找到这个下凸壳的最低点,它的y值就是答案辣-但是明显不对>_>这题让求的是塔的最低高度……不光要考虑塔顶,还要看塔底的啊! 那么我们怎么找呢?我们可以发现:随着x的变化,塔高(就是地面到凸壳的竖直距离,y坐标之差)是一个分段函数,分段点就是地面的折点以及凸壳