解题报告【ACM】
文章平均质量分 69
shifuwawa
一介code夫。。。
展开
-
poj 1159 Palindrome LCS
此题乍看没思路,萎缩的看了discuss,A之。不过为了复习STL,代码不是很精简,然后效率一般。思路就是求出给定串的转置串(利用vector的转置功能),对比二串的公共部分长度,输出串长减去公共长即是结果。刚开始开了个二维5003的数组,很随意的MLE乐,然后学了滚动数组,利用之,A过。放码子:#include#include#include#include#include/原创 2009-10-05 16:03:00 · 1052 阅读 · 0 评论 -
PKU 1113 Graham Scan求凸包
<br />PKU 1113<br />最近一直在被计算几何虐,几十个函数几百行的代码还要人肉手工测量可用性。学习凸包之际碰到了这个题(虽说解答是用<br />了很裸的凸包,但是题目本身很不错,本菜也很少动辄冠以哪个题以水题的称号,究其原因是自己依然很菜,很多题要抱着<br />学习的心态去解决,题目本身能教会我很多东西,对这些题目多是敬仰,比如A+B,带给我的是ACM入门的第一个鼓励,我也<br />没公然说过A+B水)。<br />不扯淡了。这个题的解答结果是凸包周长+圆周长。为什么呢?<br />首先原创 2010-07-26 01:38:00 · 870 阅读 · 0 评论 -
C中内联/内嵌汇编 the game of light bulb
我最近千方百计,不择手段在把汇编跟做ACM题融合到一起,做了A+B不过瘾,看教材时介绍到串扫描命令bsr和bsf,YY了一下,可以找1偶;又进一步YY了一下,想起了2010 GCJ Round 1有个开关问题转化为01串;继续YY,灯泡。。。YY,灯泡开关游戏。。。最后一淫,有了:灯泡游戏!于是蛋生了如下一题:王岗村民风淳朴(pzjay出题老爱跟王岗扯上关系,因为那是pzjay亲爱的家乡),村民们农闲时会做一种挑战记忆力的游戏而不是去打麻将。游戏道具由4组灯泡组成,分别标号1 2 3 4,每组灯泡8只,这四原创 2010-06-24 00:55:00 · 1147 阅读 · 2 评论 -
PKU 2006 happy2006
<br />对于所给的m,求出m的欧拉函数值v,我们知道1 ~ m之间与m互素的数的个数为v。于是m + 1 ~ 2m, 2m + 1 ~ 3m, 3m + 1 ~ 4m…….等区间均包含v个与m互质的整数。所以k / v即可以得到一共需要多少个这样的区间。然后在最后一个区间内枚举即可以确定要求的数。算法复杂度为O(m)。<br />【摘自官方题解】:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1180<br /><br />下面简单证明原创 2010-08-17 11:18:00 · 588 阅读 · 0 评论 -
ZOJ 3381 Osaisen Choudai !
<br />懒得朝硬盘的分类里放,存这了<br />RMQ;<br />const int sup = 50010;int dp[sup], s[sup], x[sup], y[sup];struct node{ int mmax, mmin;//分别记录所求区间最大最小值}pz;int n;int big[sup][35], lit[sup][35];//2^31就是int的最大范围了,big[i][j]表示的是i到i+2^j-1范围内的最大值,所以int范围内j最大到32足够原创 2010-08-23 16:34:00 · 865 阅读 · 0 评论 -
Ural Tree
<br />LCA的应用,LCA的伪代码:<br />void LCA(u)<br />{<br />s[u]=u; //初始化并差集<br />for(u的每个儿子v)<br />{<br />LCA(v);<br />s[v]=FIND(u);<br />}<br />color[u]=black;<br />for(Q(u)中的所有元素v) //如果存在询问LCA(u,v),就把v存在集合Q(u)里<br />if(color[v]==black) LCA(u,v)为FIND(u)<br />}<b原创 2010-08-24 21:57:00 · 568 阅读 · 0 评论 -
HDU 3078
<br />题意是给定N个点,每个点都有权值,再给一些两两连接某些点的双向边。然后给出Q个询问,每个询问有两种形式:第一种是将第a个点的权值改作b,另一种形式问从a到b权值第k大的点的权值是多少,假如a到b的路上【inclusive】有少于k个点,输出invalid request!<br />题目保证N个点有N - 1条边,所以图形一定是棵树。<br /><br />我的解法如下:树的特点就是每个节点的前驱结点具有唯一性,据此我们首先递归构造出每个节点的前驱结点,然后对于k!=0的询问,首先求出二者的LC原创 2010-08-29 22:55:00 · 1559 阅读 · 0 评论 -
Cells 【THE 30th ACM/ICPC ASIA REGIONAL 2005 HANGZHOU SITE Problem C: C】
一【波】三折的,我好弱,蒟蒻。 题目给定一棵树,问某甲是不是某乙的祖先。DFS ,记录每个节点节点出入的时间。父节点出入的时间一定是涵盖儿子们的出入时间的。一【波】三折的:波了个折的。。。const int sup1 = 20000010;const int sup = 300010;struct node{ int cnt;//儿子个数 int lst;//最后一个儿子编号}ede[sup];int n;bool vis[sup1];int sck[sup];int原创 2010-09-02 10:13:00 · 1258 阅读 · 0 评论 -
Word Puzzles PKU1204 trie
<br />用待查找的单词建立trie树,然后遍历puzzle表,对于每个遍历到的词,看在trie上是否有对应节点,有就继续,没有退出;假如碰到标记单词结尾的节点,则成功找到一个【为了防止重复查找,找到的单词标记一下】。<br />/*A 上 B 右上 C 右 D 右下 E 下 F左下 G 左 H 左上*/ const int sup = 1010;const int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0原创 2010-09-03 22:14:00 · 738 阅读 · 0 评论 -
Schedule Problem 【ZJU1455】 差分约束
<br /><br />HDOJ上拥塞了大量国人的英文题,每每做题都深感自己的英文知识在受误导。囧了个囧。于是ZOJ和POJ上见个外国佬的英文题就认认真真当阅读理解诚惶诚恐读之。<br />这个题构建tim数组表示第i个任务结束的时间,据此列出三角不等式【事后证明tim表示第i个任务的开始时间才是明智的,SB了】。<br /><br />const int sup = 1010;//边的数目struct node{ int v; int w; node *nxt;}ede[sup <原创 2010-09-09 11:03:00 · 876 阅读 · 0 评论 -
Alice's Chance【多重匹配】
<br />【POJ】题意:有N部电影预约Alice拍摄,每部电影有特定的工作时间【比如电影A只能在周一周三周六拍摄】,完成拍摄需要的天数【D天】以及要在几周内完成【W周】。要求是同一天不能拍摄超过一部电影,问Alice在满足所有电影的拍摄要求下能否拍摄所有电影。将电影抽象成牛棚,每部电影需要的天数是棚的容量。周一到周7看做即将入圈的牛群,假如第i部电影可以在周一周三周六拍摄,则左侧的1,3,6跟右侧的i连边,同时第i部电影要求在w周内完成拍摄,Alice可以在任何一周的1,3,6拍摄此电影,所以第2.3.原创 2010-10-02 10:51:00 · 906 阅读 · 0 评论 -
POJ 3498 March of the Penguins
拆点 + 枚举汇点,2A 【— —!】给出建图的代码:原创 2010-10-04 16:20:00 · 936 阅读 · 1 评论 -
混合图的欧拉回路
<br />POJ 1637 Sightseeing tour<br />具体讲解见《黑书》,下面只说code的流程:<br />输入时计数每个点的出入度,若是双向边,则边容量设为1,方向随意。单向边无视。<br /><br />然后看是否出现点的出入度的差值为奇数,有的话直接输出“impossible”,否则,对于出度大于入读的边,跟超级源点连边,容量为出入度差的1/2,否则跟超级汇点连边,容量也是差值的1/2。然后求最大流,判断是否每个跟源汇点连的边是否都流满了,流满则“possible”,否则“im~原创 2010-10-04 14:31:00 · 557 阅读 · 0 评论 -
ZOJ 1123 Triangle Encapsulation
计算几何原创 2010-07-19 21:17:00 · 1186 阅读 · 0 评论 -
Magic Squares USACO 康托hash+BFS
<br />写的时候很没信心,刚开始用STL的queue,发觉路径记录较为掣肘;遂改手写,获得两个华丽丽的CE(不让用fstream和ctime)后,一A,那个内牛满面……<br /><br />做法:有三种操作,那么我们依次搜索尝试这三种操作即可,因为是最少操作次数,故用BFS进行搜索,尝试每种操作后放入队列。细节便是要进行路径的记录,只要记下当前进入队列中的第i个操作是由前面第几个操作转移过来的。具体到本题便是第R个操作显然来源于第L个操作,这里L始终处于队列的顶部,R表示队列的尾部。剩下的问题原创 2010-07-16 15:54:00 · 1327 阅读 · 0 评论 -
POJ2155
<br />题目是说对一个01矩形区间有两种操作:一是置反某一块区间[a][b]--->[c][d](0变1,1变0),二是询问[i][j]位置处的当前值是0还是1。转化为树状数组的方法便是:01矩阵初始化为0,对于置反操作,等价于将小矩形块的四角置反(以此表示这四角代表的矩形块被执行置反),于是我们对于置反操作,只操作四角的即可(可以累加操作次数,也可以单纯的模拟置反操作,此时可利用bool数组),然后对于询问,只统计其左上方的矩阵元素的和(累加)奇偶情况,奇数说明最终置1,否则置0。<br />注意修改原创 2010-07-10 23:25:00 · 1645 阅读 · 0 评论 -
2009 ACM/ICPC武汉赛区------武汉妞
我觉得是一个较为裸的二维完全背包题,看标程倒像按01来的,一写没过自己出的数据,信心不足,靠学长的搜索过了,背包码子如下:也是自己第一个二维背包,姑且留念之:(据师父透露:测试数据下,标程TLE的说。囧,有点自家矛PK自家盾的感觉)#includeusing namespace std;const int nax=1010;int w[nax],p[nax],v[nax],f[原创 2009-10-04 16:24:00 · 3980 阅读 · 0 评论 -
ACM/ICPC武汉赛区水题之GCC
这个题不难,刚开始很脑残的直接O(n^2)的边乘边模,结果TLE。WOJ算是给个面子,如果不TLE肯定直接WA,因为我弱智的用int去接收高达到10^100的数据,后来看了解题报告:因为当n>=m的时候后面的n! % m = 0.所以只要处理n#include//令m上限是9999999,7位#includechar is[1010];using namespace std;i原创 2009-10-04 12:20:00 · 3769 阅读 · 2 评论 -
poj 2231 牛吼的音量 快排
今天恰逢基数排序,于是乎前往POJ寻找目标练手,看到 frkstyc大牛一句“基数排序”,就来到2231,囧,discuss里米有说用基数的,快排倒有,也有暴力(忽略),就手写了个快排交了,这个T还是有点技巧的,就是牛按位置排序后,算了,举个例子: 34 12 435 2 3共5个牛,排好序后是:2 3 12 34 435 然后开始从右往左计算牛距,呃,说反了,从左往右,因为第i个牛到第i+1个牛原创 2009-10-14 18:10:00 · 1693 阅读 · 1 评论 -
PKU 1861 最小生成树之KK算法
不是偶搞另类,那个克鲁斯卡尔算法叫起来好好拗口,KK就朗朗多了。这个T,Special Judge。。。主要是KK算法,好久没写CSDN,随便来点什么。上码子:#include#include#include#includeusing namespace std;const int pzjay=1013;int root[pzjay];struct pp{原创 2009-10-25 19:53:00 · 1461 阅读 · 0 评论 -
POJ2472 n次迪杰斯特拉
一个简单的最短路,之前写过一个等效于floyd(floyd太简单,但人家思想很强大)的DJ,这次又重温一下,不错,依然好用。。。根据floyd的思想和DJ的思想可知,n次DJ算法相当于一次floyd算法:#include#include#includeusing namespace std;#define buzhun_tou_zhuan_pzjay_wenzhang 0原创 2009-11-18 20:46:00 · 1092 阅读 · 0 评论 -
POJ 1905 Expanding Roads
很少做几何题— —bbb,不废话设膨胀后形成的圆弧所在的圆半径为R,所对应的弧度为H,所求的结果距离为x,则由几何知识可得到公式:勾股定理:(L/2)^2+(R-x)^2=R^2得到R=x^2+(L/2)^2/(2*x)(程序中对应R=(mid*mid+L*L/4)/2/mid),然后又有sin(H)=L/2/R==>H=asin(L/2/R),而根据某个定理(汗,忘了什么定理)原创 2010-01-15 23:11:00 · 719 阅读 · 0 评论 -
PKU 3742
一个公式搞定,话说之前还以为能用霍纳定则,后来画弦X未定的情况下求多项式的值很扯淡,然后跟同学一起推出了一个公式,bi=Σ(im*C(m,i)*tm-i;然后Java过掉了import java.io.*;import java.util.*;import java.math.*;public class Main{ public static BigInteger hor原创 2009-12-16 16:42:00 · 521 阅读 · 0 评论 -
线段树入门之涂色问题——ZOJ1610
第一个线段树,大部分时间都在寒假挥霍了。最近迫切需要女朋友,又没有现成的,又不会找,恰似M67所言:“欲火焚身”那#includeusing namespace std;const int sup=8010;int ans[sup];struct node{ int left,right; int color; node *rch,*lch; node(in原创 2010-02-24 11:24:00 · 2235 阅读 · 2 评论 -
POJ 2309 BST 位运算应用
给出一棵二分搜索树,再给一个节点编号n,求以这个节点为根节点的子树叶子节点的最大值与最小值。若n是奇数,那么他必然是个叶子节点,最大最小都是他自己。否则求n所在的层数,他的层数就是他的因子中2的个数(规律),转化为求n的因子中2的个数。而2的个数取决于n的二进制表示中最后一个1所处的位置i,因为之前的某几个1,假设处于j(j>i),那么n可以表示为2^j+2^i+2^x(x>i且个数未定)=2^i原创 2010-01-07 21:21:00 · 1304 阅读 · 0 评论 -
POJ3270 置换群
给你一群牛逼的牛,每只牛有一个重量(姑且当成重量,或权值,whatever),you know,越重的牛必然越牛逼。初始时牛群无序排列,需要FJ去根据牛重排序,排序过程就是不停的交换任意两只牛的位置直至有序,移动两只牛的代价为两只牛的重量和。As you know,牛逼的牛移动起来比较费劲,FJ怎么才能花费最小的代价才能排好序呢?上置换群:根据贪心策略,我们总是希望每次交换时那个最不牛逼的牛都原创 2010-01-11 17:16:00 · 1892 阅读 · 0 评论 -
hdoj 2473 并查集
充数,充数……大意是说有一堆垃圾邮件要处理,这些邮件均有一定的属性,有些邮件属性相同,有些不同,相同的放到同一堆里。给出两种操作,一种是M A B 告诉你AB具有相同的属性,可归为一类;一种是S A,告诉你把垃圾邮件A删除掉。问最后有多少堆邮件(注意邮件编号从0开始)。牵涉到并查集节点原创 2010-04-10 12:52:00 · 710 阅读 · 0 评论 -
JAVA正则表达式
我灰常鸡冻,AC了一个188人AC的题目,开始死活RE,让人不禁脑残,理论上按题目描述接收split的string数组开到2足足够,但是HH大牛还是执着的提出了数组越界的可能,后来看那个大小为5的数组有点太葛朗台,索性改成105(可是明明2个就够了啊,啊,啊,啊,f**k),然后交:AC,靠。脑残+1,贼么可能呢!难道题目描述又在玩人,把105重新改作5再交:AC,贼让人情以何堪……教训:AC原创 2010-04-26 16:32:00 · 827 阅读 · 3 评论 -
POJ 3678 OO版2-SAT模板
<br />2-sat连边的基本原则就是:只找关系确定的连边,比如a | b为1的条件,当a为1时,b或者为0或者为1;这就是关系不确定的情况,但是当a为0时,b一定为1,这是确定的情况,连边时就是2a -> 2b+1,当然还有2b -> 2a+1;那么假如要求a|b为0的条件呢?根据上述原则,a为0,b必须为0,反之亦然,得到两条边;然后,假如a为1,必然不合法,那么为了避免出现a为1,我们连边2a -> 2a+1,这样自动组环,对非法解进行过滤。<br /> <br />#include <pzjay_原创 2010-12-01 21:02:00 · 1397 阅读 · 0 评论