[BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity 树状数组优化dp
这个dp乍看不科学,仔细一看更不科学,所以作为一个执着BOY,我决定要造数据卡死波兰人民,但是我造着造着就......证出来了.........
这个就是把 < > =分开讨论每次找到f[i] 即以i为结尾的最长长度,然后一顿转移,那么我们发现如果只是讨论 符号那么由于符号顺序影响 我们的得到的是一个有后效性的dp 就是说我们这个时候找到最优解可能会影响最优解的得到,那么这个dp的正确性是怎样的呢?
首先我们假设我们找到了一个不是全部从最优转移点转移来的最优序列那么:I.最后一个点一定是从最优转移点转移过来 II. 倒数第二个点,如果不是最优转移点的结果,那么他可以把最后一个点顶掉,并且把自己换成最优转移点 (由于我们一直没有改变最优解,所以我们重复I II 就得到了一个最后两位都是最优解的最优序列) III. 然后我们看中间的点,我们总可以得到一个其之后的点都是由最优转移点转移而来的,那么我们可以把他换成最优转移er,那么得到了一个比原来肿了一点的新序列(我们先留着后面的点),那么现在我们的一串点他们之间都有符号,且他们都满足符号,只是现在不满足那个 s数组的顺序,那么我们发现在这次被操作的那个点的左右一段区间的符号是一样的,那么我们只要在这一段区间内删除掉连续的一段大小为新增长度的序列就可以了,我们从中间一个一个的删,删掉就补到中间来这样连续操作就可以了, 如果 中间那个数两边存在 = 就可以随意删,如果两边符号相同即 < < 或 > > 那么中间的店一定可以删掉 如果是 a<b>c 或 a>b<c 那么删掉b再按照a c 大小删掉左右的某个符号就好了,如果是a c相等那么就任意留一个a或c,那么如果我们现在只能删一个怎么办?如果只剩一个的话那么这个东西就是这段区间里唯一的旮沓了,那么他左右两边的符号一定相等(小证明:我们由于采取两边向中间沦陷的策略所以我们剩的点一定是要删除的区间两个边缘点之一,那么我们考虑这个区间,他一定正好覆盖两个轮回中间的一个轮回,那么边缘之一一定和另一个边缘的左出头一样)
我们重复以上操作可以把这个最优解转化为全部由最优转移点转移而来的最优解,因此要是没有一个不是全部从最优转移点转移来的最优序列那么我们的dp一定是对的如果有那么我们一定有全部由最优转移点转移而来的最优解,因此我们的dp一定可以找到最优解
这个故事告诉我们考场证dp是一个正确的选择.......
#include <cstdio>
#include <cstring>
#include <iostream>
#define Inf 1000000
#define MAXN 500000
#define r register
using namespace std;
int L[Inf+],B[Inf+];
inline int read()
{
r int sum=;
r char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
inline void read(int &x)
{
r char ch=getchar();
while(ch!='='&&ch!='<'&&ch!='>')ch=getchar();
x=ch;
}
inline void ins_L(int x,int key){
while(x<=Inf) L[x]=key>L[x]?key:L[x],x+=x&(-x);
}
inline void ins_B(int x,int key){
while(x<=Inf) B[x]=key>B[x]?key:B[x],x+=x&(-x);
}
inline int get_B(int x){
r int ans=;
while(x>) ans=B[x]>ans?B[x]:ans,x-=x&(-x);
return ans;
}
inline int get_L(int x){
r int ans=;
while(x>) ans=L[x]>ans?L[x]:ans,x-=x&(-x);
return ans;
}
int n,k,a[MAXN+],J[Inf+];
Init s[MAXN+];
inline void Init()
{
n=read(),k=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=k;i++)read(s[i]);
}
inline int Max(int x,int y)
{
return x>y?x:y;
}
inline void work()
{
r int Ans=;
for(int i=;i<=n;i++)
{
r int ans=;
ans=get_B(Inf-a[i]);
ans=Max(ans,get_L(a[i]-));
ans=J[a[i]]>ans?J[a[i]]:ans;
ans+=;
Ans=ans>Ans?ans:Ans;
r int pos=(ans-)%k+;
if(s[pos]=='<')ins_L(a[i],ans);
else if(s[pos]=='>')ins_B(Inf+-a[i],ans);
else J[a[i]]=J[a[i]]>ans?J[a[i]]:ans;
}
printf("%d",Ans);
}
int main()
{
Init();
work();
return ;
}
[BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity 树状数组优化dp的更多相关文章
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
- Codeforces 946G Almost Increasing Array (树状数组优化DP)
题目链接 Educational Codeforces Round 39 Problem G 题意 给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...
- LUOGU P2344 奶牛抗议 (树状数组优化dp)
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
[题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...
- Codeforces 909C Python Indentation:树状数组优化dp
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
- BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
- 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp
显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...
随机推荐
- 查看ubuntu版本号命令
1.uname -a 查看内核版本号 2.cat /etc/issue 查看ubuntu版本号 3.sudo lsb_release -a 查看ubuntu版本号
- 以源码安装的lamp环境为依托,源码安装zabbix监控系统
1.源码安装lamp环境 1)安装httpd, 以源码httpd-2.4.33为基础,解压后,执行./configure --prefix=/usr/local/ --sysconfdir=/etc/ ...
- 深入了解jQuery Mobile-1
介绍 jQuery Mobile是一种触控优化的HTML5 UI框架,旨在制作可在所有智能手机,平板电脑和台式机设备上访问的响应式网站和应用程序 移动页面结构 jQuery Mobile站点必须以HT ...
- R语言学习笔记(十三):零碎知识点(36-40)
36--diag() 如果它的参数是一个矩阵,它返回的是一个向量 如果它的参数是一个向量,它返回的是一个向量 如果它的参数是一个标量,它返回的是指定大小的单位矩阵 > diag(2) [,1] ...
- 前端面试题目汇总摘录(JS 基础篇 —— 2018.11.02更新)
温故而知新,保持空杯心态 JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string type ...
- P1332 血色先锋队
P1332 血色先锋队 题目描述 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...
- Python 套接字的使用 (1)
获取设备名称和IPv4地址 socket.gethostname() socket.gethostbyname(host_name) def print_machine_info(): host_ ...
- 不得不服!Python速度虽然慢,但是它工作效率很高!
写在前面 让我们来讨论一个我最近一直在思考的问题:Python 的性能.顺便说一下,我是 Python 的忠实拥趸,我在各种情况下都会积极尝试使用 Python 来解决问题.大家对 Python 最大 ...
- 在Code::Blocks中编译和使用wxWidgets3.0.0教程
跳转至:指南,搜索 注意,编译Code :: Blocks的对wxWidgets的3.0.0链接不是很稳定,但该库至少可以被正确编译,(只是使用的时候可能会有问题):CodeBlocks开发商都在 ...
- BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3925 题意概述: 给出一张N点M边的最小生成树,其中每条边的长度为[0,1]的实数,求最小 ...