上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 25 下一页
摘要: 题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次看下数据10的五次方,10的五次方的硬循环是避免不了了,很明显在计算被淹次数的时候要能缩到logN的复杂度才好。于是想到先对桥由低到高排一下序,然后获取前一次的落水值和这次的涨水值,只要桥高度在涨落直接的必定是又被淹了一次。要多次对序列的某个区间进行加操作,自然是线段树了,确定区间的时候,就用二分,在进行线段树的时候 用懒惰标记#include #include #include #include #define Lson (rt= 阅读全文
posted @ 2014-03-12 17:09 KRisen 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 大白书上的题目,比较巧妙的是其分析,为了求某个i点做裁判的时候的情况数,只要知道左边有多少比它小的记为ansc,右边有多少比它小的记为ansd,则总种数,必定为ansc*(右边总数-ansd)+ansd*(左边总数-ansc)。为了速度求出ansc和ansd,用到树状数组,这倒不是很难得地方,每次读到a[i],更新a[i]值+1即可。反过来求一次即可求出来 ansd注意最后数据可能超过32位整数,因此用long long树状数组的使用还有些不熟练。。。要继续加强#include #include #include using namespace std;int x[100005];long l 阅读全文
posted @ 2014-03-11 23:46 KRisen 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 上次周赛碰到这个题目,居然都没思路,真是不应该啊,起码也应该想到枚举法。因为题目只允许每一row进行reverse操作,而每两列可以进行交换操作,所以首先把row的变化固定下来,即枚举第一列与第1-m列进行交换,之后逐个检查每一行第一列的状态 与 终态是否一致,不一致的话则该行就一定要进行reverse操作了,这样下来,每次枚举就把row的reverse变化给固定下来,接下来只要枚举 接下来的2-m行互相的列变换即可,只需一个嵌套循环即可,总的循环也只是三重 而n和m仅有100,规模承担的起一个简单的枚举暴力题 虽然说还是带有一点技巧的,怎么比赛的时候就没想出来呢!!!#include #in 阅读全文
posted @ 2014-03-11 23:40 KRisen 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的C数组就可以表示出整个序列的值,并且可以用logN的复杂度进行改值与求和。这道题目我根本不知道怎么和树状数组扯上的关系,刚开始我想直接按图来遍历来做,后来用树状数组做完都跑了600+MS,那样估计是TLE了。做法就是用DFS把整个图重建一遍,代号小的点在叶子,代号大的点为根。记录每个根的起始点号为 idl,根点号为 idh,则求某个根的苹果和就直接调用树状数组的sum即可。不过前提是要建好树,我一开始不明白为什么要建一颗标准树,即就是按1 2 3 4。。。。,每个点有一个苹果的递增的标准树,因为整个图并不是按这个标准来建得,2号点C值为1号 阅读全文
posted @ 2014-03-08 21:26 KRisen 阅读(259) 评论(0) 推荐(0) 编辑
摘要: ZJU 三月月赛题,当时见这个题目没辙,没学过splay,敲了个链表TLE了,所以回来好好学了下Splay,这道题目是伸展树的第二题,对于伸展树的各项操作有了更多的理解,这题不同于上一题的用指针表示整个树,采用纯数组表示,null节点即为0节点,这样就带来一个问题,就是有时候会有事没事就指向0节点,结果把0节点也算在结果里面,弄得我要几个地方都判断下。#include #include #include #include #define N 310000using namespace std;int tot,root,n,m;int ch[N][2],val[N],gcdst[N][2],si 阅读全文
posted @ 2014-03-07 23:26 KRisen 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 上次ZOJ月赛碰到一个题目要求对序列中的某个区间求gcd,并且还要随时对某位数字进行修改 插入 删除,当时马上联想到线段树,但是线段树不支持增删,明显还是不可以的,然后就敲了个链表想暴力一下,结果TLE。那天回来后搜了下题解,发现大家都在说平衡树 Splay,就好好学了下,这玩意还是挺难学的,我看了好久。最后还是从网上找了三篇论文打印了下,趁着TCG讲数据库的时候(这课真的好催眠)好好看了下,才搞清楚基本的Splay操作这是第一道Splay题目,基本上是照着模板敲出来的,没办法,第一次学,好多地方不熟练,不过整个过程我已经形成了一个条理了,这倒是一大收获由于自己的粗心,好几个细节错了,调试了好 阅读全文
posted @ 2014-03-06 20:32 KRisen 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块。原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的子集s0,然后 s1=S-s0来代表除该子集的另一个集合,接下来分两种情况,如果这个子集是通过把 S保留x,切割y,则转移到dp(s0,x)和dp(s1,x),另一种情况是转移到dp(s0,y)和dp(s1,y)。为了更加缩小状态,统一把转移方程的 x换成 min(x,sum[S]/x),sum为该状态下的面积#include #include #include //#include #defin 阅读全文
posted @ 2014-03-05 13:54 KRisen 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 上次的ZJU月赛题,规则比较复杂,当时就连题意都没摸清楚,只觉得非常复杂比完后敲啊敲啊敲,连续WA啊,该反思下自己,没按照题意来设置条件,题目中说了 白球入袋并且。。。 给对手加分 ,白球未入袋并且。。。给对手加分,这个白球未入袋的情况也要加在判断条件里啊啊啊啊,还有就是有个地方要排序我居然忘了,好久都没发现。#include #include #include #include using namespace std;int n,m;int a[1010];int vis[10010];int ans[2];int hit[1010],c[1010];int main(){ while... 阅读全文
posted @ 2014-03-04 20:09 KRisen 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 这个题目我最初的做法沿用树形DP的做法,设置一个 dp[i][0]表示机器人在i点不回去的最短路径,dp[i][1]表示机器人在i点回去的最短路径,规划方向为i-1向i转移,结果发现这个不能用树形的结构去描述,当前状态不能仅仅靠前一个状态就决定好了,对于后面的点来说,可能当前点走另外一条路会好一些故,最后还是使用了书上的结构,其实也很简单,用d[i],表示收完从1-i所有的垃圾并送回原点的垃圾桶的最优距离,显然,最终结果就是d[n];则,如果某个j点满足 w(j+1,i)#include #include #include using namespace std;int d[100010];i 阅读全文
posted @ 2014-03-02 20:19 KRisen 阅读(447) 评论(0) 推荐(0) 编辑
摘要: 刚看到这个题目不知道怎么个DP法,有点难想到解法如下设置dp[i][j]代表i到j这段子序列能获得的最大值,这样,枚举m=min(m,dp[i+1到j][j],dp[i][i到j-1]),m就代表了给另一个人的,就可求得就只能取到 dp[i][j]-sum(i,j)-m,这样,sum为该段序列总和,只需简单的数列前缀和即可求得sum,这样,只需枚举m值,不断向下进行记忆化搜索,即可求得终结果。#include #include #include using namespace std;int n;int dp[110][110];int vis[110][110];int s[110];int 阅读全文
posted @ 2014-02-27 16:35 KRisen 阅读(145) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 25 下一页