[补档][Poi2010]Monotonicity 2
[Poi2010]Monotonicity 2
题目
给出N个正整数a[1..N],再给出K个关系符号(>、<或=)s[1..k]。选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]。求出L的最大值。INPUT
第一行两个正整数,分别表示N和K (N, K <= 500,000)。第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^6)。第三行给出K个空格隔开关系符号(>、<或=),第i个表示s[i]。OUTPUT
一个正整数,表示L的最大值。SAMPLE
INPUT
7 32 4 3 1 3 5 3< > =OUTPUT
6
解题报告
- for(int i=;i<=n;i++){
- f[i]=;
- for(int j=;j<=i-;j++){
- int tmp(f[j]%k+);
- if(op[tmp]=='='&&a[j]==a[i]&&f[j]+>f[i])
- f[i]=f[j]+;
- if(op[tmp]=='>'&&a[j]>a[i]&&f[j]+>f[i])
- f[i]=f[j]+;
- if(op[tmp]=='<'&&a[j]<a[i]&&f[j]+>f[i])
- f[i]=f[j]+;
- }
- }
权值线段树
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- inline int read(){
- int sum();
- char ch(getchar());
- for(;ch<''||ch>'';ch=getchar());
- for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
- return sum;
- }
- inline char init(){
- char ch(getchar());
- for(;ch!='='&&ch!='>'&&ch!='<';ch=getchar());
- return ch;
- }
- inline int my_max(int a,int b){
- return a>b?a:b;
- }
- int n,k;
- int a[],op[];
- int tr_d[],tr_x[],tr_e[];
- int ad_d[],ad_x[],ad_e[];
- inline void pushup_d(int i){
- tr_d[i]=my_max(tr_d[i<<],tr_d[i<<|]);
- }
- inline void pushup_x(int i){
- tr_x[i]=my_max(tr_x[i<<],tr_x[i<<|]);
- }
- inline void pushup_e(int i){
- tr_e[i]=my_max(tr_e[i<<],tr_e[i<<|]);
- }
- inline void pushdown_d(int i){
- if(ad_d[i]){
- ad_d[i<<]=ad_d[i];
- ad_d[i<<|]=ad_d[i];
- tr_d[i<<]=ad_d[i];
- tr_d[i<<|]=ad_d[i];
- tr_d[i]=ad_d[i];
- ad_d[i]=;
- }
- }
- inline void pushdown_x(int i){
- if(ad_x[i]){
- ad_x[i<<]=ad_x[i];
- ad_x[i<<|]=ad_x[i];
- tr_x[i<<]=ad_x[i];
- tr_x[i<<|]=ad_x[i];
- tr_x[i]=ad_x[i];
- ad_x[i]=;
- }
- }
- inline void pushdown_e(int i){
- if(ad_e[i]){
- ad_e[i<<]=ad_e[i];
- ad_e[i<<|]=ad_e[i];
- tr_e[i<<]=ad_e[i];
- tr_e[i<<|]=ad_e[i];
- tr_e[i]=ad_e[i];
- ad_e[i]=;
- }
- }
- inline void update_d(int ll,int rr,int c,int l,int r,int i){
- if(ll<=l&&r<=rr){
- ad_d[i]=c;
- tr_d[i]=c;
- return;
- }
- pushdown_d(i);
- int mid((l+r)>>);
- if(ll<=mid)
- update_d(ll,rr,c,l,mid,i<<);
- if(rr>mid)
- update_d(ll,rr,c,mid+,r,i<<|);
- pushup_d(i);
- }
- inline void update_x(int ll,int rr,int c,int l,int r,int i){
- if(ll<=l&&r<=rr){
- ad_x[i]=c;
- tr_x[i]=c;
- return;
- }
- pushdown_x(i);
- int mid((l+r)>>);
- if(ll<=mid)
- update_x(ll,rr,c,l,mid,i<<);
- if(rr>mid)
- update_x(ll,rr,c,mid+,r,i<<|);
- pushup_x(i);
- }
- inline void update_e(int ll,int rr,int c,int l,int r,int i){
- if(ll<=l&&r<=rr){
- ad_e[i]=c;
- tr_e[i]=c;
- return;
- }
- pushdown_e(i);
- int mid((l+r)>>);
- if(ll<=mid)
- update_e(ll,rr,c,l,mid,i<<);
- if(rr>mid)
- update_e(ll,rr,c,mid+,r,i<<|);
- pushup_e(i);
- }
- inline int query_d(int ll,int rr,int l,int r,int i){
- if(ll>rr)
- return ;
- if(ll<=l&&r<=rr)
- return tr_d[i];
- pushdown_d(i);
- int mid((l+r)>>);
- int ret();
- if(ll<=mid)
- ret=my_max(ret,query_d(ll,rr,l,mid,i<<));
- if(rr>mid)
- ret=my_max(ret,query_d(ll,rr,mid+,r,i<<|));
- return ret;
- }
- inline int query_x(int ll,int rr,int l,int r,int i){
- if(ll>rr)
- return ;
- if(ll<=l&&r<=rr)
- return tr_x[i];
- pushdown_x(i);
- int mid((l+r)>>);
- int ret();
- if(ll<=mid)
- ret=my_max(ret,query_x(ll,rr,l,mid,i<<));
- if(rr>mid)
- ret=my_max(ret,query_x(ll,rr,mid+,r,i<<|));
- return ret;
- }
- inline int query_e(int ll,int rr,int l,int r,int i){
- if(ll>rr)
- return ;
- if(ll<=l&&r<=rr)
- return tr_e[i];
- pushdown_e(i);
- int mid((l+r)>>);
- int ret();
- if(ll<=mid)
- ret=my_max(ret,query_e(ll,rr,l,mid,i<<));
- if(rr>mid)
- ret=my_max(ret,query_e(ll,rr,mid+,r,i<<|));
- return ret;
- }
- int f[];
- int mx();
- int main(){
- n=read(),k=read();
- for(int i=;i<=n;i++)
- a[i]=read(),mx=my_max(mx,a[i]);
- for(int i=;i<=k;i++){
- char ch(init());
- if(ch=='>')
- op[i]=;
- if(ch=='<')
- op[i]=;
- if(ch=='=')
- op[i]=;
- }
- f[]=;
- if(op[]==)
- update_d(a[],a[],f[],,mx,);
- if(op[]==)
- update_x(a[],a[],f[],,mx,);
- if(op[]==)
- update_e(a[],a[],f[],,mx,);
- for(int i=;i<=n;i++){
- int now(a[i]);
- int ans_d(query_d(now+,mx,,mx,));
- int ans_x(query_x(,now-,,mx,));
- int ans_e(query_e(now,now,,mx,));
- int ans(my_max(my_max(ans_d,ans_x),ans_e));
- f[i]=ans+;
- int o(op[ans%k+]);//cout<<i<<' '<<f[i]<<' '<<o<<endl;
- if(o==)
- update_d(now,now,f[i],,mx,);
- if(o==)
- update_x(now,now,f[i],,mx,);
- if(o==)
- update_e(now,now,f[i],,mx,);
- }
- int mxx();
- for(int i=;i<=n;i++)
- mxx=my_max(mxx,f[i]);
- printf("%d",mxx);
- }
[补档][Poi2010]Monotonicity 2的更多相关文章
- [补档]暑假集训D3总结
考试 集训第一次考试,然而- - 总共四道题,两道打了DFS,一道暴力,一道~~输出样例~~乱搞,都是泪啊- - 目前只改了三道,回头改完那道题再上题解吧- - T2 [Poi2010]Monot ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
- 【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树
[BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度 ...
- STL 补档
STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...
- 图论补档——KM算法+稳定婚姻问题
突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...
- [补档] 大假期集训Part.1
新博客搭起来先补一发档... 那就从大假期集训第一部分说起好了QwQ 自己还是太菜掉回了2016级水平 day1: day1的时候来得有点晚(毕竟准高一)然后进机房发现早就开考了还没有给我题面于是搞了 ...
- 软件安装配置笔记(三)——ArcGIS系列产品安装与配置(补档)(附数据库连接及数据导入)
在前两篇安装配置笔记之后,就忘记把其他安装配置笔记迁移过来了,真是失误失误!趁现在其他文档需要赶紧补上. 目录: 一.ArcMap 二.ArcMap连接数据库并导入数据 三.Arcgis Pro 四. ...
- 补档 Codeblocks下的文件标题栏(标签)显示方法
可能在以下链接也能看到这篇文档 我知道很多人都不知道这个到底叫啥,还不如直接一点: 文件标题栏 就是如下的效果. 解决办法: 在左上角第三个view下,打开后取消Hide editor tabs 选项 ...
- [BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity 树状数组优化dp
这个dp乍看不科学,仔细一看更不科学,所以作为一个执着BOY,我决定要造数据卡死波兰人民,但是我造着造着就......证出来了......... 这个就是把 < > =分开讨论每次找到f[ ...
随机推荐
- linux中常用的命令
1.向某个ip发送文件 scp name.tar root(身份)@ip:/lujing 2.重启系统 init 6 3.如果修改了ifcfg-eth0类似于网卡配置文件,修改网口,ip等设置: 需要 ...
- salesforce零基础学习(七十四)apex:actionRegion以及apex:actionSupport浅谈
我们在开发中,很难会遇见不提交表单的情况.常用的apex:commandButton,apex:commandLink,apex:actionFunction,apex:actionSupport.他 ...
- Jquery Ajax 保存
Jquery Ajax 保存: $.ajax({ type: "POST", async:false, url: "${ctx}/url", data: {pI ...
- 【LeetCode】89. Gray Code
题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...
- 【Android Developers Training】 86. 基于连接类型修改您的下载模式
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- JavaScript中的排序
<script> //1. 冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len ...
- 什么是VPN,VPN有什么用,怎么获得VPN
什么是VPN? VPN英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.vpn被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过混 ...
- JUnit【1】断言用法之assertEquals/True/False/ArrayEquals
前段时间去亚信面试,被问到写一个冒泡排序,心想这多新鲜,刷刷几下写好.面试官突然问,你怎么对这个程序进行单元测试? 单元测试?! 懵圈... 单元测试 代码是为了什么, ...
- spring auto-config
spring security auto-config auto-config配置 <http auto-config="true"> </http> 自动 ...
- java项目(非ssm等框架)下的quartz定时器任务
第一步:引包 要使用Quartz,必须要引入以下这几个包: 1.log4j-1.2.16 2.quartz-2.1.7 3.slf4j-api-1.6.1.jar 4.slf4j-log4j12-1. ...