bzoj4904 [Ctsc2017]最长上升子序列
我们发现他让求的东西很奇怪,于是通过某D开头定理,我们转化为前m位的序列用k个不上升子序列最多能覆盖多少。数据范围小的时候可以网络流做,但是这道题显然不支持网络流的复杂度。然后有一个奇怪的东西叫杨氏矩阵,详见acdreamers acdreamers。但是我们又不能每次O(k)来扫,之后又有一个神奇的性质就是对于反串建的这个矩阵的形状和原矩阵转置的形状是一样的,于是我们可以在原矩阵中找到前$\sqrt{n}$个,之后的长度肯定小于$\sqrt{n}$于是我们就可以在转置后的矩阵中计算了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 50505
#define M 233
using namespace std;
struct data{int pos,K,id,ans;}d[N<<];
bool cmp1(data a,data b){return a.pos<b.pos;}
bool cmp2(data a,data b){return a.id<b.id;}
int n,m,a[N];
namespace A{
int a[M+][N],len[M+];
void insert(int x,int y,int v){
if(x>M)return ;
y=min(y,len[x]);
while(y&&a[x][y]<v)y--;y++;
if(y>len[x]){
a[x][++len[x]]=v;
return;
}
else{
insert(x+,y,a[x][y]);
a[x][y]=v;
}
}
};
namespace B{
int a[M+][N],len[M+];
void insert(int x,int y,int v){
if(x>M)return ;
y=min(y,len[x]);
while(y&&a[x][y]>=v)y--;y++;
if(y>len[x]){
a[x][++len[x]]=v;
return;
}
else{
insert(x+,y,a[x][y]);
a[x][y]=v;
}
}
};
int query(int x){
int ans=;
for(int i=;i<=x&&i<=M;i++)
ans+=A::len[i];
if(x>M){
for(int i=;i<=M&&B::len[i]>M;i++)
ans+=min(B::len[i],x)-M;
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++)
scanf("%d%d",&d[i].pos,&d[i].K),d[i].id=i;
sort(d+,d+m+,cmp1);
for(int i=,j=;i<=n;i++){
A::insert(,N,a[i]);
B::insert(,N,a[i]);
for(;j<=m&&d[j].pos==i;j++)
d[j].ans=query(d[j].K);
}
sort(d+,d+m+,cmp2);
for(int i=;i<=m;i++)
printf("%d\n",d[i].ans);
return ;
}
bzoj4904 [Ctsc2017]最长上升子序列的更多相关文章
- Luogu3774 [CTSC2017]最长上升子序列 【Young表,根号分治】
题目链接:洛谷 推荐阅读:2019年集训队论文<浅谈杨氏矩阵在信息学竞赛中的应用> 首先我们来看一个东西,叫做Young表. 它是长一个阶梯状的东西(行长和列长都是递减的),并且每一行和每 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
- 最长下降子序列O(n^2)及O(n*log(n))解法
求最长下降子序列和LIS基本思路是完全一样的,都是很经典的DP题目. 问题大都类似于 有一个序列 a1,a2,a3...ak..an,求其最长下降子序列(或者求其最长不下降子序列)的长度. 以最长下降 ...
- 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...
- [BZOJ3173][Tjoi2013]最长上升子序列
[BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...
随机推荐
- python MultiProcessing模块进程间通信的解惑与回顾
这段时间沉迷MultiProcessing模块不能自拔,没办法,python的基础不太熟,因此就是在不断地遇到问题解决问题.之前学习asyncio模块学的一知半解,后来想起MultiProcessin ...
- Xcode9无线调试教程
Xcode9最让人眼前一亮的莫过于同一局域网下支持无线部署调试. 从Xcode9支持无线部署调试来看,千呼万唤的iPhone8支持无线充电几乎是必然.下面简单梳理下无线调试的步骤: 1. 第一次部署调 ...
- rotate image(旋转数组)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- ecshop 修改记录20150710
ecshop 修改记录20150710 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop 前台部分:在后台商店设置 - 商店标题修改 后者打开includes/lib ...
- Android Gradle 自定义Task 详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...
- Java 包装类笔记
@(JDK)[包装类] Java 包装类笔记 当需要使用到集合的时候,如果是基础数据类型,需要转换为包装类,再使用,在JDK1.5之前,每次使用的时候,都需要手动转换为包装类(称为装箱),然后在使用的 ...
- myeclipse 的Customize Perspective 没有反应
MyEclipse 2014 工具栏里的Quick Access老是跳上跳下的,弄得我很烦,所以就想自定义一下工具栏,结果 window--> customize perspective 没用 ...
- C#学习笔记 day_two
C#学习笔记 day two Chapter 2 c#基本概念 2.1编译与运行hello world应用程序 点击f5或者vs2010中的运行图标即可 2.3C#的概念拓展 (1)继承性:一个类含有 ...
- JDK安装:CentOS和Windows环境
Windows上JDK安装 1:下载jdk. 地址在 http://www.oracle.com/index.html >downloads>se>Ja ...
- htmlparser 学习
htmlparser 学习系列 htmlparser 使用法使用与详解