自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Czy

A stupid bird...

  • 博客(42)
  • 资源 (6)
  • 收藏
  • 关注

原创 Sicily 1210 二叉树(树的遍历)

//树的遍历//几个结论//1:前序遍历第一个元素是根,后序遍历最后一个元素是根//2:前序遍历第二个元素是某子树的根,但左右不确定//3:在后序遍历中找到前序遍历的第二个元素,那么以这个元素为基准,可以划分新的左右子树//4:当前序遍历的第二个元素出现在后序遍历的倒数第二位,以后序遍历倒数第三位起向左数都是子树的元素,但是左右不确定,因此有2种情况//递归处理 + 乘法原理#include#includeusing namespace std;int ans;c

2010-07-31 19:55:00 2207 1

原创 Sicily 1686 Happy Children's Day(线段树)

//线段树//WA了很多次,最后查出原因居然是建树的时候初始化有最大糖果的下标错了//我只有在叶子节点有初始化,其他点没有,所以错了,正确初始化应该是每个区间最左边的点为maxid//线段树插入和修改的inherit和update函数是关键,直到这道题总算摸索出套路了//建树什么都差不多,关键就看如何识别标记,如何处理区间与区间之间关系,如何回溯传递结果#include#define MAX 100005using namespace std;struct seg{

2010-07-28 02:37:00 1107

原创 Sicily 1323 Switch text(字符串处理)

//字符串处理//很奇怪的一道题,关键是对结束的判断和空行的检查//用STL可以省很多事情#include #include #include using namespace std;string s1,s2;bool checkEmpty(string str)//检查这一行是不是空行{ for(int i = 0;i ' ') return false; return true;}int main(){ for(;;) { getl

2010-07-28 00:00:00 2191

原创 Sicily 1823 Hardest Job Ever!(单源最短路)

//单源最短路径//Dijkstra + 优先队列实现#include#include#include#define INF 1200000000#define MAXN 205#define MAXM 20005using namespace std;typedef pair dis_v;//用一个pair类型存放当前结点的距离和结点编号int T,N,M;int head[MAXN],next[MAXM],V[MAXM],W[MAXM],dis[MAXN];

2010-07-27 22:54:00 1310

原创 Sicily 1196 Conflict(传递闭包的建立)

//传递闭包//看了郭老的书才懂得传递闭包的建立//T为传递闭包数组//在6中运算关系中,可以简化为b ---> b=b ---> b a= a 或 b > a)那么就产生冲突 //三、对不等号的的关系另外判断,在NE(not equal)数组中NE[a][b]表示a != b//如果a != b 且 (g[a][b] = 2 或 g[b][a] = 2) 则冲突#include

2010-07-27 20:55:00 1220

原创 POJ 1386 Play on Words(判断欧拉回路存在)

//求欧拉回路,注意欧拉图的性质//构图的思想是以单词的首字母和末字母作为结点构图,将单词作为一条有向边//(A)----acm------>(M)-----malform---->(M)------mouse----->(E)//1、第一步是要先对图的连通性进行判断,即去掉边的方向,看图是否连通//我看了数据规模才26,我就偷懒写个Floyd水下算了//2、第二步就是根据欧拉图的性质进行判断就可以了,判断存在欧拉道路或存在欧拉回路//(1)有向图G为欧拉图(存在欧拉回路),当且仅当

2010-07-27 19:48:00 1179

原创 POJ 2421 Constructing Roads(最小生成树)

//最小生成树//只需将已经建成的路的边权值置零即可//然后对边进行排序,建立并查集,用Kruscal#include#include#include#define MAX 105using namespace std;int N,Q;int G[MAX][MAX];int fa[MAX];struct Edge{ int u,v,w; Edge(int uu,int vv,int ww) { u = uu; v = vv; w = ww;

2010-07-26 23:41:00 752

原创 POJ 3159 Candies(差分约束系统)

//差分约束系统//建立关系十分简单,SPFA求到终点的距离//但这一题十分奇怪,用队列就TLE,用栈就不会,真奇怪~#include#include#define MAXN 30005#define MAXM 150000#define INF 1000000000using namespace std;int N,M,m,u,v,w;bool inq[MAXN];int dis[MAXN];int head[MAXN],next[MAXM],V[MAXM]

2010-07-26 19:35:00 784

原创 POJ 3259 Wormholes(判断负权回路|SPFA||Bellman-Ford)

//判断是否存在负权回路SPFA算法#include#include#define MAXN 505#define MAXM 6000#define INF 1000000000using namespace std;int F,N,M,WW,m,u,v,w;int head[MAXN],V[MAXM],next[MAXM],W[MAXM];bool inq[MAXN];int cnt[MAXN],dis[MAXN];void addEdge(int u,int

2010-07-26 19:24:00 1418

原创 POJ 1364 King(差分约束系统)

//差分约束系统//题意相当晦涩,看了好半天才大概知道个什么//对题目中给定的si,ni,ki,和一个给定的序列S[1....N]//如果(si,ni,gt,ki),意思就是存在约束条件S[si]+S[si+1]+...S[si+ni] > ki//如果(si,ni,lt,ki),意思就是存在约束条件S[si]+S[si+1]+...S[si+ni] ki//T[si+ni] - T[si-1] =或的系统,还好ki是整数,可以很容易将

2010-07-26 17:48:00 2998 2

原创 POJ 3169 Layout(差分约束系统)

//差分约束系统//不等式关系的建立十分直观,eg://S1和S2之间距离不能大于10//S2 - S1 = 15//构图后以1为起点,SPFA求最短路即可//如果无法到达终点N:If cows 1 and N can be arbitrarily far apart, output -2//如果存在回路: If no line-up is possible, output -1#include#include#define INF 1000000000#define

2010-07-26 16:18:00 1094

原创 POJ 2983 Is the Information Reliable(差分约束系统)

//差分约束系统//这题比较对差分约束的构图比较直观//eg.P 3 1 4//4 == 1 --------------(4)//等价于 s5 - s4 #include#define INF 1000000000#define MAX 1005#define MAXM 210000//注意边数的数量,最坏情况2*M+1000(超级源点的边)using namespace std;int head[MAX],V[MAXM],next[MAX

2010-07-26 15:22:00 765

原创 POJ 1275 Cashier Employment(差分约束系统)

摘自冯威论文——《数与图的完美结合》设num[ i ]为i时刻能够开始工作的人数,x[ i ]为实际雇佣的人数,那么x[ I ]设r[ i ]为i时刻至少需要工作的人数,于是有如下关系:    x[ I-7 ]+x[ I-6 ]+x[ I-5 ]+x[ I-4]+x[ I-3 ]+x[ I-2 ]+x[ I-1 ]+x[ I ]>=r[ I ] 设s[ I ]=x[ 1 ]+x[ 2 ]…+x[ I ],得到    0    s[ I ]-s[ I-8 ]>=r[ I ], 8    s[ 23 ]+s

2010-07-26 02:55:00 2163

原创 Sicily 1800 Sequence(RMQ)

//线段树//A这道题后,懂得了对数列的转换,如果要求连续区间和,就必须把它转化成SUM[I],表示从1到I的区间之和//这样的话要求任意区间的和,假设[I,J]的和,只需要sum[j] - sum[i-1]就可以立即求出来了//注意sum[0] = 0;//思路:枚举从L开始到的的sum[i](i >= L)//对符合长度条件的区间中找到一个最大的sum[j] (max(0,i-U) #define MAX 32780#define INF 2147483647using

2010-07-25 11:29:00 1309

原创 POJ 2492 A Bug's Life(并查集)

//并查集,类似于POJ 1703//通过维护当前结点与父亲的关系来实现对同性恋的判断//并查集的分类依据是能否相互确定关系,能相互确定关系的在同一颗树种#include#define MAX 2005using namespace std;bool ok;int x,y,n,m,k,t;struct node{ int parent; int sex;//记录关系,假设0为男,1为女}set[MAX];void init()//初始化{ for(

2010-07-24 11:40:00 1281 1

原创 POJ 2236 Wireless Network(并查集)

#include#includeusing namespace std;struct coord{ int x,y;}P[1005];int n,d;char cmd;int fa[1005],x,y;vector ok;void init(){ for(int i = 1;i

2010-07-24 10:12:00 844

原创 POJ 1703 Find them, Catch them(并查集)

//并查集,NND忘了个句号WA了3次!//A过POJ1182的食物链后再来做这道题就轻松多了,这是食物链的简单版//并查集的集合是以能否确定关系来分的,而不是以属于同一个帮派或不同帮派来分的//这类题只需建立一个并查集,然后维护每个结点和他的根结点之间的关系属性即可//如果2个点不在同一个并查集中,那么这2个点无法确定关系//在同一个并查集中的每个点,都能确定集合中的相互关系#includeusing namespace std;struct node{ int f

2010-07-23 17:07:00 883

原创 POJ 1308 Is It A Tree(模拟题)

//最简便的做法,根据树的定义来做//树有N个顶点,N-1条边//个人觉得这道题比较扑街,数据范围也没给,细节那么多,连空树、多重边这种东西都要考虑#includeusing namespace std;int node[1000],edge[1000][1000];//记录出现过的点和边bool ok;int x,y,N,E,n;void init(){ N = E = n = 0; ok = 1; memset(edge,0,sizeof(edge));

2010-07-23 13:57:00 677

原创 POJ 1611 The Suspects(并查集)

//并查集,统计不相交集合的元素个数#includeusing namespace std;int n,m,k,fa[30010],num[30010],x,y;void initSet(){ for(int i = 0;i

2010-07-23 12:33:00 1400

原创 POJ 2524 Ubiquitous Religions(并查集)

//并查集的简单应用——带路径压缩的并查集//平摊分析后,每个点只需遍历一次即可建立相应并查集,搜索的复杂度是O(1);#includeusing namespace std;int fa[50010],n,m,ans,vis[50010];void initSet()//初始化{ for(int i = 1;i

2010-07-23 10:21:00 682

原创 POJ 2777 Count Color(线段树+位运算优化)

//线段树//A完这道题收获很大,一开始我不会用位运算,是用vis[30]数组一个一个标记颜色过的,速度比较慢800+MS//经大牛指点,使用位运算来记录颜色,结果快了一倍//通过这道题,对线段树的架构有了清晰的了解//对于线段树,特别的地方在于对区间的标记,搜索时后要先读取区间的标记,然后更新左右子树的标记//通过标记便可以不用再修改到要求区间的时候改变子树的区间状态,等到下次修改时有经过这个节点,再修改左右子树状态//只有这样才叫做实现O(logN)的修改和插入,否则会退化成O(

2010-07-22 00:36:00 954

原创 POJ 2828 Buy Tickets(线段树)

//线段树,利用线段树的灵活性,实现排队//算法关键:逆序插入,线段树区间维护该区间剩余有效地空位,每从线段树中找到一个合适位置插入,都会减去一个有效空位//相当于整个队列的序号向右移了一位,通过树状结构维护remain值,便可实现O(NlgN)的复杂度//倒序插入,每找到一个合适的位置,这个位置就肯定是最终确定的位置#include#define MAX 200005using namespace std;struct seg{ int l,r,remain;}se

2010-07-20 21:27:00 802

原创 Sicily 1827 && 1947 Sniper

//求最小割,转化为最大流模型来求最大流//构图的方法是拆点,将除了源点和汇点外的点1个变成2个,各自的容量为点的值。//有相连的点之间的容量为正无穷,注意看清题意,题目说的是给你的2个点他们是相连的"connected",即双向连通,所以构图时要注意//因为没注意到这点构图的时候错了WA了无数次,唉,我还是这么水~#include#include#include#define INF 1000000000using namespace std;int cap[105][

2010-07-20 15:30:00 776

原创 Sicily 1949 && 1876 Basic Graph Problem(RMQ+并查集)

//RMQ+并查集,RMQ套模板即可,此题关键是并查集的使用//sicily 1949 1876是同一道题,但是注意CASE的大小写,时间区别是5s和1s#include#include#includeusing namespace std;int _max[100010][18],_min[100010][18];bool ok;int father[100010];int n,query,st,ed,u,v;void RMQ()//套模板即可{ for(i

2010-07-20 11:35:00 891

原创 POJ 3667 Hotel(线段树)

//线段树//对每个区间记录左连续数,右连续数,和最大连续//最大连续用于判断是否存在满足条件的区间//左右连续用来更新父区间的最大连续,注意两个区间的合并//A完这一题,对线段树的回溯更新有了更深刻地体会//对于线段树的更新,只需更新到所求的区间即可,而无需理会该区间的子区间//若继续处理满足条件的子区间,就会让线段树退化到O(n),为了实现O(lgN)的插入和删除,就需要对区间进行标记//当下次搜索时经过这个标记,再对子树进行处理,就可以了,这就是线段树快的原因#incl

2010-07-19 23:44:00 1491 1

原创 POJ 2528 Mayor's posters(离散化+线段树)

//线段树的染色类型题目//这题通过逆序修改线段树可以简单的实现,这是一种比较巧妙地做法//也可以通过记录左颜色和右颜色来维护线段树实现//下面的代码是通过逆序覆盖来实现的,逆序覆盖,即将最后一次贴上去的海报优先处理//这样的话可以省去很多按顺序插入处理步骤,但是无法实现动态询问//在离散化的时候我一开始使用MAP来实现,结果800MS,差点爆掉,实践证明MAP的查询速度是很慢的,还不如写个二分搞定//但下面的代码严格来说是错误的,离散化有问题,不过数据太弱,还是可以AC的#in

2010-07-17 23:09:00 692

原创 POJ 3468 A Simple Problem with Integers(线段树)

//线段树#includeusing namespace std;int data[100010];long long int ans;struct seg{ int l,r,add;//ADD表示该区间内增加的量 long long int sum;//sum为改区间的总和}segTree[400010];//静态线段树的空间必须是给定区间大小的4倍,因为最坏情况是树最底层被分成1个区间点和1个空结点void buildTree(int fa,int l,int

2010-07-16 00:03:00 659

原创 POJ 3264 Balanced Lineup(RMQ)

//RMQ,求给定区间的最大值和最小值之差#include#includeusing namespace std;int n,m,k,st,ed;int Max,Min;int _max[50010][17];int _min[50010][17];void RMQ_init()//RMQ初始化模板{ for(int j = 1;(1

2010-07-13 22:00:00 687

原创 POJ 2182 Lost Cows(线段树)

//线段树//题意:给定数列的顺序数,进而确定数列的排列//思路:逆向思考,对给定的N个数,从第N个数入手,如果他的顺序数是k,则说明他在1~N中排第k+1位//确定一个元素的位置K后,从1~N这个序列中删除K//之后计算第N-1个数,同理在1~N-1个数中看他排第几位,确定他的位置//EXAMPLE: //序列:1,2,3,4//顺序数:1,1,2//3+1 = 4,在1,2,3,4中排第4位,ans[4] = 4,在1,2,3,4中删除4,剩1,2,3//1+1 =

2010-07-13 17:11:00 1044

原创 Sicily 1350 Piggy banks(搜索|求图中环的个数)

//求图中环的个数//由于图中每个点的出度只有1,所以不存在一个点处于两个环的交点//因此,求环的个数时每个只需要考虑一次便可得出结果//由于数据规模庞大,写成递归形式容易暴栈//在读边的过程中先对自环进行预处理,之后对每个点进行不同的染色,对它的下一个点也染同样的颜色//这样染下去如果发现下一个要染的点和正在染的颜色相同,则说明存在一个环//换染色起点的同时也需要更换新的染色,才能保证对环的判断正确#include#includeusing namespace std;

2010-07-13 04:06:00 2899 2

原创 Sicily 1020 Big Integer(高精度运算)

//高精度取模运算//一开始套了个原先自己写的模板,高精度%高精度,结果TLE 2次,原因很明显,被除数可达400位,2E除以2就要做1E次减法必定TLE//所以只能自己写个最原始最朴素的才能过,考虑到除数最大是1000//因此可以自己写一个string%int型的取模函数,这样速度会快很多,而且很简短//改用char和scanf应该可以更快#include#includeusing namespace std;int mod(string dividend,int divi

2010-07-12 02:47:00 2373 1

原创 Sicily 1024 Magic Island(DFS深度优先搜索)

#include#include#include#include#define INF -1000000000using namespace std;int _max;int n,k,u,v,d;struct Edge{ int u,v,d; Edge(int uu,int vv,int dd) { u = uu; v = vv; d = dd; }};vector E[10010];bool vis[10010];void dfs(int u

2010-07-12 01:09:00 3333 3

原创 Sicily 1114 Food Cube(BFS广度优先搜索)

//BFS广度优先搜索//构完图后,对图中所有空的进行广搜,相当于从改点不断往外扩张,直到碰到cube或越界//每成功广搜一个坐标就意味着有一个空洞,但最后答案要除去最外层的空洞//因此ans - 1#include#include#includeusing namespace std;const int MAX = 102;int t,n,x,y,z,ans;int G[MAX][MAX][MAX];struct coord{ int x,y,z;

2010-07-11 19:09:00 2024

原创 Sicily 1696 Flows in Grid(最大流)

//由于给定的点最高可达100*100=10000//因此不可能建立一个10000*10000的图来描述流量,必定MLE//但考虑到是格子形状,每一个最多只与周边4个点相连//可以通过这个性质进行图的压缩,并建立一个方向和点的转化关系//再套用最大流模板便可通过#include#include#includeusing namespace std;const int MAX = 102,INF = 2000000000;int flow[MAX*MAX][4],cap

2010-07-11 13:38:00 1040 1

原创 Sicily 1308 Dependencies among Jobs(图的搜索)

//图的搜索遍历//“We assume that there is only one job processing in one moment”即一次只能处理1个任务,不能同时处理//因此不是关键路径中的求最早启动时间,害我WA了N次!//只要记录父亲指针,不断递归加上所有父亲他们所要花的时间就好了//G++中time是关键字来的,不要随便申请time这个名字的变量……//读取数据是个麻烦的环节#include#include#include#includeusin

2010-07-08 13:01:00 1005

原创 POJ 1661 Help Jimmy(动态规划)

//动态规划//将板按高度排序//记录到达每块板的左右端点所需的最少时间,和每块板从左右两边跳下去的下一块板指针//从高到低不断迭代更新最少时间所需值//注意边缘处理和直接落地的情况以及满足最大跳楼高度这些条件#include#include#define INF 1000000000;using namespace std;struct Plat{ int x,y,h; int R_next;//从右端点掉下去的下一块板 int L_next;//从左端

2010-07-07 01:47:00 689

原创 Sicily 1252 Defining Moment(字符串递归)

//模拟题,递归处理即可,利用string 类强大的可+性,可简单实现递归函数//一开始调用了STL的string类的substr函数,结果restric function了//真是无语。。。#include#includeusing namespace std;string Substr(string word,int position,int len){ string substr; for(int i = position;i - position

2010-07-05 20:37:00 1039

原创 POJ 1087 A Plug for UNIX(网络流—最大流(最大二分匹配))

//网络流——通过构图用最大流来作做大匹配//将用电器(device)与源点相连//插座(plug)和汇点相连//适配器与插座相连,且权值为INF//将最大匹配问题构图转化为最大流问题,再用汇点总流减去最大流得到答案#include#include#include#include#include#define INF 2000000000using namespace std;int flow[505][505],cap[505][505];int rfl

2010-07-05 15:24:00 1158

原创 POJ 1149 PIGS(网络流—最大流)

http://imlazy.ycool.com/post.2059102.html看了这篇文章才做出来的,收获很大,膜拜神牛!网络流的难点在于图的构建以及图的简化//网络流——最大流//此题的关键是构图和对图的简化以及流量的合并//可参见http://imlazy.ycool.com/post.2059102.html//有非常详细的讲解#include#include#include#define INF 2000000000using namespace std;in

2010-07-05 13:44:00 694

原创 POJ 1459 Power Network(网络流—最大流)

//网络流——最大流//通过添加虚源点和虚汇点构图,转化为从源点到汇点的最短路#include#include#include#define INF 2000000000using namespace std;int n,np,nc,m;int x,y,c,p,f,maxflow,st,ed,u,v;int cap[105][105],flow[105][105];int rflow[105],pre[105];int main(){ //freopen(

2010-07-05 01:22:00 767

程序设计导引及在线实践

程序设计导引及在线实践,poj上推荐的书,十分适合ACM初学者

2010-04-25

浙江大学ACM例程模板

浙江大学ACM专用模板,十分深入,适合高水平选手使用

2010-04-25

吉林大学ACM例程模板

一份相当不错,相当全面的ACM模板,十分实用参加ACM比赛的人,十分推荐。

2010-04-25

谭浩强C++程序设计

谭浩强C++程序设计 内附图片,源代码,正文 PDF格式,内容实用简洁明了 是一本不错的学习C++的入门书籍

2010-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除