上一页 1 2 3 4 5 6 7 8 9 10 ··· 17 下一页
摘要: 题意: 给一列数对应两种操作: 1 a b v, 把[a, b] 的值改为v,即A[a] = A[a+1] = ... = A[b] = v。 2 a b, 查询[a, b] 之间的相同数的连续和最大值。分析:线段树,区间合并 + 成段更新 ... int lva[maxn<<4];// 区间最左面的值 int lnu[maxn<<4]; // 区间最左面的数的个数 int rva[maxn<<4]; // 区间最右面的值 int rnu[maxn<<4]; // 区间最右面的数的个数 int mva[maxn<<4]; // 区间最 阅读全文
posted @ 2012-08-10 11:49 'wind 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 题意: 有N 个人站队,告诉每个人想插队的位置,要求确定最终的站队位置。分析: 越往后插队的人位置越固定,因此可以从后向前插入,每个人插入的位置为从第1 个位置起的第 pos+1 空位置。 用sum[i] 表示 I 区间的人数之和,用线段树维护即可。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 200005struct P{ int pos,val;}q[maxn];int sum[maxn<<3];int va[maxn<<3 阅读全文
posted @ 2012-08-09 11:01 'wind 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 题意: 有一个有N 个区间木板,存在最多 30 种颜色,一开始木板的颜色都为第一种颜色。 定义两种操作: Cxyc 将区间[x,y]涂成 c 颜色。 P xy询问区间[x,y]共有多少种颜色。分析: 比较典型的成段更新的线段树染色问题,使用延迟标记数组。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 100005int col[maxn<<3];int v[33];void creat(int l,int r,int rt){ col[rt] 阅读全文
posted @ 2012-08-08 20:10 'wind 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 题目:View Code Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I still remember, vividly, on the beautiful Zhuhai Campus, 4 years ago, from the moment I saw you smile, as you were walking out of the classroom and turned your head back, with the soft sunset 阅读全文
posted @ 2012-08-08 19:23 'wind 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个矩形,求总的覆盖面积。分析: 离散化浮点数坐标,以 x 轴 建树, 将每个矩形拆分成上下两条线段,从下向上扫描。/*************************************** 离散化浮点数,把矩形分成上边和下边, ** 按 x 坐标建树,从下向上扫描 ****************************************/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#define clr(x)memse 阅读全文
posted @ 2012-08-08 13:02 'wind 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出 n 个人,知道了每个人的成绩,和每个人想要的奖学金,要求从这些学生中找出 m (奇数)个人满足选出的人的成绩的中位数最大,且这些人总的奖学金需求要 小于等于总的奖学金数。分析: 可以先对学生按成绩降序排序,然后从位置m/2+1 到 N - m/2枚举,中位数 q[i],因此对于枚举每个中位数只要求出左面最小的 m/2个数,和右面最小的 m/2 个 数,只要 left[i-1]+q[i].money+rght[i+1] <=F ,i 即为要找的学生。 left[i] 表示从 i 个位置向左的序列中最小的 m/2个数之和,对于每次出现新的 i 值,要求出 m/2 个最小的数这个 阅读全文
posted @ 2012-08-07 20:56 'wind 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 题意: 从小到大排序分析:堆排序讲解:View Code “堆”定义 n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 大根堆和小根堆:根结点(亦称为堆顶)的关 阅读全文
posted @ 2012-08-07 16:54 'wind 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 N 个人分属于两个帮派,对应两种操作: A X Y 询问x,y 是否属于一个帮派,或两者关系不能确定。 D X Y X和Y 分属不同帮派分析: 感觉就是简化版的食物链...方法一: 加一个数组 r[i] r[i] = 0 表示 i 与祖先属于同一个帮派 r[i] = 1 表示 i 与祖先属于不同帮派View Code #include<stdio.h>#include<string.h>int f[100005];int r[100005];int find(int x){ int s; if(f[x]==-1) return x; else s... 阅读全文
posted @ 2012-08-07 15:40 'wind 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 题意: 有一棵有 n 个节点并以 1 为根节点的树, 一开始每个节点有 1 个苹果,定义两种操作 Q i 询问以 i 为根节点的树上有多少个苹果。 C i 如果i 这个节点上有 1 个苹果就把它摘下,否在就在这个节点装上一个苹果。分析: 可以把树上的每个节点对应到树状数组中, 对应的时候,越靠近根节点的节点管辖的数组区间范围越大, 可以利用深搜,根据访问的时间戳的顺序,依次为每个节点标记在树状数组中的下限 l[i], 因为要使得越靠近叶子节点的节点管辖区间越小,可以利用深搜回溯的特点,即越靠近叶子的节点,回溯到本身的时间差越短,这个时间差即为该节点覆盖的数组区间长度,因此每个节点覆盖的数组上. 阅读全文
posted @ 2012-08-07 13:16 'wind 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题意: 一组造作: 0 n 创建一个 n*n 的矩形。 1 x y num 在(x,y)位置加上值 num。 2 l b r t 输出矩阵 l<=x<=r,b<=y<=t 内所有数值和。 3 退出。分析: 二维树状数组。#include<stdio.h>#include<string.h>int a[1025][1025];int n;int lowbit(int x){ return (x)&(-x);}void add(int x,int y,int num){ while(x<=n) { int ty=y; while(ty& 阅读全文
posted @ 2012-08-07 11:11 'wind 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 题意: 模拟手机的输入,手机每个按键负责一定数量的字符,知道了一些单词,和这些单词的使用频率,给出一个按键的顺序,问每个数字所在位置对应的最大可能的输入单词是哪个,如果找不到 输出‘MANUALLY‘分析:建立字典树,把单词存起来,并累加每个字母使用的频率,每出现输入的一个数字,找出那个数字上对应的字母所在位置频率最大的单词。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))char res[105];char tmp[105];int la;struct node{ int co 阅读全文
posted @ 2012-08-07 10:43 'wind 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个 有 n 个节点,m 条边的的有向图,求图中的次短路,如果有超过两条以上的最短路,那么次短路的长度即为最短路的长度。分析: 可以先求出最短路,并保存路径,从 i 到 j 次短路的构成可以用 i 到 点k的次短路加上k 到j 的最短路构成,而i 到 k 的次短路也是通过同样的方法求出, 因此可以通过枚举不在最短路上的边来依次推出 1 到 2..n 的次短路。#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 0x1f1f1f1fint g[1003][1003];in 阅读全文
posted @ 2012-08-06 17:38 'wind 阅读(180) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#define clr(x)memset(x,0,sizeof(x))using namespace std;#define INF 0x1f1f1f1fstruct node{ int from,to,next,w;}e[1000000];int tot;int head[5003];void add(int s,int t,int wi){ e[tot].from=s; e[tot].to=t; e[tot] 阅读全文
posted @ 2012-08-06 15:10 'wind 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 题意:有以个 有 N 个节点的树形地图,问在这些顶点上最少建多少个电话杆,可以使得所有顶点被覆盖到,一个节点如果建立了电话杆,那么和它直接相连的顶点也会被覆盖到。分析:用最少的点覆盖所有的点,即为求最少支配集。 可以用树形DP。① dp[r][0] += min(dp[i][0],dp[i][1],dp[i][2]) dp[r][0]表示在自 r 顶点自身建, 以 r为根节点的树所需要的最少覆盖数。② dp[r][1] += min(dp[i][0],dp[i][1])dp[r][1]表示在r的子节点建, 以 r为根节点的树所需要的最少覆盖数。③ dp[r][2] += min(dp[i][0 阅读全文
posted @ 2012-08-06 10:03 'wind 阅读(941) 评论(0) 推荐(0) 编辑
摘要: 题意 : 已知有n 个浮冰 ,和每个企鹅可以跳跃的最大距离,知道了每个浮冰的坐标,和该浮冰上一开始有的企鹅数量,和 该浮冰最多能承受的跳跃次数,跳跃次数是指从该浮冰跳出的最大次数,浮冰的编号从 0 开始,里面哪些浮冰满足 最后所有的企鹅都能够到达。分析: 建立一个超级 源点 s=0 ,将每个浮冰分成两个点,左边的点记为 1..n ,右面的点依次为 n+1..n+n,在浮冰 i 和 i+n 之间连一条从i 到 i+n的边,容量设为 浮冰 i 上的 最大跳跃次数,在源点 s 和 每块冰 i(1..n)之间连一条从s 到 i 的边,容量设为冰 i 上初始的企鹅数量,即为该点的初始流量,如果 冰 i 阅读全文
posted @ 2012-08-05 20:26 'wind 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 题意: 有一对 新人举办婚礼,邀请了n-1对夫妇,有一张很长的桌子,要求左右的夫妇都分别坐在桌子的两侧,且知道了 m 对 人有关系,要求新娘对面不能出现有关系的两个人。分析: 在 有关系的人之间连边,在所有夫妇之间连边,用奇数表示男的,偶数表示女的,用2-sat方法染色,最后输出不在新娘一边的人。#include<stdio.h>#include<string.h>#define op(x) ((x)=='h'?1:0)#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b 阅读全文
posted @ 2012-08-04 23:56 'wind 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 N 个木桩,知道了 m 对木桩的高度差, 问从一点 a 跳到到 b所需要经过的最小高度差。分析:将 Floyed 作一点改动 ,松弛操作 变为 g[i][j]=min(g[i][j],max(g[i][k],g[k][j]))#include<stdio.h>#include<string.h>#define INF 0x1f1f1fint min(int a,int b){ return a<b?a:b;}int max(int a,int b){ return a>b?a:b;}int g[305][305];int main(){ int 阅读全文
posted @ 2012-08-04 20:07 'wind 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 N 个男生和 N 个女生,已知每个男生对每个女生的喜欢程度,和每个女生对每个男生的喜欢程度。 找到一种搭配方式使得总的满意程度最高。稳定婚姻解法: 如果男A与女C匹配,男B与女D 匹配,但是A更喜欢D,D更喜欢A,那么这个婚姻就不是稳定的。稳定婚姻问题的算法步骤大致如下:(男士优先) 1.男士先选择自己最爱的人去求婚,如果有多个男士的最爱相同,那么女士就选择更爱的那位男士,那么其他的男士在这次求婚中失败。 2.上次求婚失败的男士再选择自己次爱的女士进行求婚,如果这位女士没有匹配男士,那么这两个人就进行匹配,如果这位女士有匹配的男士,但是如果这位女士更喜欢这位正在求婚的男士,那么这位 阅读全文
posted @ 2012-08-04 18:56 'wind 阅读(524) 评论(0) 推荐(0) 编辑
摘要: 题意: HAHA 早上有 n 件事情要做, 知道了有 m 个关系,每个关系 a ,b 表示a 事情必须在b 事情之前做,问做完这些事共有多少种可能的顺序。分析: 可以把题目看成是 一个有向图,其中共有多少种拓扑排序的方法。 首先图中不能有环,可以先传递闭包,看看有没有 g[i][i]=1 的情况出现,如果有则说明有环。 由于 n <=17 ,1<<17 相对较小,可以枚举所有状态进行递推。① 递归写法#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[1 阅读全文
posted @ 2012-08-04 14:45 'wind 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 题意: 一个有 N 个连续房间的旅馆,对 m 次询问对应两种操作。 1 a 询问是不是有连续长度为a的空房间,有的话住进最左边 2 a b 将[a,a+b-1]的房间清空分析: 区间合并类线段树。update 成段更新 query 找到满足条件的最左端点#include<stdio.h>#include<string.h>#define maxn 50005int max(int a,int b){ return a>b?a:b; }int lsum[maxn<<2];int rsum[maxn<<2];int msum[maxn<& 阅读全文
posted @ 2012-08-04 11:43 'wind 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定一个无向图,图中存在一些桥,之后向图中加入Q条边,问每次加入这条边后图中剩下的桥的数量。分析: 首先对无向图求割边,并进行缩点,使之成为一棵树,这棵树上的所有边都是割边,之后对于每次询问,会连接树上的两个节点,如果这两个节点之间的边与这条边形成一个环,那么这些边就不再是割边,对于缩点后的树,先随意定出一个根,之后对每个节点记录他的父节点,以及他在这棵树中的深度,之后对于每次询问只要从叶子节点一直搜到他们的lca,把路径上的割边去掉。#include<stdio.h>#include<string.h>#include<stdlib.h>#defi 阅读全文
posted @ 2012-08-04 00:48 'wind 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 题意: 有两个字符串,给出 Q 个询问,每个询问有两种方式: 1 p i c 把第 p 个字符串的第i 个字符换成 字符 c, 2 i 从位置i 开始,两个字符串连续相同的子串的最大长度为多少。分析: 线段树。 数组len[rt] 保存rt 区间从最左端开始的最长子串, 合并时,如果len[rt<<1]==mid-l+1 则 len[rt]=len[rt<<1]+len[rt<<1|1] ,说明可以把右儿子区间直接接到左儿子区间上,否则由于左儿子区间与右儿子区间断开, len[rt]=len[rt<<1].#include<stdio.h& 阅读全文
posted @ 2012-08-03 21:48 'wind 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出 N 只鱼的坐标,问用半径为 1 的渔网做多可以捕到多少鱼。分析: 以每条鱼为圆心,作半径为1 的圆,枚举两两圆的交点,比较以每个交点为圆心半径 1 的渔网最多捕获的鱼数。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>const double eps=1e-6;struct node{ double x,y;}q[305];double dis(node a,node b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b. 阅读全文
posted @ 2012-08-03 10:59 'wind 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 题意:一个有 N 个节点的有向无环图, 已知有 M 条边,问最少放多少机器人可以使得图中任何一点都至少可以被其中一个机器人达到。分析: 最小路径覆盖。 因为可以经过一些点到达另一些顶点,所以需要传递闭包将每个点可达的顶点都连上边,然后求最小路径覆盖。 最小路径覆盖 = 总权 - 最大匹配#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[505][505];int link[505];int v[505];int n;int find(int x){ int i; for 阅读全文
posted @ 2012-08-01 17:42 'wind 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出 N 个矩形,可以相互覆盖,求所有矩形合在一起的轮廓总长度。分析:先对所有矩形按左下角的Y 坐标排序,让矩形的所有点向 X 轴投影,记录所有的投影的X值,对X 排序,分段累加X 坐标差值; ① 如果 s[i].y1>up 说明两个矩形没有交集,即新的矩形没有被前一个矩形覆盖到 ,res+=2*(right[i]-right[i-1]) 累加新的横边覆盖值。 ② 如果 s[i].y2>up 说明新的矩形下边界在该 相邻 X 的区间被覆盖,所以只要更新给 区间的上边界 UP=s[i].y2 然后对矩形按左下角的X 坐标排序,让矩形向y轴作投影,最后按照类似的方法求出 所有竖 阅读全文
posted @ 2012-07-31 19:33 'wind 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 题意: 计算机里配置了双核的CPU, 有 N 个原件, 知道了在每个原件在 每个CPU 上的 耗费,其中有 M 对原件需要协同工作,并且有协同工作的耗费,如果这些对原件是在同一个CPU上工作的话,就不计算协同工作的耗费。分析: 建图: 把两个CPU 分别看成是 源点和汇点。 从源点 到 每个顶点连接一条 容量为 AI 的边, 从每个顶点 到 汇点 连接一条容量为 BI 的边, 如果 两个原件具有协同工作关系,就在两个原件之间连接一条 容量为 w 的双向边。 求出的最小割即为最小费用, 而最小割可以通过求最大流来求得。#include<stdio.h>#include<stri 阅读全文
posted @ 2012-07-30 22:00 'wind 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 1) 当前的话与前面的某些真的话冲突,就是假话; 2) 当前的话中X或 阅读全文
posted @ 2012-07-30 14:15 'wind 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 题意:有 M 个供应商,N 个店主,K 个物品, 知道了每个供应商对每个物品的供应量,每个店主对每个物品的需求量,和每个供应商把每个物品送到每个店主所需要花的费用, 问已有的货物是否可以满足所有供应商的需求,如果满足,求出供应所需花费的最小费用。分析:忘记把反向费用设为正向费用的负值,再次卡了N久 T-T...谨记之... 由于每个物品互不相关,所以可以分开求费用流,最后把所有物品的费用流加起来即为总的费用流。 建图: 源点 S=0 汇点 T=N+M+1 供应商编号 1...M 店主编号 M+1...M+N 流量边: 源点到每个供应商的边的容量为物品的供应量; 每个供应商和每个店主之间的边的容 阅读全文
posted @ 2012-07-28 17:46 'wind 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 题意: 老板要给一些人发工资,但是一些人要求自己的工资必须比另一些人高,问最少需要发多少工资才能满足所有人的需求,如果不能满足输出-1,基础工资是 888.分析: 由于 人数比较多 ,不能用邻接矩阵,排序用广搜排,如果排序结果发现有环(即找到的入度为 0 的点没有 n 个)的话,则无法满足所有人的要求。 因为要使工资尽可能少,所以需要逆向拓扑排序。#include<cstdio>#include<cstring>#define max(a,b)(a)>(b)?(a):(b)#define clr(x)memset(x,0,sizeof(x))struct node 阅读全文
posted @ 2012-07-28 15:13 'wind 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一些人的名次关系,问存不存在冲突的情况。分析: 这题其实就是判断拓扑排序的过程中是否会出现环,判断环的方法是: 在某一次排序的过程中找不到入度为 0 的点,即说明有环。 PS: 重边 需要考虑...#include<cstdio>#include<cstring>#define clr(x)memset(x,0,sizeof(x))int g[102][102];int indegree[102];int main(){ int i,j,k,n,m,a,b; bool flag; while(scanf("%d%d",&n,&am 阅读全文
posted @ 2012-07-28 14:26 'wind 阅读(183) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 17 下一页