摘要: 这题首先一看是一个很显然的最大流模型。。但是图中有1000*1000个点,用最大流算法是无论如何都过不去的~但是不难发现,本题的模型是一张平面图,平面图上的最大流可以用最大流最小割定理转化为对偶图上的最短路问题。。把左下建成一个点、右上建成一个点,随便哪个为源点跑一次最短路就可以了。。但是本题时限还是比较紧的。。SPFA据说可过但是也许我写的太渣。。推荐dij+heap~Code:#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>#include < 阅读全文
posted @ 2012-10-24 13:46 JS_Shining 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 前段时间TYVJ的某场模拟赛好似有这个题、、模型就是环形的均分纸牌、、这个题目其实主要是数学分析啦、、从线性的均分纸牌出发、令a[i]为纸牌树,k为每堆的目标牌数、记p[i]=k-a[i]+p[i-1] 含义就是第i堆需要从后一堆拿的纸牌、那么对p数组求和就是答案了、对这个环形的、我们这样考虑、记sum[i]=sigma(p[j]-p[j-1]) j<=i 那么可以得到p[1]=p[i]-sum[i] 即 p[i]=sum[i]+p[1]又因为最后的答案ans=sigma p[i]=sigma (s[i]+p[1]) 即数轴上s数组的点到-p[1]的距离之和、而s数组中的值的集合在取任一 阅读全文
posted @ 2012-09-24 22:07 JS_Shining 阅读(2754) 评论(1) 推荐(0) 编辑
摘要: 嗯。这个题目本身不难,但是想法还是有一点特别的,所以发出来说一下。朴素的想法是,对每一个叶节点,算一遍整个树的费用然后比较。。但是这样是平方的。必然要跪。然后注意到一点很好玩的。就是如果任意一点确定,那么它的父亲也就确定,父亲的父亲……也就确定了。那么我们找一个大家的父亲——根节点,对每个叶节点计算保持它不改的时候根节点的工资,然后统计一下即可。Code:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm># 阅读全文
posted @ 2012-06-12 22:36 JS_Shining 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 说是水题。。其实本蒟蒻1A的也只有第二道。。。惭愧惭愧。。。TYVJ1502 兴建高铁这个题目其实就是一搜索,愿意BFS或者DFS都可以,SPFA也随意。不过鉴于数据不大,推荐还是DFS(写起来比较短嘛)Code:#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <algorithm>using namespace std;int n,ans=99999999,tot=99999999;int g[51][51],v[51],w 阅读全文
posted @ 2012-06-11 22:24 JS_Shining 阅读(545) 评论(0) 推荐(0) 编辑
摘要: (标题里写个关键词骗点击)这俩题实际上是一个东西,就叫最大01子矩阵(瞎叫的)。大致是这样的模型:有一个由0和1组成的矩阵,然后要求最大的一个矩阵使得其中只包含0(1同理)。那么这个怎么做呢?当然是可以做的(废话),结合求最大正方形的方法,我们可以这样乱搞:首先预处理出所有点可以向上扩展的最长距离和向左扩展的最长距离——这个是N*M的。然后对每个点,从这个点出发向左扩展,记录一个到当前位置纵向的最小高度,每次更新答案,直至不能扩展为止——这步是N*M*K(K为向左扩展距离)的,也就是3方的、显然不管是TYVJ还是POJ,这个算法都是过不了的。经大犇指点,我了解到这个是可以用一个叫单调栈的东西优 阅读全文
posted @ 2012-06-10 21:27 JS_Shining 阅读(1047) 评论(0) 推荐(0) 编辑
摘要: 这题目一看数学色彩就很浓通过观察图(这个。。)我们就可以发现,如果按对角线剖分的话,两边可以看到的学生数都恰好是1~n-1范围内的互质数对数,即sigma(phi(i))phi就是欧拉函数,关于线性求欧拉函数可以点这里:http://blog.csdn.net/ji414341055/article/details/5771066那么这题就基本已经解决了,答案就是1~n-1的欧拉函数和*2-1,需要注意的还有两个地方:开unsigned long long和特判n<2的情况Code:#include <iostream>#include <cstdio>#incl 阅读全文
posted @ 2012-06-05 22:50 JS_Shining 阅读(1272) 评论(0) 推荐(0) 编辑
摘要: 就是线性筛嘛。。线性筛到处都有,本蒟蒻就不没事介绍了。Code:#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstdlib>using namespace std;int getlog(int a,int b){ return log(b)/log(a);}int f[10000001],p[1000001];int main(){ int n,tot=0; cin >>n; for (int i=2;i 阅读全文
posted @ 2012-06-02 21:49 JS_Shining 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 首先YM XLK大犇犇 BlinKer20:45:36傻逼暴力。等会我写。。大概意思就是如果是R*C的过R+C-gcd(R,C)BlinKer20:46:15显然gcd(R,C)是n的约数。暴力这个东西。一共是lgn种可能。然后On暴力R或C算另一个。看是不是gcd为那个数。从以上的文字中很容易可以看出这样的水题对于大犇来说已经不值一提了。作为一个蒟蒻,我整理一下大犇的思想:观察或者打表或者数学推导(一般大犇都这么搞的),可以发现,穿过的网格数等于r+c-gcd(r,c)。然后就有r+c-gcd(r,c)=n即r+c=n+gcd(r,c)两边除gcd(r,c)可知gcd(r,c)一定是N的因数 阅读全文
posted @ 2012-06-02 21:14 JS_Shining 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 就一个最小生成树。本蒟蒻还交了三次,最后才发现是数组开小了。。不能再刷水题了。。。Code:#include <iostream>#include <cstdio>using namespace std;const long maxn=999999999;long pre[301];long g[301][301];int v[301];int main(){ long n; cin >>n; pre[0]=0; for (int i=1;i<=n;i++){ cin >>g[0][i]; pre[i]=g[0][i]; v[i]=1; } 阅读全文
posted @ 2012-05-14 22:22 JS_Shining 阅读(449) 评论(0) 推荐(0) 编辑
摘要: 数论题,本人数学不好,怕讲不清楚。。发一个貌似官方的题解。Code:#include <cstdio>#include <iostream>using namespace std;int main(){ long long n,p,a,ans; while (cin >>n){ ans=n; for (long long i=2;i*i<=n;i++){ if (n%i==0) { p=i;a=0; while (n%p==0){ a++;n/=p; ... 阅读全文
posted @ 2012-05-14 22:14 JS_Shining 阅读(1715) 评论(0) 推荐(0) 编辑