04 2013 档案

SPOJ1029 - Matrix Summation
摘要:题目大意给定一个N*N的矩阵A,每个元素的初始值为0,可以对矩阵进行一下两种操作:1、修改A[i][j]的值为d,(1<=i,j<=N)2、查询左下角坐标为(x1,y1),右上角坐标为(x2,y2)的子矩阵的元素和题解基本的树状数组,单点增减,区间求和#include<iostream>#include<cstring>#include<cstdio>#define MAXN 1050using namespace std;int n;int c[MAXN][MAXN],a[MAXN][MAXN];int lowbit(int x){ retur 阅读全文

posted @ 2013-04-23 01:55 仗剑奔走天涯 阅读(198) 评论(0) 推荐(0) 编辑

HDU3584 - Cube
摘要:题目大意 给定一个体积为N*N*N立方体,每个单位小立方体A[x][y][z]里有一个值,初始值全部为0,我们可以对立方体进行一下两种操作: 1、查询A[x][y][z]的奇偶性 2、对子立方体的每个元素的值进行增减 题解 三维树状数组,就是POJ2155 Matrix的三维推广形式 代码: #include<iostream>#include<cstdio>#include<cstring>#d... 阅读全文

posted @ 2013-04-23 01:45 仗剑奔走天涯 阅读(228) 评论(0) 推荐(0) 编辑

HDU3015 - Disharmony Trees
摘要:题目大意 和POJ1990是一样的,只是把max改成min了。。。 给定N对二元组(x1,y1),(x2,y2),(x3,y3)…(xn,yn).每两个二元组之间(假设分别为i和j,i!=j)将会产生一个值ans(i,j)=min(xi,xj)*|yi-yj|,计算出sigma(ans(i,j))(1<=i,j<=n,i!=j) 题解 需要对x,y进行离散,然后把y值按降序排序,之后的做法和POJ... 阅读全文

posted @ 2013-04-23 01:26 仗剑奔走天涯 阅读(241) 评论(0) 推荐(0) 编辑

POJ1990 - MooFest
摘要:题目大意给定N对二元组(x1,y1),(x2,y2),(x3,y3)…(xn,yn).每两个二元组之间(假设分别为i和j,i!=j)将会产生一个值ans(i,j)=max(xi,xj)*|yi-yj|,计算出sigma(ans(i,j))(1<=i,j<=n,i!=j)题解我们可以先对x值按升序排序,之后就是用两个树状数组进行维护了,公式推导过程不知道怎么讲。。。直接看代码好了。。。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define 阅读全文

posted @ 2013-04-23 01:20 仗剑奔走天涯 阅读(238) 评论(0) 推荐(0) 编辑

POJ3321 - Apple Tree
摘要:题目大意有一颗苹果树,它有N个树叉,每个树叉最开始的时候都结了一个苹果,有时卡卡会从树上把某个苹果摘下来,有时没结苹果的树叉上又会长出苹果来,卡卡有时还想知道某个子树的总苹果数量有多少题解题目也是要求实现单点加减,区间求和的功能,赤裸裸的树状数组呀,不过此题给出的不是一个线性的序列,而是树形的,因此我们需要先进行预处理,把树转换为线性序列。用邻接表建立好树,然后对树进行重新编号,这个可以用DFS来实现,每个节点记录第一次访问和最后一次访问时的编号,假设为l和r,那么区间[l,r]之间的所有编号是以此节点为根节点的子树的各个节点的编号,这样就把树转化为线性结构了,之后就是用树状数组来处理了代码: 阅读全文

posted @ 2013-04-23 00:09 仗剑奔走天涯 阅读(287) 评论(0) 推荐(0) 编辑

POJ3468 - A Simple Problem with Integers
摘要:题目大意 给定N个整数,A1,A2,A3…An。可以对这些数进行一下两种操作: 1、"C a b c" 对区间[a,b]内的所有数都加上c 2、"Q a b"询问区间[a,b]的和 题解 一般树状数组都是实现单点修改和区间求和或者单点查询和区间加减的功能,而此题是要求实现区间查询,区间加减的功能,我们依然能够用树状数组来处理,具体怎么处理请参看wyl神牛的树状数组总结吧 代码: #include<... 阅读全文

posted @ 2013-04-22 23:27 仗剑奔走天涯 阅读(170) 评论(0) 推荐(0) 编辑

HDU1166 - 敌兵布阵
摘要:题目大意 给定N个数,可以对这些数进行三种操作: 1、Add(i,x),对第i个数增加x 2、Sub(i,x),对第i个数减x 3、Query(x,y) ,查询区间[x,y]的和 题解 赤裸裸的树状数组啊。。。我还二逼得WA了两次,原因是读入字符串的时候用的while(cin>>s),然后就一直不能退出循环了,不知道为啥会这样。。。换成C语言风格的字符串,然后用scanf读入就没问题了。。尼玛坑爹... 阅读全文

posted @ 2013-04-20 00:08 仗剑奔走天涯 阅读(244) 评论(0) 推荐(0) 编辑

POJ2155 - Matrix
摘要:题目大意 给定一个大小为N*N的矩阵,每个元素要么为0要么为1,刚开始时A[i][j]=0,(1<=i,j<=N) 每次给出矩阵的左下角坐标(x1,y1)和右上坐标(x2,y2),将矩阵中的所有数组取反,或者给出一个坐标(x,y),要求你查询A[x][y]的值是多少。 题解 查询一个点和修改一个区间,这刚好是树状数组的可以实现的功能 代码: #include<iostream>#include<c... 阅读全文

posted @ 2013-04-19 22:51 仗剑奔走天涯 阅读(148) 评论(0) 推荐(0) 编辑

POJ1195 - Mobile phones
摘要:题目大意 给定一个N*N的网格,刚开始每个网格的值都是0,接下来会对这些网格进行操作,有一下两种操作: 1、”X Y A“对网格C[x][y]增加A 2、”L B R T“ 查询所有(L<=X<=R,B<=Y<=T)的网格C[X[Y],并返回它们的总和 题解 非常经典的二维树状数组题目,直接看代码吧 代码 #include<iostream>#include<cstdio>#include<cst... 阅读全文

posted @ 2013-04-19 22:38 仗剑奔走天涯 阅读(161) 评论(0) 推荐(0) 编辑

POJ3067 - Japan
摘要:题目大意 日本岛的东海岸和西海岸分别有N和M个城市,在这些城市中有K条高速公路,每条公路连接着东海岸一个城市和西海岸的一个城市,问总共这些公路有多少交叉点 题解 认真观察可以发现,只有这种情况两个线段(规范的)才是有交点的,假设两条的坐标的左右端点分别为(x1,y1)和(x2,y2),只有当x1<x2并且y1>y2或者x1>x2并且y1<y2的时候两个线段才是相交的。这样的话就很好解决这个题目了,... 阅读全文

posted @ 2013-04-19 22:25 仗剑奔走天涯 阅读(446) 评论(0) 推荐(0) 编辑

POJ24810 - Cows
摘要:题目大意 给定N对二元组(s,e),对于第i对二元组(s[i],e[i]),在前1~i-1对二元组中计算出符合这样要求的二元组(s[j],e[j])的总数量,s[j]<=s[i],e[j]>=e[i],并且e[j]-s[j]>e[i]-s[i]。 题解 先按e降序排序,如果e相等则按s升序排序,这样处理之后,接下来就和POJ2352的stars的处理是一样的,对于第i个数,只要小于a[i].s的数... 阅读全文

posted @ 2013-04-19 21:41 仗剑奔走天涯 阅读(164) 评论(0) 推荐(0) 编辑

HDU1556 - Color the ball
摘要:题目大意给定区间[1,N],初始时区间的每个数都是0,对其进行多次操作,每次给出两个数a和b,要求你对在区间[a,b]的数全部加1,在操作结束后输出每个数的值题解最基础的树状数组了,就是修改区间[a,b]的值,询问单个元素的值代码:#include<iostream>#include<cstring>#include<cstdio>#define MAXN 100005using namespace std;int c[MAXN];int n;int lowbit(int x){ return x&-x;}void add(int x,int d){ 阅读全文

posted @ 2013-04-19 20:19 仗剑奔走天涯 阅读(180) 评论(0) 推荐(0) 编辑

UVa12086 - Potentiometers
摘要:题目大意给定n个数,你的任务是实现如下两种操作:“S x y“ 把第x个数修改为y“M x y”计算第X个数到第Y个数之和题解这刚好是树状数组的功能,修改元素的值和求区间和代码#include<iostream>#include<cstdio>#include<cstring>#include<string>#define MAXN 200005using namespace std;int n;int c[MAXN];int lowbit(int x){ return x&-x;}void add(int x,int d){ while 阅读全文

posted @ 2013-04-19 20:08 仗剑奔走天涯 阅读(332) 评论(0) 推荐(0) 编辑

POJ2352 - Stars
摘要:题目大意 按纵坐标升序给定N颗星星的坐标(x[i],y[i]),计算出每个等级的星星有多少,对于等级是这样定义的:对于第i颗星星,计算出1~i-1颗星星中横坐标和纵坐标都比第i颗星星小的数量ans,那么ans就是此颗星星的等级。 题解 很经典的树状数组入门题目,直接看代码吧,不过有一个地方要注意,就是横坐标为0的情况,如果在更新的时候循环用的是while(x<=MAXS),对于x=0的情况,会无限... 阅读全文

posted @ 2013-04-17 15:48 仗剑奔走天涯 阅读(277) 评论(0) 推荐(0) 编辑

SGU180 - Inversions
摘要:题目大意给定N个数,a1,a2,3,a4..an,要求你求出这样的对数:i<=i<j<=n并且a[i]>a[j]。题解就是逆序对问题。。。果断用树状数组做,数据有点大0<=Ai<=10^9,需要进行离散化,离散的时候注意会有相同的数,最先没注意这个,提交上去第二组数据就WA了。代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 70000using namespace std;typedef s 阅读全文

posted @ 2013-04-17 15:23 仗剑奔走天涯 阅读(415) 评论(0) 推荐(0) 编辑

POJ - Ultra-QuickSort
摘要:题目大意 给定N个数(没有相同的值),对N个数进行升序排序,每次只能交换相邻的两个数,问最少需要多少次交换才能够让N个数成为升序排列的 题解 就是逆序对问题,如果a[i]>a[j](i<j)则就是一个逆序对,此题可以用归并排序解决,也可以树状数组,不过我是当树状数组来练习的。此题数据有点大0 ≤ a[i] ≤ 999,999,999,所以需要把N个数进行离散化,因为我们对每个数的值并不感兴趣,只需... 阅读全文

posted @ 2013-04-17 15:10 仗剑奔走天涯 阅读(195) 评论(0) 推荐(0) 编辑

POJ3928 - Ping pong
摘要:题目大意一条大街上从西到东依次住着N个乒乓球爱好者,他们经常举办比赛。每个人都有一个不同的技能值a[i]。每场比赛需要三个人,一个裁判加两个爱好者,不过比赛有一个要求就是裁判的技能值需要在两个爱好者的中间,并且居住的位置也要求在两个爱好者的中间,问总共能够举办多少场比赛。题解LRJ《训练指南》上树状数组的例题,我们枚举每一个人当裁判的情况,对于第i个人当裁判,假设a[1]到a[i-1]有pre[i]个比a[i]小,那就有i-1-pre[i]个人比大。同样假设a[i+1]到a[n]有suc[i]个比a[i]小,则有n-i+1-suc[i]个人比a[i]大,那么第i个人当裁判将有pre[i]*(n 阅读全文

posted @ 2013-04-17 14:54 仗剑奔走天涯 阅读(349) 评论(0) 推荐(0) 编辑

树状数组专题
摘要:树状数组练习题目 阅读全文

posted @ 2013-04-16 14:06 仗剑奔走天涯 阅读(130) 评论(0) 推荐(0) 编辑

UVa10624 - Super Number
摘要:题目大意给定两个数n和m,如果长度为m的数满足对于每个i(n<=i<=m),数字的前i位都能被i整除,那么这个数就是超级数,求出字典序最小的符合要求的超级数。题解直接暴力就行,如果每次进行整除判断的时候,对当前数每位都进行取余运算,那么将会超时,因此每18位进行一次取余(long long的数据范围为:-9223372036854775808..9223372036854775807,这样在1S左右就可以AC了。#include<iostream>#include<cstdio>#include<string>using namespace st 阅读全文

posted @ 2013-04-15 13:23 仗剑奔走天涯 阅读(152) 评论(0) 推荐(0) 编辑

UVa10120 - Gift?!
摘要:题目大意美丽的村庄里有一条河,N个石头被放置在一条直线上,从左岸到右岸编号依次为1,2,...N。两个相邻的石头之间恰好是一米,左岸到第一个石头的距离也是一米,第N个石头到右岸同样是一米。礼物被放置在第M个石头上,Frank从左岸开始跳跃,对于第i步,必须跳2*i-1米,每次可以向左方向跳,也可以向右方向跳,跳到河岸跳跃就结束了,问Frank能否拿到礼物。题解每次跳跃有两种选择,向右或者向左,用搜索非常的好实现,只是2<=N<=10^6必须得跪。。。实在想不出怎么优化。。。看了下网上的题解,当N>=49一定能跳跃到M的位置上,直接输答案即可。。。即N<49用搜索,N&g 阅读全文

posted @ 2013-04-14 00:34 仗剑奔走天涯 阅读(282) 评论(0) 推荐(0) 编辑

UVa10396 - Vampire Numbers
摘要:题目大意如果一个数为n=x*y,符合以下要求:1、n为偶数,位数L为4或者6或者82、x和y的位数都为L/23、x和y两个数字连接在一起,然后进行重排可以得到n4、x和y两者的尾数不能同时为0找出所有满足上述条件的数字。题解果断暴力搜索,先进行预先计算(和打表差不多了。。),把n等于4和6以及8的符合的数字计算出来并存储好,我们用set容器来存储,如果用vector容器的话,输出顺序将不是有序的,因此我们选择set容器。刚开始我是用sprintf函数把数字转化成字符串,然后在进行相应的操作的,提交上去的时间异常恐怖啊17.237S。。。然后没用这个函数之后。。时间少了好多。。。只要2.748S 阅读全文

posted @ 2013-04-13 23:50 仗剑奔走天涯 阅读(248) 评论(0) 推荐(0) 编辑

UVa10602 - Editor Nottoobad
摘要:题目大意给定N个单词,要求你用Nottoobad编辑器进行输入,如果你当前需要输入的单词与之前一个已经输入的单词有公共部分,那么这公共部分是不需要输入的,只需要粘贴复制即可,第一个单词必须全部输入,其他的单词可以按任意顺序输入,要求你安排一个输入顺序,使得输入操作的次数最少。题解一个很简单的贪心,每次输入选择与前一个输入的单词的公共部分长度最长的单词即可,如果公共部分为0,则输入任意一个单词都行。#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXN 105int f[MAXN];c 阅读全文

posted @ 2013-04-08 14:58 仗剑奔走天涯 阅读(211) 评论(0) 推荐(0) 编辑

UVa1419 - Ugly Windows
摘要:题目大意给定一个长为N,宽为M的屏幕,屏幕上有一些窗口,窗口之间有一些重叠,求出在最顶端的窗口。题解就是一个很简单的模拟,不过有一个坑爹的地方,那就是窗口的嵌套,例如这样的数据5 5AAAAAABBBAAB. BAABBBAAAAAA答案是B,而我刚开始写的代码会输出AB,因为我只是判断是否为完整的矩形。即如果是最顶端的窗口,那么它的内部应该全部是'.'。#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXN 105int visit[MAXN][MAXN];int 阅读全文

posted @ 2013-04-08 01:25 仗剑奔走天涯 阅读(211) 评论(0) 推荐(0) 编辑

四月份计划
摘要:大概在三月中旬的时候hlm学长和我说集训队有人退出了,因此添加需要一名新队员,三月份月赛的第一名将入选。听到这个消息着实让我高兴了一阵子。之后半个月就很少出门了,除了上课基本呆寝室刷题,虽然效率不高,但还是刷了一定数量的题目,月赛也顺利的拿到第一名了,第二天下午hlm学长就通知我进队了,要我把电脑搬到实验室去,听到这个消息让我激动的跳起来了,真的很高兴,由于寝室五个人都有电脑,听得听歌,玩的玩游戏,看的看电影,整个寝室闹哄哄的,根本搞不了什么学习,因此一直希望有个安静的学习环境,这次终于实现了。不过搬过去的几天状态似乎都不好,由于每天上午都有课,所以基本是吃完中饭去的,整个下午基本都是脑... 阅读全文

posted @ 2013-04-06 02:38 仗剑奔走天涯 阅读(191) 评论(0) 推荐(0) 编辑

UVa1316 - Supermarket
摘要:题目大意有N个物品,每个物品在都有一个截止日期,如果在截止日期之前(包括截止日期)卖出将会获得相应的利润,卖出物品需要一个单位时间,问最多能获得多少利润?题解和UVa1153的解题思路是一样的,用优先队列来维护(小根堆),先让物品按截止时间升序排序,设ans为已选择物品需花费的总时间(等于优先队列的元素个数),那么对于某个物品如果它的截止日期大于ans,则加入优先队列,如果小于或者等于ans,再判断它的利润是否大于优先队列中利润最低的那个物品的利润,如果大的话,用这个物品替换优先队列中利润最低的那个物品,用截止时间长利润大的物品替换截止时间短利润小的物品肯定是更优的选择。#include< 阅读全文

posted @ 2013-04-06 01:29 仗剑奔走天涯 阅读(346) 评论(0) 推荐(0) 编辑

UVa10037 - Bridge
摘要:题目大意在一个晚上有N个人过河,他们总共只有一个手电筒,需要有手电筒才能过河,每次最多两个人同时过河,每个人的过河速度都不同,所以每次过河时间等于速度最慢的那个人的过河时间,让所有人全部过河,花费的时间最少是多少?题解如果只有一个人过河,那么过河的总时间就是这个人过河的时间。如果是两个人过河,那么总时间为过河速度较慢的那个人的过河时间。如果是三个人过河,假设速度从慢到快分别为a,b,c,分别用A,B,C表示三个人,那么我们会先让A和C一起过河,然后A返回,之后再让A和B一起过河,总花费时间为a+b+c。当人数大于等于4时,我们每次都让两个速度最慢的人过河,让这两个人过河我们有两种策略(其他过河 阅读全文

posted @ 2013-04-05 17:39 仗剑奔走天涯 阅读(257) 评论(0) 推荐(0) 编辑

UVa11078 - Open Credit System
摘要:题目大意给定一个长度为N的序列A,找出两个整数A[i]和A[j](i<j),使得A[i]-A[j]尽量大题解最简单的做法就是直接用二重循环枚举A[i]和A[j],不过对于N=10000的数据量显然会超时。对于每个j,我们要找到最大的A[i],只要在枚举j的时候顺便用一个变量维护一下A[i]的最大值就行,这样时间复杂度就由O(N^2)降低到O(N)了。代码#include<stdio.h>#include<stdlib.h>#define MAXN 100005#define INF 0x7ffffffflong a[MAXN];long MAXS;long max 阅读全文

posted @ 2013-04-04 00:37 仗剑奔走天涯 阅读(173) 评论(0) 推荐(0) 编辑

POJ3279 - Fliptile
摘要:题目大意给定一个N*M的网格,每个网格里有一个数字,0或者1,要求你翻转尽量少的网格,使得所有网格的数字都变为0,对于某一个网格进行翻转操作时,与它有公共边的网格全部会被翻转。题解和Uva11464的方法一样,都是枚举第一行的状态,只要第一行的状态确定了,那么每行的状态都确定了。代码#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXN 20int a[MAXN][MAXN],b[MAXN][MAXN],ans[MAXN][MAXN];int n,m;int check(int s) 阅读全文

posted @ 2013-04-03 18:11 仗剑奔走天涯 阅读(799) 评论(1) 推荐(0) 编辑

HDOJ1003 - Max Sum
摘要:题目大意:和1231一样,求最大连续子序列和,只是这个题目是要求求的是最大连续子序列和的首元素位置和尾元素位置。题解:直接把1231的代码稍微修改一下就行了。。。#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXN 100005typedef struct{ long x,y;} NODE;NODE path[MAXN];long d[MAXN],a[MAXN];int main(void){ long i,n,maxs,l,r,T,p; scanf("%ld" 阅读全文

posted @ 2013-04-03 00:04 仗剑奔走天涯 阅读(190) 评论(0) 推荐(0) 编辑

HDOJ1231 - 最大连续子序列
摘要:题目大意:求最大连续子序列和,并输出其序列的首元素和尾元素。题解:方程非常简单:d[i]=max(0,d[j-1])+a[i],主要是最大连续子序列和的首元素和尾元素怎么记录的问题,其实也非常简单,就是在当我们求以位置i为结束位置的最大连续子序列和的时候,顺便记录下以位置i结束的最大连续子序列和的首元素和尾元素,如果序列的长度为1,则尾元素和首元素都是a[i],如果大于1,则首元素为d[i-1]的首元素,尾元素依然是a[i]。#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXN 1 阅读全文

posted @ 2013-04-02 23:46 仗剑奔走天涯 阅读(148) 评论(0) 推荐(0) 编辑

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

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