思路

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

可以到我这里做luogu

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

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

留坑待补

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int maxn = 1e5 + 7;
int n, l, T, cnt,a[maxn];
ll f[maxn];
int read()
{
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
struct node {
int l, r;
ll ma,flag;
} e[maxn << 2];
void pushup(int rt) {
e[rt].ma = max(e[ls].ma, e[rs].ma);
}
void build(int l, int r, int rt) {
e[rt].l = l, e[rt].r = r;
if (l == r) {
e[rt].ma = -1LL;
e[rt].flag=0;
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
pushup(rt);
}
void modfity(int L, ll k, int rt) {
if (e[rt].l == e[rt].r) {
if (e[rt].ma == k) e[rt].flag++;
else if (e[rt].ma < k) {
e[rt].ma = k;
e[rt].flag = 0ll;
}
return;
}
int mid = (e[rt].l + e[rt].r) >> 1;
if (L <= mid) modfity(L, k, ls);
else modfity(L, k, rs);
pushup(rt);
}
void delet(int L, ll k, int rt) {
if (e[rt].l == e[rt].r) {
if (k == e[rt].ma) {
if (e[rt].flag >= 1) e[rt].flag--;
else e[rt].ma = -1;
}
return;
}
int mid = (e[rt].l + e[rt].r) >> 1;
if (L <= mid) delet(L, k, ls);
else delet(L, k, rs);
pushup(rt);
}
ll query(int L, int R, int rt) {
if (L <= e[rt].l && e[rt].r <= R) {
return e[rt].ma;
}
int mid = (e[rt].l + e[rt].r) >> 1;
ll ans = -1LL;
if (L <= mid) ans = max(ans, query(L, R, ls));
if (R > mid) ans = max(ans, query(L, R, rs));
return ans;
}
int main() {
T=read();
for (; T--;) {
n=read(),l=read();
memset(f, -1, sizeof(f));
for (int i = 1; i <= n; ++i) {
a[i]=read();
}
build(1, 1e5, 1);
for (int i = 1; i <= n; ++i) {
if ((i - l) > 1) {
delet(a[i - l - 1] + 1, f[i - l - 1] - a[i - l - 1], 1);
}
if (a[i] == 1) {
if (i > l) {
f[i] = -1LL;
continue;
} else f[i] = (ll)a[i] * a[i];
} else {
ll tmp = query(1, a[i], 1);
if (tmp == -1LL) {
if (i > l) {
f[i] = -1LL;
continue;
} else
f[i] = a[i] * a[i];
} else {
f[i] = (ll)a[i] * a[i] + tmp;
}
}
modfity(a[i] + 1, f[i] - a[i], 1);
}
if (f[n] == -1) printf("Case #%d: No solution\n", ++cnt);
else printf("Case #%d: %lld\n", ++cnt, f[n]);
}
return 0;
}
/*
区间大小一定
求给点区间大小的小于a[i]的max
按照a[i]的权值建一颗线段树求max
区间类似于queue,删点 即可
可是删点会有几率GG掉,记录size也会GG掉
*/

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. Vue源码学习1——Vue构造函数

    Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只 ...

  2. 2018/03/16 echo、print_r、print、var_dump之间的区别

    还是先说下我对这个方法的理解 print_r()用于 cli模式下的输出调试,error_log() 调试 var_dump() 用于页面的显示调试 echo() 用处比较多,__toString() ...

  3. (3.11)mysql基础深入——mysql文件分类与配置文件管理

    (3.11)mysql基础深入——mysql文件分类与管理 关键词:mysql配置文件,mysql参数文件,mysql中的my.cnf 目录:mysql数据库文件分类: [1]参数文件:my.cnf ...

  4. ssh stricthostkeychecking=0

    SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击. 但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. ...

  5. 了解Linux的进程与线程

    了解Linux的进程与线程 http://timyang.net/linux/linux-process/ 上周碰到部署在真实服务器上某个应用CPU占用过高的问题,虽然经过tuning, 问题貌似已经 ...

  6. android 代码edittext删除或者替换光标处的字串

    https://stackoverflow.com/questions/3609174/android-insert-text-into-edittext-at-current-position Cp ...

  7. POJ3169:Layout(差分约束)

    http://poj.org/problem?id=3169 题意: 一堆牛在一条直线上按编号站队,在同一位置可以有多头牛并列站在一起,但编号小的牛所占的位置不能超过编号大的牛所占的位置,这里用d[i ...

  8. unity3d-准备工作

    1.软件下载 想进行unity3d游戏开发,首先unity3d官网下载软件:unity3d下载 2.运行游戏界面 3.安装Visual Studio Tools for Unity unity3d自带 ...

  9. unp第七章补充之TCP半开连接与半闭连接

    半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全&q ...

  10. sql server 视图的操作

    -- 判断要创建的视图名是否存在if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJ ...