思路

好久之前的了,忘记什么题目了

可以到我这里做luogu

反正就是hdu数据太水,导致自己造的数据都过不去,而hdu却A了

好像是维护了最大值和次大值,然后出错的几率就小了很多也许是自己写错了,忘记了

留坑待补

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define ll long long
  7. #define ls rt<<1
  8. #define rs rt<<1|1
  9. using namespace std;
  10. const int maxn = 1e5 + 7;
  11. int n, l, T, cnt,a[maxn];
  12. ll f[maxn];
  13. int read()
  14. {
  15. int x=0,f=1;char s=getchar();
  16. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  17. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  18. return x*f;
  19. }
  20. struct node {
  21. int l, r;
  22. ll ma,flag;
  23. } e[maxn << 2];
  24. void pushup(int rt) {
  25. e[rt].ma = max(e[ls].ma, e[rs].ma);
  26. }
  27. void build(int l, int r, int rt) {
  28. e[rt].l = l, e[rt].r = r;
  29. if (l == r) {
  30. e[rt].ma = -1LL;
  31. e[rt].flag=0;
  32. return;
  33. }
  34. int mid = (l + r) >> 1;
  35. build(l, mid, ls);
  36. build(mid + 1, r, rs);
  37. pushup(rt);
  38. }
  39. void modfity(int L, ll k, int rt) {
  40. if (e[rt].l == e[rt].r) {
  41. if (e[rt].ma == k) e[rt].flag++;
  42. else if (e[rt].ma < k) {
  43. e[rt].ma = k;
  44. e[rt].flag = 0ll;
  45. }
  46. return;
  47. }
  48. int mid = (e[rt].l + e[rt].r) >> 1;
  49. if (L <= mid) modfity(L, k, ls);
  50. else modfity(L, k, rs);
  51. pushup(rt);
  52. }
  53. void delet(int L, ll k, int rt) {
  54. if (e[rt].l == e[rt].r) {
  55. if (k == e[rt].ma) {
  56. if (e[rt].flag >= 1) e[rt].flag--;
  57. else e[rt].ma = -1;
  58. }
  59. return;
  60. }
  61. int mid = (e[rt].l + e[rt].r) >> 1;
  62. if (L <= mid) delet(L, k, ls);
  63. else delet(L, k, rs);
  64. pushup(rt);
  65. }
  66. ll query(int L, int R, int rt) {
  67. if (L <= e[rt].l && e[rt].r <= R) {
  68. return e[rt].ma;
  69. }
  70. int mid = (e[rt].l + e[rt].r) >> 1;
  71. ll ans = -1LL;
  72. if (L <= mid) ans = max(ans, query(L, R, ls));
  73. if (R > mid) ans = max(ans, query(L, R, rs));
  74. return ans;
  75. }
  76. int main() {
  77. T=read();
  78. for (; T--;) {
  79. n=read(),l=read();
  80. memset(f, -1, sizeof(f));
  81. for (int i = 1; i <= n; ++i) {
  82. a[i]=read();
  83. }
  84. build(1, 1e5, 1);
  85. for (int i = 1; i <= n; ++i) {
  86. if ((i - l) > 1) {
  87. delet(a[i - l - 1] + 1, f[i - l - 1] - a[i - l - 1], 1);
  88. }
  89. if (a[i] == 1) {
  90. if (i > l) {
  91. f[i] = -1LL;
  92. continue;
  93. } else f[i] = (ll)a[i] * a[i];
  94. } else {
  95. ll tmp = query(1, a[i], 1);
  96. if (tmp == -1LL) {
  97. if (i > l) {
  98. f[i] = -1LL;
  99. continue;
  100. } else
  101. f[i] = a[i] * a[i];
  102. } else {
  103. f[i] = (ll)a[i] * a[i] + tmp;
  104. }
  105. }
  106. modfity(a[i] + 1, f[i] - a[i], 1);
  107. }
  108. if (f[n] == -1) printf("Case #%d: No solution\n", ++cnt);
  109. else printf("Case #%d: %lld\n", ++cnt, f[n]);
  110. }
  111. return 0;
  112. }
  113. /*
  114. 区间大小一定
  115. 求给点区间大小的小于a[i]的max
  116. 按照a[i]的权值建一颗线段树求max
  117. 区间类似于queue,删点 即可
  118. 可是删点会有几率GG掉,记录size也会GG掉
  119. */

hdu4719 Oh My Holy FFF 线段树优化dp的更多相关文章

  1. hdu4719 Oh My Holy FFF 线段树维护dp

    题意:给你一个长度为n的数组v,你需要把这个数组分成很多段,你需要保证每一段的长度不能超过k我们设一共有m段,每一段右边界那个数为bi那么我们要使得sum(bi*bi-b(i-1))最大 (1< ...

  2. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  3. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  4. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  5. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  6. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  7. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  8. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  9. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

随机推荐

  1. pro 图层 叹号

    同事遇到问题,后来他自己探索解决了~~大致记录如下 pro1.4中打开mxd,部分图层前显示叹号.根据arcmap的经验,点击叹号去修复,结果显示 不支持类型数据. 后解决办法:新建pro 的proj ...

  2. ls 列出文件目录(可以含子目录)及文件的完整路径

    1.列出当前目录的文件.文件夹完整路径    ls -1 |awk '{print i$0}' i=`pwd`'/' 2.列出当前目录及子目录的文件.文件夹完整路径    ls -R |awk '{p ...

  3. 格式化NameNode

    $cd /app/hadoop/hadoop-2.2.0/ $./bin/hdfs namenode -format

  4. linux中vim常用命令

    vim工作模式 vi 文件名 进入命令模式 i a o 进入插入模式 ESC键 回到命令模式 : 进入编辑模式 添加行号 :set number/nu :wq 保存退出 插入命令 a 在光标所在字符后 ...

  5. union 类型(即sum types)在golang语言中的实现

    http://www.jerf.org/iri/post/2917 Sum Types in Go posted Jun 02, 2013 in Programming, Golang, Haskel ...

  6. Scala系统学习(一):Scala概述

    Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...

  7. [django实践]投票app

    code: https://github.com/lannyMa/toupiao polls app介绍 这个例子来源于django官网,恰好2.x版本有中文版. https://docs.djang ...

  8. Solr安装中文分词器IK

    安装环境 jdk1.7 solr-4.10.3.tgz KAnalyzer2012FF_u1.jar tomcat7 VM虚拟机redhat6.5-x64:192.168.1.201 Xshell4 ...

  9. pandas练习(一)------ 了解数据

    探索Chipotle快餐数据 (相关数据见github) 步骤1 导入pandas库 import pandas as pd 步骤2 导入数据集 path1 = "./data/chipot ...

  10. leetcode_目录

    3Sum Closest 3Sum 4Sum Add Binary Add Two Numbers Anagrams Balanced Binary Tree Best Time to Buy and ...