I and OI
Past...
摘要: 我们新建一个0号点,作为水库的水源,到每个点的费用就是wi.注意到每个点的水源只有一个,所以最后答案是一棵树.显然是最小生成树了.code:/************************************************************** Problem: 1601 User: exponent Language: Pascal Result: Accepted Time:100 ms Memory:584 kb ****************************************************************/ const maxn= 阅读全文
posted @ 2011-08-13 20:55 exponent 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 水题.对于最后的方案,表达式必然是下面这个样子的:(Xa1-Xb1)+(Ya1-Yb1)+(Xa2-Xb2)+(Ya2-Yb2)+...+(Xan-Xbn)+(Yan-Ybn)去掉括号,就等于|∑Xai-∑Xbi|+|∑Yai-∑Ybi| (1<=i<=n)读入完就出解了.code:/************************************************************** Problem: 1108 User: exponent Language: Pascal Result: Accepted Time:908 ms Memory:224 kb 阅读全文
posted @ 2011-08-13 18:50 exponent 阅读(227) 评论(0) 推荐(0) 编辑
摘要: f[i]=∑f[j] (sum[j]<=sum[i]).sum为前缀和.裸的DP是O(N^2)的,其实我们要找的j只需满足sum[j]<=sum[i],然后求和.而树状数组天生就是干这个的.范围大,离散化一下就好了.code:/************************************************************** Problem: 2274 User: exponent Language: Pascal Result: Accepted Time:140 ms Memory:2568 kb *************************** 阅读全文
posted @ 2011-08-13 17:20 exponent 阅读(304) 评论(0) 推荐(0) 编辑
摘要: CEOI2004Two的加强版.code:/************************************************************** Problem: 1096 User: exponent Language: Pascal Result: Accepted Time:6220 ms Memory:51008 kb ****************************************************************/ const oo=1e100; maxn=1000001; var f,x,p,c,sum,cost:array[ 阅读全文
posted @ 2011-08-13 16:41 exponent 阅读(404) 评论(0) 推荐(0) 编辑
摘要: 题意:N头牛叠罗汉,每头牛有个体重Wi,力气Si.一头牛要承担的风险为所有在它上面的牛的体重之和-它的力气.求一个方案使得风险最大的牛的风险值最小.分析:对于相邻的两头牛,它们交换位置不影响其他的任何牛,只改变这两头牛的风险值.记sum为这两头牛上面的牛的体重总和.i在j上面Riski=sum-siRiskj=sum+wi-sj交换位置Riski'=sum+wj-siRiskj'=sum-sj方案1优于方案2,则max{Riski,Riskj}<max{Riski',Riskj'}而Riskj>Riskj'所以Riski'>ma 阅读全文
posted @ 2011-08-13 14:28 exponent 阅读(866) 评论(0) 推荐(0) 编辑
摘要: 题意:求将N分成K个不同质数的和的方案数.分析:筛法,然后直接背包之~~.code:const MAX=1200; maxn=1200; maxk=15;var Prime:array[0..MAX] of longint; P:array[0..MAX] of boolean; f:array[0..maxn,0..maxk] of longint; size,n,k,i,j,o,tmp:longint; procedure GetPrime; begin size:=0; fillchar(P,sizeof(P),0); for i:=2 to MAX do begin if not P[ 阅读全文
posted @ 2011-08-13 14:07 exponent 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 基本同RQNOJ的POWER.见我写的解题报告:http://www.cnblogs.com/exponent/archive/2011/08/08/2130723.htmlcode:const oo=1000000000000000;var f:array[0..1010,0..1010,0..1] of int64; g:array[0..1010,0..1010] of longint; d:array[0..1010] of longint; n,i,j,l,p:longint; flag:boolean; procedure sort(l,r:longint); var i,j,mi 阅读全文
posted @ 2011-08-13 14:01 exponent 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 题意:给出M,S,和M对ai,bi.选出最少对的ai,bi,使得(∑ai)^2+(∑bi)^2=s^2.分析:背包.f[i,j]表示构成∑ai=i,∑bi=j的最少对数.(很少人做的水题)code:const oo=16843009;var f:array[0..310,0..310] of longint; a,b:array[0..50] of longint; n,m,s,d,o,i,j,k,ans:longint; function min(a,b:longint):longint; begin if a>b then exit(b); exit(a); end;begin re 阅读全文
posted @ 2011-08-13 13:59 exponent 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 题意:求C(N,M)的约数个数.分析:暴力分解质因数会TLE.所以先预处理.记cnt[i,j]为i的阶乘中含第j个质数的个数(这样做要先筛素数).然后C(N,M)=N!/(M!*(N-M)!)中含第i个质数的个数就是cnt[n,i]-cnt[m,i]-cnt[n-m,i].这样就OK了(刷到了pascal的rank1).code:const MAX=440;var Prime:array[0..MAX] of longint; v:array[0..MAX] of boolean; cnt:array[0..max,0..100] of longint; size,n,m,i,j,num,tm 阅读全文
posted @ 2011-08-13 13:54 exponent 阅读(474) 评论(0) 推荐(0) 编辑
摘要: 题意:求第K个和M互质的数.分析:求一个数和多少个数互质可以用容斥原理,二分一个数验证是不是第K个即可(16MS).(另一种用欧拉函数的算法更快.)code:var p,c:array[0..10000] of longint; prime:array[0..100] of longint; v:array[0..1000001] of boolean; u:array[0..100] of boolean; m,n,k,i,nx,num:longint; l,r,mid,t:int64; procedure make(k,num:longint); var o:longint; begin 阅读全文
posted @ 2011-08-13 13:48 exponent 阅读(731) 评论(0) 推荐(0) 编辑
摘要: 题意:一个3*3的矩形可以用若干个2*2的矩形去覆盖,现在给出一个最终的图,求它是否合法.分析:就是拓扑排序.code:const yes='THESE WINDOWS ARE CLEAN'; no='THESE WINDOWS ARE BROKEN';var sta:array[1..9,0..1] of longint=((1,1),(1,2),(1,3), (2,1),(2,2),(2,3), (3,1),(3,2),(3,3)); map:array[0..10,0..10] of longint; link:array[0..10,0..10] of 阅读全文
posted @ 2011-08-13 13:38 exponent 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 题意:求[L,U]区间内相差最大和最小的两对素数.(1<=L<U<=2,147,483,647,U-L<=1000000)分析:先筛出sqrt(maxlongint)范围内的素数,再用这些素数去筛L~U范围内的素数.code:const MAXNUM=50000; MAXN=1000001; MAXM=200000; oo=1000000000;var Prime:array[0..MAXNUM] of longint; P:array[0..MAXNUM] of boolean; d:array[0..MAXN] of boolean; px:array[0..MAX 阅读全文
posted @ 2011-08-13 13:31 exponent 阅读(782) 评论(0) 推荐(0) 编辑
摘要: 题意:Given an integer N(1<N<2^31),you are to calculate ∑gcd(i, N) 1<=i<=N.分析:数论题的魅力就在于此,一道题就一句简单的描述.显然,最后的答案肯定是由N的约数组成的,于是我们试着统计每个约数被用了几次.对于N的一个约数D,有多少个数与N的gcd是D呢?答案是φ(N/D).于是ans=∑φ(N/D)*D==∑φ(D)*(N/D). (D为N的约数)效率为O(sqrt(N)).code:var p,cnt:array[0..15] of longint; n,m,num,i:longint; tmp,an 阅读全文
posted @ 2011-08-13 13:18 exponent 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 题意:求两段不相交的连续子序列的和的最大值.如下:水题,以前刚学线段树的时候写的,想到可以用线段树,一激动写了NlogN的.其实可以O(N)的.code(600多MS,勿看):type node=record l,r,num:longint;end;const oo=600000000; maxn=51000;var f1,f2,a:array[0..51000] of longint; t:array[0..maxn*5] of node; datanum,d,n,s,ans,i,max1,max2:longint; function max(a,b:longint):longint; be 阅读全文
posted @ 2011-08-13 12:42 exponent 阅读(1540) 评论(0) 推荐(0) 编辑
摘要: 题意:有一辆车要从起点0,到终点L处,中间有若干个加油站.给出车的油箱容量200,每行驶1km耗油1L.给出加油站的坐标,以及每个加油站的油价.一开始油箱里有100L的油,到达终点时必须还有100L的油,求最少花多少钱在加油上.分析:DP.对于到达终点时必须还有100L的油这个问题,只要将终点放远100米,设置为油价为0的加油站即可.F[i,j]表示到达第i个加油站有油j升的最优值.到达一个加油站时,枚举加多少油就好了.code:var f:array[0..110,0..210] of longint; g:array[0..110,0..210] of boolean; d,p:array 阅读全文
posted @ 2011-08-13 12:35 exponent 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 题意:给出3*k个数,要求将其分为3个长度为k的序列,使得至少有两个序列的和大于500*k.分析:贪心+随机化.首先排序将最小的前k个去掉,剩下的才最有可能满足题意.然后随机交换[k+1,2k]和[2*k+1,3k]这两个区间内的数,知道满足题意,然后输出.因为k只有60,直接暴力即可.code:type rectype=record n,p:longint;end;var c:array[0..181] of rectype; n,k,i,x,y:longint; procedure sort(l,r:longint); var i,j,mid:longint; begin i:=l; j: 阅读全文
posted @ 2011-08-13 12:03 exponent 阅读(427) 评论(0) 推荐(0) 编辑