10 2012 档案
摘要:第一次用vector,,感觉蛮方便的。这个题需要判断同构,数据一样的枝条应该是不一定是相同的,但是数据貌似很水。比如23 1 2 4 5 63 2 1 4 5 6View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <algorithm> 6 7 using namespace std; 8 9 #define MAXN 10001010 #define HASH 10000711
阅读全文
摘要:在网上看到一种很巧妙的构图方法,构图思路如下:1.取超级源点和超级汇点;2.当猪圈被第一次打开时,在源点与当前顾客之间连接一条边,容量为该猪圈的猪的头数;3.当某个猪圈 不是被第一次打开时,在上一个打开该猪圈的顾客与当前打开该猪圈的顾客之间连接一条边,容量为无穷大;4.在每个顾客与汇点之间连接一条边,容量为该顾客要买猪的头数。EK:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 6 using namespa
阅读全文
摘要:题意:在一个网络图中有n个点,其中有np个发电站,nc个用户,m条电线;每个发电站,用户,和电线都对应有一个最大的电流;让求出该网络中最大的电流;添加一个源点为(0)和一个汇点(n+1),源点与发电站相连,电流量为发电站的最大电流;用户与汇点相连,电流量为用户需要的最大电流。EK算法模版:10944604xinghan02191459Accepted768K625MSG++1290B2012-10-22 23:17:50View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g
阅读全文
摘要:1 //poj 1273 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 7 using namespace std; 8 #define MAXN 202 9 #define inf 0x7ffffff10 #define Min(x,y) (x>y?y:x)11 int n;//顶点数12 int flow[MAXN][MAXN];//残量网络13 int maxflow;//最大流14 int st,en;//源点,
阅读全文
摘要:http://codeforces.com/problemset/problem/235/A假如是奇数,肯定是n*(n-1)*(n-2),因为奇数最小的公共因子为3.则n,至少得与(n-3)有公共因子。假如是偶数:1、可能是(n-1)*(n-2)*(n-3)。或者 n*(n-1)*(n-x)。由n*(n-1)*(n-x)>(n-1)*(n-2)*(n-3)解出x<5。求出。View Code 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 __int64 n; 7
阅读全文
摘要:这个题有一个意思描述使的题目简单了。。囧。。开始还以为数据水呢。其实是我题目没看清楚。。。只能在A,S的时候才能分成很多的路径。15 8A###A ### ## #### #### ####S#######比如这个数据输出的是16。ps:假如没有那个条件的话,就是应该输出12。。。。(怎么做?。。)这题的代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <queue> 5 6 using namespace std; 7 8
阅读全文
摘要:1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define MAXN 102 9 10 int N,C;11 char s1[MAXN],s2[MAXN],s12[MAXN<<1],ans[MAXN<<1];12 13 //*****************ELFhash***********14 #define HASH 990115 c
阅读全文
摘要:(网上找的。。。)构造法公式(序列):一、当n mod 6 != 2 &&n mod 6 != 3时:[2,4,6,8,...,n],[1,3,5,7,...,n-1] (n为偶数)[2,4,6,8,...,n-1],[1,3,5,7,...,n] (n为奇数)二、当n mod 6 == 2或n mod 6 == 3时(当n为偶数,k=n/2;当n为奇数,k=(n-1)/2)[k,k+2,k+4,...,n],[2,4,...,k-2],[k+3,k+5,...,n-1],[1,3,5,...,k+1](k为偶数,n为偶数)[k,k+2,k+4,...,n-1],[2,4,..
阅读全文
摘要:http://blog.csdn.net/lyy289065406/article/details/6642573转载请注明出处:優YoUhttp://blog.csdn.net/lyy289065406/article/details/6642573最近AC题:2528更新时间:2011.09.22 已AC题数:146初级题已在2011.06.30全部完成部分解题报告添加新内容,除了原有的“大致题意”和“解题思路”外,新增“Source修正”,因为原Source较模糊,这是为了帮助某些狂WA的同学找到测试数据库,但是我不希望大家利用测试数据打表刷题PS:部分题目的评论中也有给出了测试数据,未
阅读全文
摘要:http://codeforces.com/contest/234做出来三题。第一题感觉不难,但是一直想不到好的做法。就先做了B,C。B很简单。C想到了也很简单。。记录下做法:A:感觉我的应该算作贪心。。。不知道是不是想复杂了。我是这么想的,要不是L多余R,要不是R多余L。于是可以先把左右位置确定下来,再判断是否满足左右相差大于1。假如不大于1的话。比如 3 4.那么右边除了2以外。其他的都可以代替4。。。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #i
阅读全文
摘要:1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 6 using namespace std; 7 8 int n; 9 int sum,w[15];10 int rest[151];11 12 int main()13 {14 while(scanf("%d",&n) != EOF)15 {16 sum=0;17 int re=0,tag=0;18 memset(rest,0,sizeof(r
阅读全文
摘要:设x化为二进制长度为len.例如x=1100b1、先求长度小于len的和2、求长度为len且小于x的个数和。此时可以枚举二进制x中1的位置,将其变为0后满足的数的个数和。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 7 using namespace std; 8 9 #define MAXN 32 10 __int64 sum[MAXN];//su
阅读全文
摘要:http://codeforces.com/contest/233/problem/Bs(x)最大为81.所以x*(x+s(x))==n假如有x存在,则x必然小于sqrt(n)。且大于sqrt(n)-82。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 7 using namespace std; 8 9 long long n,ans;10 11 int getsu
阅读全文
摘要:题意:n个村庄建p个邮局,最短距离和。dp[MAXN][35];//dp[i][j]表示前i个村庄有j个post且第i个村庄有post的最小值优化前(969ms....):View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 9 #define MAXN 31010 #define Max(x,y) (x&g
阅读全文
摘要:给你一个n问求使得 a1+a2+..ak==n时 a1*a2*..ak最大。。a1 a2.....不相等。(没看懂题目意思。。)以下转自http://blog.himdd.com/?p=1918思路:将一个数分成2份,如何分,使得这两个数乘积最大。答案是将这个数平分,证明是求x*(n-x)的最大值。基于这种思路,将N分成乘积最大的不相等的多份,应使得其中每份的数相差尽量少,即差值为1的等差数列为最理想状态。构造了一个等差数列以后,再根据剩余值对整个数列的值进行调整。使得相邻元素差值达到最小。这里注意,等差数列的构造应以2为首项,1为首项的话,对乘积没影响。。。(以下证明是从网上得来的)由题意知
阅读全文
摘要:题意:给你一个n,然后求从2-->n的所有数的欧拉函数的和。欧拉函数模版View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 6 using namespace std; 7 8 #define MAXN 1000010 9 10 long long euler[MAXN],sum_euler[MAXN];//sum_euler[i]表示2-->i的欧拉数和11 int n;12 void get_eu
阅读全文
摘要:/*http://baike.baidu.com/view/107769.htm * 欧拉函数:定义:用于计算 p(n),小于等于n的所有与n互质的数的个数。例如p[8]=4,(1,3,5,7)计算公式:p(n)=n*(1-1/p1)*(1-1/p2)....*(1-1/pk)【p1,p2,pk都是n的素因子】另:若n=p1^q1*p2^q2*.....*pk^qk则,p(n)=(p1-1)*p1^(q1-1)*(p1-1)*p2^(q2-1)......*(pk-1)*pk^(qk-1)性质:若m,n互质,φ(mn)=φ(m)φ(n)。当n为奇数时,φ(2n)=φ(n)*/求欧拉函数 elu
阅读全文
摘要:http://codeforces.com/contest/231/problem/C昨天的cf。比赛的时候其实有点思路的,但是因为B搞错方向了没敢写C。刚刚写了下,AC了。用的思路还真是昨天晚上的。囧。昨天晚上看的时候有一个地方不知道怎么转换,就是怎么快速求出i-->i+ans需要加多少个1.刚刚化了下。得到了:cnt=sum[i-1+m]-sum[i]-(i-1)*(a[i-1+m]-a[i])。sum[i]表示1-->i需要加多少个1使得1-->i都变为a[i]。自己写下就能得到上面那个式子。昨天就是这里没深入。然后刚刚做的时候想到了 sum[]定义为__int64 觉
阅读全文
摘要:http://codeforces.com/problemset/problem/231/B苦逼贪心被当成了搜索。。。学习大牛代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 #define MAXN 110 8 int ans[MAXN]; 9 int n,d,l;10 11 int main()12 {13 while(scanf("%d%d%d",&n,&d,
阅读全文
摘要:bfs套一个bfs先bfs box的移动情况,这里注意的是可能一个坐标x,ybox多次经过是可行的。网上的很多AC代码就没注意这个。比如下面这组数据:8 9##########......T##.S.....###B#######.......##.......##.......##########网上很多AC代码输出“Impossible.”明显错的。。。然后在每次bfs box的时候bfs person 判断是否能走到相应的点。(即相反的方向点)最后还注意的是Output a single blank line after each test case. 如果最后没有空行竟然是报wa的。。
阅读全文
摘要:http://poj.org/problem?id=2688很基础的搜索吧。跑了200MS。。。做完这题发现了一个很囧的东西。。这题貌似就是TSP问题....AC了后想去搜下看有没有好的剪枝,结果发现别人说这是经典的TSP问题。可问题是,,,,,,两个月前我特意去想弄懂什么是TSP问题,却看不懂啊,,,,现在却AC了,,而且思路神马的都是自己想的,,大囧啊,以后搞不懂的东西得换个思路来想了,,想着纠结了这么久的TSP原来就是一个bfs+dfs啊。先bfs找出所有的脏点与robot的最短步数。然后dfs找最短的旅行路线。ps:开始的时候竟然以为是最小生成树。。再囧。。不过收获蛮大的。对搜索熟悉了
阅读全文
摘要:http://codeforces.com/problemset/problem/229/A比完以后看了看其他人的代码,其实思路我是想到了,可是就是代码没实现,代码能力太弱了。。思路就是先预处理一下。把每行的close[i][j]标记出来。close[i][j]表示在第i行的第j个数最少移动几次可以使得map[i][j]变为1。在这里可以使用队列来得到close[i][j]的值,下面大牛的代码: 1 #include <cstdio> 2 #include <queue> 3 4 int ans[10010], min[10010]; 5 6 int main(){ 7
阅读全文
摘要:LCA问题可以与RMQ问题互相转化,长郡中学 郭华阳的《RMQ&LCA问题》讲的很好。这个博客也讲的很好:http://dongxicheng.org/structure/lca-rmq/Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time10873609xinghan02191330Accepted3176K47MSG++2000B2012-10-01 19:49:0310546730xinghan02191330Accepted2032K63MSG++1756B2012-07-27 17:08:33RMQ问题
阅读全文
摘要:Tarjan算法:http://blog.csdn.net/smallacmer/article/details/7432625 1 //这个tarjan算法使用了并查集+dfs的操作。中间的那个并查集操作的作用,只是将已经查找过的节点捆成一个集合然后再指向一个公共的祖先。另外,如果要查询LCA(a,b),必须把(a,b)和(b,a)都加入邻接表。 2 // 3 //O(n+Q) 4 5 #include <iostream> 6 #include <cstdio> 7 #include <cstring> 8 #include <vector>
阅读全文
摘要:Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time10872456xinghan02193264Accepted8540K3469MSG++950B2012-10-01 14:21:3810579472xinghan02193264Accepted1728K3375MSG++1135B2012-08-01 11:35:45第一个是ST算法,第二个是线段树。线段树: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g
阅读全文
摘要:转自:http://blog.csdn.net/niushuai666/article/details/66246721. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O
阅读全文
摘要:题很简单....但是好多字啊...唉,,,题意没看清...竟然忘了这个机器人很肥,不能走边界.....还有就是有个track,起始点与目的地如果有障碍,直接输出-1..太水了,,简单的题还是错... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 9 #define MAXN 55 10 11 struct point 1
阅读全文