POJ 2750 Potted Flower(线段树+dp)】的更多相关文章

题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就可以求出,断开的情况了. 然后线段树要单点更新,这种标记,以前遇到过,不过一直没有写过,注意总和好更新,整个这一段的结果也很好更新,最难想的就是左边 和右边标记的结果,具体看pushup代码. #include <cstring> #include <cstdio> #include…
题目链接 /* 13904K 532ms 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最小连续子段和 二是两个端点不都取,如a1,a2,a3,那需要记录最大连续子段和 线段树,令maxs[l,r]为[l,r]上最大连续子段和,mins[l,r]同理 在向上更新时,可能是由整个左右节点拼成,也可能是只由左或右更新,也可能两段都有,但不包括最左/右端点 所以还需要记录包括区间左端点的max…
开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并...  给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护:最大区间的值 mmax,最小区间的值 mmin.当然要维护这两个值就需要维护:左端点开始的最大与最小区间的值,右端点开始的最大与最小区间的值.然后是数列的总和,数列的最大值,最小值.然后就是查询时的区间最大值等于整个区间的mmax和区间和sum减去mmin,但是当都是非负数,都是负数时要特判.亏我…
http://poj.org/problem?id=2750 题意:在一个圈中取若干个相邻的数,求他们的最大序列和.不能够同时取所有的数. 看了一篇解题报告写的很详细..http://blog.csdn.net/non_cease/article/details/7437690 #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> ; using nam…
Potted Flower Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3872   Accepted: 1446 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of f…
点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的思想来解决这个问题,你在某个地方将这个环断开,因为线段树无法建成环形的.然后再去找那个最大值.将这个序列分成两部分,先求左边的最大连续和a,再求右边连续和b,但是由于他们中间相连的那部分,就是左部分的最右边的连续最大和x加上右部分的最左边的连续最大和y加起来可能比ab都大,但分开的话可能并没有a或b…
Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of flowers. Each potted flower will be assigned to an integer number (possibly negative) denoting how…
题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~dp[e[i]-1]}+1 注意修改只需要修改右端点,不需要修改一段 所以线段树查询区间最小值即可 */ #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #defin…
题目大意: 在一个序列上每次改动一个值,然后求出它的最大的子序列和. 思路分析: 首先我们不考虑不成环的问题.那就是直接求每一个区间的最大值就好了. 可是此处成环,那么看一下以下例子. 5 1 -2 -3 4 5 那么你会发现 max = sum - min 也就是和减去最小区间和也能够得到. 所以我们最后要得到的就是两个东西.注意题目中说的不能所有取得.所以还要推断一下max 是不是等于 sum的. #include <cstdio> #include <iostream> #i…
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u->v(不含u)路径上的节点分配人数的最优收益. [思路] 树链剖分:构造重链时先访问重儿子,因此一个重链的区间连续,同时一个子树的区间连续. 查询分为两部分:构造在u子树内分配人数i的最大收益ans1[i],以及构造在u->v路径上一个结点分配人数i的最大收益ans2[i].则ans=max{ a…
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1391    Accepted Submission(s): 483 Problem Description The Game “Man Down 100 floors” is an famous and interesting ga…
问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列. 算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列. 动态规划解决过静态的序列最大连续子序列和问题,时间复杂度可以达到 n(环形序列可能复杂度更高).但是这里涉及到动态更新,更新频度很大,如果计算子序列和复杂度仍然是n,就会非常耗时. 如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列:否则,答案是:max{根结点的非空最大子…
题目链接 给出m个区间, 按区间给出的顺序, 求出覆盖$ [1, n] $ 至少需要多少个区间. 如果先给出[10, 20], 在给出[1, 10], 那么相当于[10, 20]这一段没有被覆盖. 令dp[i]表示覆盖[1, i]需要的区间数量. 那么有状态转移方程dp[i] = $ min[dp[i], dp[j] (s_k <= j < t_k)] + 1 $ 然后求 \([s_k, t_k]\) 的最小值可以用线段树来求. 复杂度 $ m\log{n} $ 感觉这个题的难度在于理解题意.…
题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 排序,让所有线段构成左右端点位置都递增的排列 定义$f[i]$表示第$i$条线段,覆盖到第$i$条线段右端点时,需要的最少的线段数 $f[i]=min(f[j]+1)\;(j<i,r[j]>=l[i])$ 朴素是$n^2$转移的 开一棵最小值线段树,记录从$1$覆盖到位置$x$的最少线段数 每次求…
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5084    Accepted Submission(s): 1842 Problem Description Given a circle sequence A[1],A[2],A[3]......A[n]. Circle s…
//Accepted 7552 KB 844 ms //dp[i]=sum(dp[j])+1 j<i && a[j]<a[i] //可以用线段树求所用小于a[i]的dp[j]的和 //需要离散化 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm…
题目链接:http://codeforces.com/contest/474/problem/F 意思是给你两个数n和d,下面给你n座山的高度. 一个人任意选择一座山作为起始点,向右跳,但是只能跳到高度差的绝对值大于等于d的山上. 问跳过的最长路径是什么. 设dp[h[i]]是跳到第i座山的最长路径长度. 那么dp[h[i]] = max( dp[h[j]] ) + 1  ( |h[i]-h[j]| >=d && i>j ) 因为要查询区间最大值,所以考虑用线段树实现. 从左向…
做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/04/13/3018702.html 线段树辅助——扫描线法计算矩形周长并(轮廓线):http://www.cnblogs.com/scau20110726/archive/2013/04/13/3018687.htmlhttp://blog.csdn.net/ophunter/article/det…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3872 题意:有n个龙珠按顺序放在一列,每个龙珠有一个type和一个权值,要求你把这n个龙珠分成k个段,每段的权值是这段中的最大的权值,使得最后的权值之和最小.但是现在有个要求,分的段中,龙珠的type不能和最右边的相等. 容易想到是一个DP:f[i]=Min{f[j]+Min(j,i) | j是满足要求的点}.直接搞的话O(n^2),显然超时了.但是可以发现,这个Min(j,i)是有分段性的,因此我…
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不会出错, 所有的区间都能列出来,只是在查找的时候费点事. 给的矩形相当于在同一水平线上的,也就是y1坐标相当于为0,其他的就和 poj 1151 Atlantis 差不多了. 我写的思路是按照矩形面积并的思路写的: 但是还有另一种方法也是挺简单的,就是把给的矩形按照高从小到大排序,然后依次插入线段树…
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的颜色有几种. 很明显的线段树成段更新,但是查询却不好弄.经过提醒,发现颜色的种类最多不超过30种,所以我们用二进制的思维解决这个问题,颜色1可以用二进制的1表示,同理,颜色2用二进制的10表示,3用100,....假设有一个区间有颜色2和颜色3,那么区间的值为二进制的110(十进制为6).那我们就把…
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容易就确定了,那最后第二个人的位置也可以推(与最后一个人的位置无关)...依次就都可以确定所有的人了. 用前缀和的思想,要是这个人的位置确定了,那么就标记这个人位置的值为0,然后回溯更新,跟求逆序对个数的思想比较类似. 线段树: #include <iostream> #include <cs…
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30995   Accepted: 9285 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of pr…
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 10478   Accepted: 5079 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a lo…
题意:在一个序列中找出最长的某个序列.找出的序列满足题中的条件. 关键:对于 第 i 个位置上的数,要知道与之相隔至少d的位置上的数的大小.可以利用线段树进行统计,查询.更新的时候利用dp的思想. /* 统计某一段内有多少比aim小的数据 在更新的时候利用了dp的思想. */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace…
题意:做蛋糕,给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和. 思路:首先离散化蛋糕体积,以蛋糕数量建树建树,每个节点维护最大值,也就是假如节点i放在最上层情况下的体积最大值dp[i].每次查询比蛋糕i小且最大体积的蛋糕,然后更新线段树.注意此题查询的技巧!!查询区间不变l,r,才能保证每次查到的是小且最大体积. #include<iostream> #include<string> #include<algorithm> #in…
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询时使用线段树的查询 方法并稍加修改即可进行查询区间中最大与最小值的功能. 代码(线段树解法): #include <limits> #include <cstdio> #include <iostream> using namespace std; ; + ; struct…
Special Subsequence Time Limit: 5 Seconds      Memory Limit: 32768 KB There a sequence S with n integers , and A is a special subsequence that satisfies |Ai-Ai-1| <= d ( 0 <i<=|A|)) Now your task is to find the longest special subsequence of a ce…
参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后缀 然后更新其影响的字符串的方法,即区间更新,维护最大值,用线段树优化. 而其可以影响的字符串为其在fail树中的子树节点 此题一直MLE,调了一下午+晚上.最后发现. (1)ac自动机中的节点开始直接初始化,应动态初始化(也终于理解了许多人那么做) (2)还有用vector表示树边时,一开始初始c…
题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查询区间[a,b]有多少种不同颜色 解题思路:  很明显的线段树的区间插入和区间查询,但是如何统计有多少不同的颜色呢? 如果每个结点数组来存储颜色的种类,空间复杂度很高,而且查询很慢 颜色最多只有30种,可以用位运算中的“按位或|” 颜色也用二进制来处理,和存储: 第一种颜色的二进制表示1 第二种颜色…