随笔分类 -  解题报告

摘要:题目大意:一群候选人要在墙上贴海报,海报可以相互重叠,问贴完了以后还有多少海报可以看见。等价于一道经典的线段树问题:给x轴染色,染不同的颜色,问最后x轴上有多少颜色。先设定每个节点有一个color域,为零的时候就是x轴的颜色,-1就是这个区间有多种颜色,给每种颜色标一个序号i当所到达的区间有多种颜色(即color==-1)时,就继续向下更新当所到达的区间只有一种颜色(即color>=0)时,就更新我需要更新的区间,然后把左边和右边的区间更新下去(第一次就是这里没有写,seg fault了好几次)还要注意两个问题,一个是要离散化,再一个是poj的区间的表示和我先开始写的不一样,导致wa了两 阅读全文
posted @ 2011-10-10 21:34 ω 提拉米兔 ℃ 阅读(321) 评论(2) 推荐(0)
摘要:这是我的第一道线段树呀吼吼~~~~~虽然这道题很简单,但是我写的时候还是犯了很多错误,RE了几次,还是属于没有理解线段树到底是怎么分段的。。。把自己的代码对着标改把改把过了,发现跑了3000+MS,怎么这么慢,然后我就去网上找了很多大神的线段树代码拿来交,发现都是3000+MS,才知道原来还有更好的做法,比如ST什么的。。。用数组模拟整个线段树,要求开由于N即为线段树最底层的节点数,则线段树最高为(ceil)log2N+1=17层;则线段树最多有2^17-1个节点=131071 ,所以开了150000~~a274003264Accepted2428K3375MSG++1635B2011-10- 阅读全文
posted @ 2011-10-05 12:20 ω 提拉米兔 ℃ 阅读(267) 评论(0) 推荐(0)
摘要:有n个点,标号1到n,给定数组b[i]表示i前面比a[i]小的点的个数,求a[]数组。我们倒着扫b数组,将符合条件的最大的数插入a数组相应的位置,就得解了。但是朴素查找需要很多时间,就需要用数状数组了。维护一个c数组,sum(i)表示现在有几个数字不大于i,因为sum(i)是有序的,所以我们每次查找的时候就用二分查找就行了,在找到这个点以后,就从c数组中删去。总的复杂度为O(n * logn * logn)先开始二分写搓了,改了老半天,唉,二分还是太弱了阿。。2011-10-03 15:07:11RosieYeOrdering the Soldiersaccepted editrun2.544 阅读全文
posted @ 2011-10-03 21:22 ω 提拉米兔 ℃ 阅读(402) 评论(0) 推荐(0)
摘要:理解了很久。。首先分析一维的情况:首先对于每个数A定义集合up(A)表示{A, A+lowestbit(A), A+lowestbit(A)+lowestbit(A+lowestbit(A))...} 定义集合down(A)表示{A, A-lowestbit(A), A-lowestbit(A)-lowestbit(A-lowestbit(A)) ... , 0}。可以发现对于任何A<B,up(A)和down(B)的交集有且仅有一个数。这样,在改变区间[a,b]时,我们只用更改down(b)和down(a-1)的值,用数状数组实现。在求点i的状态的时候就直接求up(i).因为之前所说的性 阅读全文
posted @ 2011-10-03 17:21 ω 提拉米兔 ℃ 阅读(265) 评论(0) 推荐(0)
摘要:大意:很多牛站在x轴上,每个牛有一个v值;两个牛a,b交谈需要的花费为距离 * max(v(a), v(b)),求所有牛的花费和做法:先把牛按v值排序,再做两个树状数组c1,c2,c1记录当前比牛i坐标小的牛的个数sum1,c2记录当前比牛i坐标小的牛的坐标和sum2。 再记录当前所有的牛的坐标和alltotal 那么对于每个牛,它对于总数的贡献为:(sum1*mow[i].x-sum2+alltotal-sum2-(i-sum1)*mow[i].x)*mow[i].v 把每个牛算一次加起来就行了a274001990Accept... 阅读全文
posted @ 2011-09-30 11:55 ω 提拉米兔 ℃ 阅读(311) 评论(0) 推荐(0)
摘要:树状数组+离散化。WA 2:注意数字有可能是一样的!!WA 12:要用long long,输出用I64d#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define MAXN 65540using namespace std;struct node{ long long v; int id; bool operator<(const node&p)const{return v<p.v;}};no 阅读全文
posted @ 2011-09-28 11:36 ω 提拉米兔 ℃ 阅读(347) 评论(0) 推荐(0)
摘要:题意:一棵具有n个节点的树,一开始,每个节点上都有一个苹果。现在给出m组动态的操作:(C,i)是摘掉第i个节点上面的苹果(若苹果不存在,则为加上一个苹果),(Q,i)是查询以第i个节点为根的子树有几个苹果(包括第i个节点)。做法:将每个点重新编号,使每个点的编号大于它的所有子节点的编号,这样,记录下该节点的最小子节点编号,就可以区间地求某个节点的苹果总数了。方法实现方法就是后序遍历整颗树,并将节点映射到新的编号上。接下来就是裸的树状数组了。a274003321Accepted8856K1282MSC++1377B2011-09-24 15:31:14#include<cstdio> 阅读全文
posted @ 2011-09-24 16:04 ω 提拉米兔 ℃ 阅读(622) 评论(0) 推荐(0)
摘要:A=|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|/2Try to make clever use of this formula.先开始怎么想都没有头绪,后来瞄了一眼discuss,有人说其实每个点的坐标只对2的模数有意义。。就有点思路了总的方法数是C(n,3),再减去不满足情况的变形:y1*(x3-x2)+y2*(x1-x3)+y3*(x2-x1)不满足情况的是奇+奇+奇……(1) 奇+偶+偶……(2)(1)将式子以x整理的话,发现变成了偶+偶+偶,因此是不可能成立的(2)总结出来4种不满足的情况: (0,0) (0,1) (... 阅读全文
posted @ 2011-09-15 22:31 ω 提拉米兔 ℃ 阅读(508) 评论(0) 推荐(0)
摘要:这个题完全没思路……直接看的解题报告。。居然就这么打刷进第一页了。。定义两个三元组I(xi,yi,zi)和J(xj,yj,zj),(可以看做是空间中的点)他们的距离为D(I,J)=max{xi-xj,yi-yj,zi-zj}-min{xi-xj,yi-yj,zi-zj},给定n个三元组(n<=200000),求任意两个三元组的差的和抽化出来的模型是 max(a,b,c)-min(a,b,c),这个东西吧他放在数轴上 a,b,c我们要求最大和最小的差就是这三个点构成的线段的距离,那么我们这里再变通下 是不是端点到中间那个点的距离其实画出这个图的时候,就可以看到这个距离为(|a-b|+|b- 阅读全文
posted @ 2011-09-14 15:24 ω 提拉米兔 ℃ 阅读(463) 评论(0) 推荐(0)
摘要:假如所给的数是a,那么如果n*(n-1)/2+1(n>=0,n<a)可以遍历a的最小非负剩余系的话,那么就输出YES,否则输出NO在输出NO的情况下,一定存在n1,n0,使得n1*(n1-1)/2+1==n0*(n0-1)/2+1 mod a (==表示同余)即存在n1,n0 st. (n1-n0)/2*(n1+n0+1)==0 mod a1.当a为奇数时,选取a-1,0就可以了,所以奇数一定输出NO2.当a为2^l时,将n1,n0分奇偶讨论,没有一种情况是偶数*偶数,故一定输出YES3.当a为S*2^l(S为奇数,S>1,l>0)时,(这个我想了一会没有想出来,就在网 阅读全文
posted @ 2011-09-14 13:56 ω 提拉米兔 ℃ 阅读(276) 评论(0) 推荐(0)
摘要:由于这个题是spj,所以只要在连续的里面找就可以了。开一个sum数组,sum[i]记录前i个数的和。如果sum[i]%n==0,那么直接用这i个数就可以了。如果没有等于零的,由于n的最小非负剩余系除去零有n-1个数,而sum总共有n个位置,那么一定有最少两个sum的值是一样的a274002356Accepted284K47MSC++812B2011-09-10 18:31:22#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm 阅读全文
posted @ 2011-09-10 20:55 ω 提拉米兔 ℃ 阅读(328) 评论(0) 推荐(0)
摘要:是一边读入一边算的……先开始只要读到无解的情况就直接跳出来,一直wa,最后才知道原来还要把后面的数据读完才行,汗……参考了AC大神的思路:http://hi.baidu.com/aekdycoin/blog/item/71d7a842b93f611b73f05da4.html这里稍微证明一下:给定方程x = c1 (mod b1) ……………………(1)x = c2(mod b2) ………………………(2)(b1,b2)可以不为1于是通过取mod 定义,我们得到x = k1 * b1 + c1………………(3)(3) 带入(2)k1 * b1 + c1 = c2 (mod b2)…………(4) 阅读全文
posted @ 2011-09-10 20:48 ω 提拉米兔 ℃ 阅读(395) 评论(0) 推荐(0)
摘要:http://hi.baidu.com/aekdycoin/blog/item/b317ca18bb24334942a9ad55.html原创帖!转载请注明作者 AekdyCoin !【普通Baby Step Giant Step】【问题模型】求解A^x = B (mod C) 中 0 <= x < C 的解,C 为素数【思路】我们可以做一个等价x = i * m + j ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C) )而这么分解的目的无非是为了转化为:(A^i)^m* A^j = B ( mod C)之后做少许暴 阅读全文
posted @ 2011-09-09 20:54 ω 提拉米兔 ℃ 阅读(368) 评论(0) 推荐(0)
摘要:题目思路:注意到凡是那种1111111..... 2222222..... 33333.....之类的序列都可用这个式子来表示:k*(10^n-1)/9进而简化:这个题会变成:8*(10^n-1)/9=k*m (k是一个整数)如果gcd(8,m)=t的话那么原始的式子可以改为:8/t*(10^n-1)=9m/t*k由于8/t和9m/t完全没有公约数所以如果8/t*(10^n-1)要整除9m/t的话,必须是10^n-1是9m/t的整数倍转化一下就变成了:10^n=1(mod m)的形式求出m的欧拉函数值,测试phi(m)的每一个约数PS:上一篇的二分幂取模在这里不能用,因为这个题的数据范围太大了 阅读全文
posted @ 2011-09-09 15:02 ω 提拉米兔 ℃ 阅读(993) 评论(2) 推荐(0)
摘要:已知n个点的环绕点X的周期,求出各点转到同一直线上的最短时间。求出相邻点间相距半圈所需时间=追及时间/2。求出各个半圈时间的最小公倍数为结果公式:T[i] = d[i]*d[i+1] / (d[i+1]-d[i])*2那么以读入的第一个点为基准点,求出以后所有点和第一个点相聚半圈所需的时间,求出这几个分数的最小公倍数就可以了。(和第一个点所用的时间相同就不用计算了)分数的最小公倍数求法:设两分数为a/b,c/d(已化为最简形式),则最小公倍数为:lcm(a,c)/gcd(b,d)所以在每读一个周期的时候先把公式化为最简形式,再分别对分子分母求lcm和gcda274003101Accepted5 阅读全文
posted @ 2011-09-07 14:53 ω 提拉米兔 ℃ 阅读(790) 评论(0) 推荐(0)
摘要:题意:求组合数C[n][k]的约数个数。(0<= k <= n <= 431)思路:一个数num的约数个数为cnt,将num质因数分解,得num = p1^a1 * p2^a2 * p3^a3 * ……*pn^an.则约数个数cnt = (a1 + 1) * (a2 + 1) * (a3 + 1) * …… *(an + 1).C[n][k] = n ! / ((n - k) ! * k !).cal(n, k) 函数求出 n! 时能分解出几个 k。(1) 先预求 1 到 431 的素数表。(2) 则C[n][k]中包含素数prime[i]的个数为ai = cal(n!, p 阅读全文
posted @ 2011-09-06 20:32 ω 提拉米兔 ℃ 阅读(496) 评论(0) 推荐(0)
摘要:题目意思是给定m,n问你 m/n的二进制表示的最大循环节开始位置和长度。找了一些题解,发现没有满意的,discuss里面的分析已经很好了。。我们可以观察一下1/10这组数据,按照二进制转换法(乘二法),我们可以得到:1/10 2/10 4/10 8/10 16/10 32/10 ...然后都分子都尽可能减去10,得到:1/10 2/10 4/10 8/10 6/10 2/10 ...这时候,发现出现了重复,那么这个重复就是我们要求的最小循环。抽象出模型如下:对p/q首先p'=p/gcd(p,q)q'=q/gcd(p,q);然后我们就是求p'*2^i == p'* 阅读全文
posted @ 2011-09-06 19:12 ω 提拉米兔 ℃ 阅读(464) 评论(0) 推荐(0)
摘要:先开始暴搞,然后悲剧地超时了……题目的大意是:求出正整数1~n内两两互质的数的对数。其中n <= 1,000,000欧拉函数还有这样的性质: 设a为N的质因数,若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)。 预处理用筛选法求得1~n内的所有质数,就可以在比较快的时间内求得1~n内所有数字的欧拉函数。 在筛选法求质数的过程中,记录合数的最小质因数,这样在求欧拉函数的过程中之 阅读全文
posted @ 2011-09-06 09:48 ω 提拉米兔 ℃ 阅读(362) 评论(0) 推荐(0)
摘要:又去抄依然大神的题解了……a274001001Accepted3400K110MSJava687B2011-09-05 20:58:10import java.io.*;import java.math.*;import java.util.*;import java.text.*; public class Main { public static void main(String[] args) { Scanner cin=new Scanner (new BufferedInputStream(System.in)); BigDecimal num; ... 阅读全文
posted @ 2011-09-05 21:03 ω 提拉米兔 ℃ 阅读(446) 评论(0) 推荐(0)
摘要:给定m, k(1 <= m <= 1000000), K(1 <= K <= 100000000), 询问第k个与m互质的数。欧拉函数的应用。首先是求出m的欧拉函数值phi[m],可知区间[1, m - 1]中有phi[m]个数与m互质。同样,在区间[n*m + 1, (n + 1) * m]中必然也有phi[m]个数与m互质,并且这phi[m]个数与[1 - m - 1]的phi[m]个数是"一一对应"的。所以只要通过k / phi[m]找到第n个区间,然后再枚举区间中的数就可以找到第k个与m互质的数。先开始当m=1时,我输出的是k+1,wa了几次 阅读全文
posted @ 2011-09-05 20:24 ω 提拉米兔 ℃ 阅读(342) 评论(0) 推荐(0)