补写一下

poj3171 设f[i]表示覆盖L~i的最小花费,把区间按左端点排序,枚举区间,f[a[i].r]=min{f[a[i].l~(a[top].r-1)]}+a[i].c (当然还要和原值比较的)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node{int l,r,d;}a[];
bool cmp(node n1,node n2){return n1.r<n2.r;} struct trnode
{
int l,r,lc,rc,c;
}tr[];int trlen;
void bt(int l,int r)
{
int now=++trlen;
tr[now].l=l;tr[now].r=r;tr[now].c=(<<);
tr[now].lc=tr[now].rc=-;
if(l<r)
{
int mid=(l+r)/;
tr[now].lc=trlen+;bt(l,mid);
tr[now].rc=trlen+;bt(mid+,r);
}
}
void change(int now,int p,int k)
{
if(tr[now].l==tr[now].r){tr[now].c=k;return ;} int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/;
if(p<=mid)change(lc,p,k);
else change(rc,p,k); tr[now].c=min(tr[lc].c,tr[rc].c);
}
int getmin(int now,int l,int r)
{
if(tr[now].l==l&&tr[now].r==r)return tr[now].c; int lc=tr[now].lc,rc=tr[now].rc;
int mid=(tr[now].l+tr[now].r)/; if(r<=mid) return getmin(lc,l,r);
else if(mid+<=l)return getmin(rc,l,r);
else return min(getmin(lc,l,mid),getmin(rc,mid+,r));
} int f[];
int main()
{
int n,L,R;
scanf("%d%d%d",&n,&L,&R);L++,R++;
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].d);
a[i].l++,a[i].r++;
if(a[i].r<L||R<a[i].l)i--,n--;
if(a[i].l<L)a[i].l=L;
if(R<a[i].r)a[i].r=R;
}
sort(a+,a+n+,cmp); int top=; trlen=,bt(L,R);
memset(f,,sizeof(f));
for(int i=L;i<=R;i++)
{
while(top<=n&&a[top].r==i)
{
if(a[top].l==L)
{
if(a[top].d<f[i])
f[i]=a[top].d, change(,i,f[i]);
}
else
{
int k=getmin(,a[top].l-,a[top].r-)+a[top].d;
if(k<f[i])
f[i]=k, change(,i,f[i]);
}
top++;
}
}
if(f[R]==f[])printf("-1\n");
else printf("%d\n",f[R]);
return ;
}

poj3171

hdu5542 f[i][j]表示枚举到第几个位置,长度为j的严格上升序列有多少(注意一定包括第i个位置)

f[i][j]=∑(k<j&&a[k]<a[j])f[k][j-1] 这里先离散化,然后开m个树状数组记录,想想cdq分治,时间维有序第一个限制不管,第二个用树状数组解决。实际操作中,是不用定义数组的,直接插入树状数组中相应位置即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int mod=1e9+; int lslen;int s[][];
int lowbit(int x){return x&-x;}
void change(int x,int w,int k)
{
while(x<=lslen)
{
s[w][x]=(s[w][x]+k)%mod;
x+=lowbit(x);
}
}
int getsum(int x,int w)
{
int ret=;
while(x>)
{
ret=(ret+s[w][x])%mod;
x-=lowbit(x);
}
return ret;
} //----------------bit--------------------- int a[],ls[];
int main()
{
int T,T_T=;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
lslen=;
for(int i=;i<=n;i++)
scanf("%d",&a[i]), ls[++lslen]=a[i];
sort(ls+,ls+lslen+);
lslen=unique(ls+,ls+lslen+)-ls-;
for(int i=;i<=n;i++)
a[i]=lower_bound(ls+,ls+lslen+,a[i])-ls; memset(s,,sizeof(s));
for(int i=;i<=n;i++)
{
change(a[i],,);
int li=min(i,m);
for(int j=;j<=li;j++)
change(a[i],j,getsum(a[i]-,j-));
} printf("Case #%d: %d\n",++T_T,getsum(lslen,m));
}
return ;
}

hdu5542

0x58 数据结构优化DP的更多相关文章

  1. 数据结构优化dp

    本以为自己的dp已经成熟了没想到在优化上面还是欠佳 或者是思路方面优化dp还不太行. 赤壁之战 当然 很有意思的题目描述 大体上是苦肉计吧 .盖黄 ... 题意是 求出长度为m的严格上升子序列的个数 ...

  2. HAOI2008 木棍分割 数据结构优化dp+二分答案

    很久之前打的题,现在补篇博客 打滚动数组 #E. 木棍分割 Accepted 100 1712 ms 1512 KiB   2019-05-07 17:01:23 Short 不打滚动数组 #419. ...

  3. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  4. The Battle of Chibi(数据结构优化dp,树状数组)

    The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...

  5. Alternating Strings Gym - 100712D 简单dp && Alternating Strings II Gym - 100712L 数据结构优化dp

    比赛链接:https://vjudge.net/contest/405905#problem/D 题意: 给你一个长度为n的由0或1构成的串s,你需要切割这个串,要求切割之后的每一个子串长度要小于等于 ...

  6. $Poj2376\ Poj3171\ Luogu4644\ Cleaning\ Shifts$ 数据结构优化$DP$

    $Poj$    $AcWing$    $Luogu$ $ps:$洛谷题目与$Poj$略有不同,以下$Description$是$Poj$版.题目的不同之处在于洛谷中雇用奶牛的费用不相同,所以不可以 ...

  7. $HDOJ5542\ The\ Battle\ of\ Chibi$ 数据结构优化$DP$

    $AcWing$ $Description$ $Sol$ 首先显然是是以严格递增子序列的长度为阶段,由于要单调递增,所以还要记录最后一位的数值 $F[i][j]$表示前$i$个数中以$A_i$结尾的长 ...

  8. 洛谷P4644 [USACO2005 Dec]Cleaning Shifts 清理牛棚 [DP,数据结构优化]

    题目传送门 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness ...

  9. bzoj1233 单调队列优化dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1233 数据结构优化dp的代码总是那么抽象 题意:奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Be ...

随机推荐

  1. # --with-http_sub_module模块

    作用: http内容替换 语法 第一种语法: sub_filter string:要替换的内容 替换后的内容 这个模块只能替换第一个匹配的字符串,如果需要匹配全部替换,则用到下面的第三种语法配置 第二 ...

  2. MatLab之HDL coder

    1 Workflow The workflow for applying HDL code generation to the hardware design process requires the ...

  3. Boost-QT兼容问题:#define FUSION_HASH #

    使用原始的MSVC10+QT48很长时间,需要把PCL升级到新的版本,不再使用自行编译的PCL1.7.2版本. 在使用MSVC2012的时候,使用MSVC12-的PCL1.8.0版本,出现了一个不大不 ...

  4. Math工具类的使用

    1.包:java.lang  不需要导包 2.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 特点: 该类中的方法都是静态方法,所以可以直接使用类名.方法名(实参)调 ...

  5. js俄罗斯方块

    <html> <style>.c {margin :1px;width:19px;height:19px;background:red;position:absolute;} ...

  6. revit二次开发之族的类型参数与实例参数的转换

    1背景小伙伴在做revit二次开发的时候,可能需要在族环境中将族的类型参数与实例参数相互转换. 2思路1.使用族管理器FamilyManager,参见注释12.首先获取需要转换的参数(单个与批量),参 ...

  7. 网络安全web部分

    Web安全 一.    SQL注入 1)    原理 通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序 ...

  8. bit ( 比特 )和 Byte(字节)的关系

    一.存储单位的bit 和 Byte1.bit(比特)bit也就是我们不一定听说过的比特,大名鼎鼎的比特币就是以此命名的.它的简写为小写字母 “b” .作为信息技术的最基本存储单元,因为比特实在太小了, ...

  9. jQuery升级踩坑之路

    1.使用了被废弃的jQuery.browser属性 jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更 ...

  10. C#学习笔记_03_运算符

    03_运算符 算数运算符 + - * / % ++ -- 赋值运算符 = += -= *= /= %= 关系运算符 > < >= <= == != 逻辑运算符 &:逻辑 ...