04 2012 档案

摘要:网络流维基百科,自由的百科全书在图论中,网络流 (Network Flow)是指在一个每条边都有容量 (Capacity)的有向图分配流,使一条边的流量不会超过它的容量。(边有附带容量的图称为网络。)一道流必须符合一个结点的进出的流量相同的限制,除非这是一个源点 (Source)──有较多向外的流,或是一个汇点 (Sink)──有较多向内的流。一个网络可以用来模拟道路系统的交通量、管中的液体、电路中的电流或类似一些东西在一个结点 (Node) 的网络中游动的任何事物。目录[隐藏]1定义2例子3算法4应用5普遍化及专门化6参考7外部连接[编辑]定义假设是一个有限的有向图,它的每条边都有一个非负值 阅读全文
posted @ 2012-04-30 19:55 Szz 阅读(931) 评论(0) 推荐(0) 编辑
摘要:1 http://poj.org/problem?id=1364/* 2 题意: 3 告诉你有一列长度为n的数列和m个关系式。每个关系式的表述为: 4 si ni “gt” c 或者是 si ni “lt” c。分别代表该数列第si项一直加到第si+ni项的和大于c, 5 和第si项一直加到第si+ni项的和小于c。求是否存在满足以上m个要求的数列。是则输出“lamentable kingdom”, 6 否则输出“successful conspiracy”。 7 8 tmd 犯糊涂了 用dis[i]表示 前i 项和 题中 s... 阅读全文
posted @ 2012-04-30 10:37 Szz 阅读(187) 评论(0) 推荐(0) 编辑
摘要:1 /* 2 又是一道差分约束题,通过这道题让我更加理解了差分约束。 3 差分约束的关键是 要充分利用所给条件 4 建立数组的 逻辑意义 如此题的dis[]数组(s[]数组) 建立差分约束系统即(找出差分约束关系), 5 6 7 注:看了2006冯威的论文。整理如下: 设num[i]为i时刻能够开始工作的人数,x[i]为实际雇佣的人数, 设r[i]为i时刻至少需要工作的人数, s[I]=x[1]+x[2]…+x[I] 有如下关系: x[I]<=num[I] x[I-7]+x[I-6]+x[I-5]+x[I-4]+x[I-3]+x[I-2]+x[I-1... 阅读全文
posted @ 2012-04-29 11:30 Szz 阅读(731) 评论(0) 推荐(0) 编辑
摘要:1 http://poj.org/problem?id=3159 有一批糖果要由班长flymouse分发给班里的小朋友,给出m对数据u,v,w,表示第v个小朋友最多比第u个小朋友多w个,但flymouse与snoopy不和,所以在满足上述约束的条件下,flymouse要尽量比snoopy多。snoopy标号1,flymouse标号n/* 2 终于 把这道题过了 ,wa了n次,spfa+队列 会 超时,tmd,改了 spfa+stack 3 spfa差分约束,dis[i]为第i人得到的糖果数目。对于每个约束管理就能列出不等式: 4 dis[a]>=dis[b]-c,就能转化为dis[b]. 阅读全文
posted @ 2012-04-26 16:54 Szz 阅读(144) 评论(0) 推荐(0) 编辑
摘要:1 http://poj.org/problem?id=2983 2 判断是否存在负权回路,差分约束条件 有 3 A 到B的距离一定是 X 4 所以要 表示出来就是 insert(A,B,-x); 5 insert(B,A,x); 6 #include<stdio.h> 7 #include<vector> 8 #include<iostream> 9 #include<queue> 10 #include<string.h> 11 using namespace std; 12 const int N=2000; 13 int n; 阅读全文
posted @ 2012-04-25 21:16 Szz 阅读(175) 评论(0) 推荐(0) 编辑
摘要:1 /* 2 http://poj.org/problem?id=1201 3 题目的转换真的非常非常巧妙,让我再来梳理一下。本题的题意是给了我们一些区间,然后告诉每个区间中至少需要取Ci个数。 4 求出满足n个条件的集合C的最少的元素个数。 5 用dis[i+1]表示从最小值min 到i所选得最小数 6 则有 dis[i]-dis[j]<=-W(i,j); 7 此外还必须加上 8 1>=dis[i+1]-dis[i]>=0; 9 这样就构成了完整的差分约束系统10 */11 #include<stdio.h>12 #include<vector>13 阅读全文
posted @ 2012-04-25 17:08 Szz 阅读(177) 评论(0) 推荐(0) 编辑
摘要:1 差分约束系统 2 加一个源点s指向所有点边权为0, 3 加一个汇点t,所有点指向t边权为0, 4 u和v安全距离为w,则加边v->u,边权为-w 5 (因为 u-v>=w 所以v-u<=-w ) 6 求s到t最短路即可。 7 http://acm.hdu.edu.cn/showproblem.php?pid=4109 8 #include<stdio.h> 9 const int N=10000;10 #define max 99999911 int dis[N],num,n;12 struct node13 {14 int b;15 int e;16 int 阅读全文
posted @ 2012-04-24 17:36 Szz 阅读(281) 评论(0) 推荐(0) 编辑
摘要:1 /* 2 题意 : 3 改变矩阵中元素值 ,求子矩阵的和 4 二维树状数组, 5 */ 6 7 #include<stdio.h> 8 #define N 1050 9 int s;10 int map[N][N];11 int lowbit(int x)12 {13 return x&(-x);14 }15 void add(int x,int y,int d)16 {17 int i=x;18 int j=y;19 while(i<=s)20 {21 j=y;22 while(j<=s)23 ... 阅读全文
posted @ 2012-04-20 18:57 Szz 阅读(163) 评论(0) 推荐(0) 编辑
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #define N 600000 4 int n; 5 int a[N],c[N]; 6 int lowbit(int x) 7 { 8 return x&(-x); 9 }10 int sum(int k)11 {12 int ans=0;13 while(k>0)14 {15 ans+=c[k];16 k=k-lowbit(k);17 }18 return ans;19 }20 int add(int pos ,int nu... 阅读全文
posted @ 2012-04-20 17:04 Szz 阅读(185) 评论(0) 推荐(0) 编辑
摘要:1 概述 2 3 树状数组是一个查询和修改复杂度都为log(n)的数据结构,假设数组a[1..n], 用lowbit函数维护了一个树的结构那么查询a[1]+...+a[n]的时间是log级别的,而且是一个在线的数据结构, 4 支持随时修改某个元素的值,复杂度也为log级别。 5 来观察这个图: 6 令这棵树的结点编号为C1,C2...Cn。令每个结点的值为这棵树的值的总和,那么容易发现: 7 C1 = A1 8 C2 = A1 + A2 9 C3 = A310 C4 = A1 + A2 + A3 + A411 C5 = A512 C6 = A5 +... 阅读全文
posted @ 2012-04-20 16:57 Szz 阅读(385) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2750/*问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列。算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。动态规划解决过静态的序列最大连续子序列和问题,时间复杂度可以达到 n(环形序列可能复杂度更高)。但是这里涉及到动态更新,更新频度很大,如果计算子序列和复杂度仍然是n,就会非常耗时。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;否则,答案是:max{根结点的非空最大子列, 环上数的总和-根结点的非空最小子列} 阅读全文
posted @ 2012-04-19 21:40 Szz 阅读(428) 评论(0) 推荐(0) 编辑
摘要:前两天去试了一下腾讯。或许很多人不喜欢腾讯,但是不得不说他是中国互联网的一个标志。家里人不懂IT,你说我在qq工作,肯定也稍稍有些自豪感。无论工作环境、待遇,我想都是大多数人想要的。很不幸,我被腾讯狠狠的鄙视了。先是笔试,老长的一张卷子。两部分题目,选择题和程序填空题。因为签过保密协议,细节就不多说。卷子考察的内容涉及到所有你本科所学到的知识,具体来说是这几门课:数据结构、算法、操作系统、数据库、计算机组成原理等。前三门占的内容最多。没有什么开放性试题(不过有附加题,但是也不怎么开放。。。)。也就是说,考察的都是基础。不管你投的是开发还是测试,题目都是一样的,更别提具体投的是哪个方向了。程序填 阅读全文
posted @ 2012-04-18 21:21 Szz 阅读(229) 评论(0) 推荐(0) 编辑
摘要:/*http://poj.org/problem?id=2828这道线段树的题竟然弄了两天,太菜了,后来在队友的讲解下才终于恍然大悟这道题呢,就是插队,但如果从前往后处理的话,一般方法,每插一个,移动后面的元素,移动位置,这样会超时,所以 用另一种方法,就是从后往前找,用线段树查找要插入的位置,(这就是线段树的魅力);每一个节点记录,l-----r存在几个空位,运用插空的方法,每一次查找,应该插入的第pos[i]空位;如一开始 1 2 3 4 为全为空,当插入一个 元素到 1号位置 那么 原来的2好空位变为了1好,3变为了24->3*/#include<stdio.h>#de 阅读全文
posted @ 2012-04-16 20:56 Szz 阅读(319) 评论(0) 推荐(0) 编辑
摘要:/* 离散化+线段树 由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话, 首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可。 */#include<stdio.h>#include<stdlib.h>#define N 10040struct node{ int l; int r;}p[N*2];struct color{ int l; int r; int c;}q[N*8];int cmp ( const void *a , const void *b ){return *(int *)a - *(in... 阅读全文
posted @ 2012-04-13 20:25 Szz 阅读(129) 评论(0) 推荐(0) 编辑
摘要:/*线段树染色,经典题,在这道题中学到了,只改变段,而没有下放到点,当下一次的改变,须向下进行是,则要将父节点的颜色下方到子节点 vis[]用来标记 ,避免重复计算*/#include<stdio.h>#include<string.h>#define N 100010struct node{ int b; int e; int c; }p[N*4];int sum,vis[N];void build(int x,int l,int r){ p[x].c=1; p[x].b=l; p[x].e=r; p[x].nu... 阅读全文
posted @ 2012-04-12 21:36 Szz 阅读(161) 评论(0) 推荐(0) 编辑
摘要:set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)set模板原型://Key为元素(键值)类型template <class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Ke 阅读全文
posted @ 2012-04-10 20:26 Szz 阅读(328) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3096#include<iostream>#include<string.h>#include<set>using namespace std;set<string>s;int main(){ string str; int i,j; while(cin>>str) { int f=0; if(str[0]=='*')break; int len=str.size(); for(i=1;i<len-1;i++){ s.clea... 阅读全文
posted @ 2012-04-10 20:25 Szz 阅读(185) 评论(0) 推荐(0) 编辑
摘要:#include<stdio.h>int ans,a[22],f,step;int judge(){ int i; for(i=1;i<=20;i++) if(a[i]==1)return 0; return 1;}void change(int x){ a[x]=!a[x]; if(x-1>=1)a[x-1]=!a[x-1]; if(x+1<=20)a[x+1]=!a[x+1];}void dfs(int x,int num){ if(step==num) { if(judge()) { ... 阅读全文
posted @ 2012-04-09 17:41 Szz 阅读(179) 评论(0) 推荐(0) 编辑
摘要:注意 标记hash[],不然会错(数据状态好像很多 ,所以要标记)http://poj.org/problem?id=3185#include<stdio.h>#include<string.h>#define N 1000000struct node{ int num; int step;}p[N];bool hash[1048576];int d[20]={0xC0000,0xE0000,0x70000,0x38000,0x1C000,0xE000,0x7000,0x3800,0x1C00, 0xE00,0x700,0x380,0x1C0,0xE0,0x... 阅读全文
posted @ 2012-04-08 21:59 Szz 阅读(251) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3191此题的解法基于以下几点:(1) 如果一个数是奇数,那么它的二进制形式的最后一位肯定是1,我们可以去掉此 1,就是(x-1)/-2,进入(2)(2) 如果一个数的最后一位为 0 ,我们可以把这个数右移(可以类比以 2 为基的二进制数的操作)一位,然后它的二进制的倒数第二个数就成了最后一个,就是 x=x/-2,然后进入(1)迭代,直到变为 0#include<stdio.h>#include<math.h>int a[40];int main(){ int n,i; while(scanf("%d&quo 阅读全文
posted @ 2012-04-07 17:46 Szz 阅读(305) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4038这题的题意就是给一序列的数,有两种操作,一种是把序列中某个数的值加1,要么在序列中增添一个数为1,然后给出操作数,最后要求这些数的乘积最大,求出这个乘积。做这个题要考虑的细节很多,首先要把负数的个数求出,如果为奇数,那么要把最大的那个负数尽量加到0,就相当于转化为偶数的情况了,然后负数就不用在管了,这时候,序列中如果有0的话,很显然他们相乘就是0,所以尽量把所有的0要变成1,之后,如果操作数还有剩余,就要尽量把所有的1变成2了,因为1在序列中是没有任何用处的,增加到2就是翻一番,用1个操作数达到这种效果 阅读全文
posted @ 2012-04-07 10:16 Szz 阅读(315) 评论(0) 推荐(0) 编辑
摘要:/*http://acm.hdu.edu.cn/showproblem.php?pid=4039题意:给出N对好友关系,之后Q次提问,问可以对该用户推荐的相识度最高的好友;推荐好友满足的条件:该用户的所有好友的好友中,出现次数最多的,而且推荐好友本身不是该用户的好友;若有多个推荐好友时,按字典序输出;一道悲剧的题啊*/#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 2500#include<iostream>#include<algorithm>using 阅读全文
posted @ 2012-04-06 20:52 Szz 阅读(313) 评论(0) 推荐(0) 编辑
摘要:<a href="http://acm.hdu.edu.cn/showproblem.php?pid=4033">http://acm.hdu.edu.cn/showproblem.php?pid=4033</a> 思路:二分 先找 两边之和的最小max 和两边只差的最大 min 则边的长度 L 必然 min<l<max 然后二分求解 注意啊,一开始定义 eps 是为e-6,wa 改为e-8 ac #include<stdio.h>#define N 1000#include<math.h>#define eps 阅读全文
posted @ 2012-04-05 20:45 Szz 阅读(176) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4033思路:二分 先找 两边之和的最小max 和两边只差的最大 min 则边的长度 L 必然 min<l<max 然后二分求解 注意啊,一开始定义 eps 是为e-6,wa 改为e-8 ac #include<stdio.h>#define N 1000#include<math.h>#define eps 1e-8const double pi=2*acos(-1);double a[N];int main(){ int T,l,i,n; scanf("%d&q 阅读全文
posted @ 2012-04-05 20:43 Szz 阅读(171) 评论(0) 推荐(0) 编辑
摘要:1http://acm.hdu.edu.cn/showproblem.php?pid=4034 vis[][]作用是 防止一条边被删多次 2 3 #include<stdio.h> 4 #include<string.h> 5 #define N 1000 6 int ans; 7 int map[N][N],n,f,vis[N][N]; 8 void search() 9 {10 int i,j,k;11 memset(vis,0,sizeof(vis));12 for(k=1;k<=n;k++)13 {14 for(i=1;i<=n;i+... 阅读全文
posted @ 2012-04-05 19:29 Szz 阅读(162) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2251#include<stdio.h>#include<string.h>#include<queue>#include<iostream>using namespace std;#define max 999999#define N 40int l,r,c,ans,ex,ey,ez;char map[N][N][N];int vis[N][N][N];int dx[6]={-1,0,1,0,0,0};int dy[6]={0,1,0,-1,0,0};int dz[6]={0,0,0,0,1 阅读全文
posted @ 2012-04-03 21:48 Szz 阅读(139) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1321#include<stdio.h>#include<string.h>#define N 100char str[N][N];int n,ans,k,r[N],c[N],l;struct node{ int x; int y;}p[N];void dfs(int num,int sum){ if(num<=l&&sum==0) { ans++; return ; } if(num>=l) { return ; } int x=p[num].... 阅读全文
posted @ 2012-04-03 20:27 Szz 阅读(137) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3009题意:溜石游戏。在一给定大小的矩形冰面上,散布若干石块,给定石头的初始位置和终点,求从起点到达终点的最小步数,超过10次则视作不可达。其中规则如下,若石头与石块有相邻则不能向该方向滑动;每次溜石只能到达有石块的地方,且将其立即敲碎;若出界则视作失败。思路:限制条件较多的dfs,每个状态下有四个方向的选择,注意每个滑动方向中的情况,较繁琐。#include<stdio.h>#include<iostream>const int inf=999999;using namespace std;int r,c,step 阅读全文
posted @ 2012-04-02 21:22 Szz 阅读(261) 评论(0) 推荐(0) 编辑
摘要:/*思路 : 优先队列 bfs ,从每一天中 病毒类型最小的开始 ,所以优先队列 先 按天 排在按类型 */ #include<iostream>#include<stdio.h>#include<queue>#include<cmath>#include<string.h>#define N 600using namespace std;struct node{ int x; int y; int day; int ty; friend bool operator < (struct node a,struct node b) 阅读全文
posted @ 2012-04-01 21:19 Szz 阅读(129) 评论(0) 推荐(0) 编辑
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1849/*思路 : 优先队列 bfs ,从每一天中 病毒类型最小的开始 ,所以优先队列 先 按天 排在按类型 */#include<iostream>#include<stdio.h>#include<queue>#include<cmath>#include<string.h>#define N 600using namespace std;struct node{ int x; int y; int day; i 阅读全文
posted @ 2012-04-01 21:01 Szz 阅读(122) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示