
2016专题训练2(线段树、树状数组、DP)
文章平均质量分 65
金金金金鑫
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
HDU 3333 Turing Tree
题意: 有n个数,q个询问,每次给出一个区间范围l,r,问你区间内所有不重复的数的和是多少。 思路: 线段树+离线处理,单点更新,区间查询。先把所有问题的区间记录在结构体中,然后按r从小到大排,r一样的按l从小到大排。然后枚举每个区间,将数一个一个加入,如果之前该数出现过了,那么把该的位置“挪”到现在的位置(即将原来位置的数置为0,更新该数的位置)。枚举完后进行区间查询得到答案。 #inc原创 2016-07-19 19:18:44 · 190 阅读 · 0 评论 -
POJ 1088 滑雪
题意: 给出n*n个数,表示高度,每次能从高往低处划,起点可以任意选,问你如何划才能划的道路最长。 思路: 记忆化搜索。枚举起点开始深搜索,用dp[i][j]记录从点(i,j)开始的最长道路长度。 #include #include const int MAX=105; int dir[][2]={1,0,-1,0,0,1,0,-1}; int h[MAX][MAX]; int dp[M原创 2016-07-19 20:02:42 · 200 阅读 · 0 评论 -
POJ 1163 The Triangle
题意: 给出一个三角形的数堆,问从顶走到底所能获得的最大价值是多少。 思路: DP。从底开始dp,dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j]。 #include #include #include using namespace std; const int MAX=105; int n; int a[MAX][MAX]; int dp[M原创 2016-07-19 19:59:51 · 191 阅读 · 0 评论 -
HDU 2546 饭卡
题意: 有n种菜,每种只能买一次,卡里剩大于5块的钱可以任意购买大于卡里的钱的菜,问如何购买菜才能使卡里余额最小,可以为负数。 思路: DP+贪心。先用贪心的思想就是最后剩5块一定拿去买最贵的菜。然后其他的钱m-5拿去跑01背包。 这里dp[j]表示卡里剩j块钱可以买的最大价值。 #include #include #include using namespace std; const原创 2016-07-19 19:52:22 · 203 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence
题意: 给你n个数,要你求其严格最长上升子序列。 思路: 用nlogn的方法,即枚举+二分。 #include #include using namespace std; const int INF=0x3f3f3f3f; const int MAX=1005; int a[MAX],g[MAX]; int n; int main(){ scanf("%d",&n); for(in原创 2016-07-19 19:51:46 · 183 阅读 · 0 评论 -
POJ 3264 Balanced Lineup
题意: 给你n个数,问你某一段区间中最大值和最小值的差是多少。 思路: 线段树,区间查询。建两棵树,一个最大值的树,一个最小值的树,然后每次logn的时间查询出最大值和最小值相减即可。 #include #include using namespace std; const int INF=0x3f3f3f3f; const int MAX=50005; int Max[MAX<<2],原创 2016-07-19 19:48:52 · 218 阅读 · 0 评论 -
HDU 1166 敌兵布阵
题意: 原意是有n个阵地,每次可以向某个阵地加、减人,还能问你l~r阵地的士兵总人数。 思路: 线段树,单点更新,区间求和。 #include #include const int MAX=50005; int sum[MAX<<2]; void PushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void Build(int l,原创 2016-07-19 19:44:09 · 224 阅读 · 0 评论 -
POJ 1014 Dividing
题意: 有1~6种价值为1~6的大理石,现给出每种大理石的个数,在不能切割大理石的情况下是否能按价值平分这些大理石给两个人。 思路: 记忆化搜索。先把所有的大理石的价值都加起来,如果是奇数,肯定不能平分。如果是偶数,那么从价值最大的开始搜索,搜过不行的状态就不用再搜。 #include bool flag; int num[10],sum; void DFS(int now,int v原创 2016-07-19 19:37:29 · 237 阅读 · 0 评论 -
HDU 3555 Bomb
题意: 要求1~n的所以数中含49的数得个数。 思路: 数位DP。 用dp[i][0]表示长度为i且不含49的个数。 用dp[i][1]表示长度为i且不含49但最高位为9的个数(注意:上面那个是包含这个的)。 用dp[i][2]表示长度为i且含49的个数。 转移方程为: dp[i][0]=10*dp[i-1][0]-dp[i-1][1]; dp[i][1]=dp[i-1][0原创 2016-07-19 19:36:18 · 177 阅读 · 0 评论 -
Codeforces 85D Sum of Medians
题意: 有n个操作,add x表示向集合添加元素x,del x表示删除集合中的x元素,sum表示求集合所有下标i%5==3的元素之和,注意里的元素都是有序且无重复的。 思路: 线段树。为每个节点存储两种信息,一种为当树向上更新时右区间需要平移的个数mov,另一种为ans[i]表示该区间内所有下标%5==i的元素的和。然后树的向上更新操作就为 sum[rt].mov=(sum[rt for原创 2016-07-19 19:03:31 · 281 阅读 · 0 评论 -
UVALive 6937 The Imp
题意: 给出N(15W)个物品,每个物品有、两个值, 对方能释放k(变为0,求在双方均使用最优策略的情况下,我方能得到一件有价值的物品,使得最大。 也可以不买任何东西。 思路: 对于对方来说,必然是释放所有魔法,这样使得我方损失最大。 对于我方来说,假设购买的物品为,那么价值是递增的(因为总花费一样,价值大的放后面显然更优)。 将物品按value值排序原创 2016-07-20 10:35:05 · 333 阅读 · 0 评论