一、题意

给定一个序列,之后给出若干个修改,修改的内容为在原序列的基础上,将某一位元素的值改成给定的值<每次修改相互独立,不保存修改后的结果>。之后询问,在选择第一位元素的情况下,最长递增子序列的长度是多少。

二、题解

考虑不经修改的情况,应当设dp[i]为选取当前位情况下的最长递增子串的长度。则对于这道题,应当认为对于修改a为b,设l_pos为a左边最大的元素的位置,r_pos为a右边大于max(b,r_pos)的元素的位置。则有ans = dp[1] - dp[l_pos] + 1 + dp[r_pos];对于b本身大于位于l_pos的元素,应当给结果+1。

#include<bits/stdc++.h>
using namespace std; #define ll long long const int MAXN = ; class Node{
public:
int l,r,lc,rc,maxx;
};
Node nodes[MAXN];
int nodes_num;
int t,n,m; int arr[MAXN];
int dp[MAXN]; void tree_init(int a,int b){
int now = nodes_num++;
nodes[now].l = a;
nodes[now].r = b;
if(a == b-){
nodes[now].maxx = arr[a];
return ;
}
int mid = (a+b)/;
nodes[now].lc = nodes_num;
tree_init(a,mid);
nodes[now].rc = nodes_num;
tree_init(mid,b);
nodes[now].maxx = max(nodes[nodes[now].lc].maxx,nodes[nodes[now].rc].maxx);
} int find_max(int now){
int l = nodes[now].l;
int r = nodes[now].r;
if(l == r-)return l;
int maxx = nodes[now].maxx;
int lc = nodes[now].lc;
int rc = nodes[now].rc;
if(maxx == nodes[lc].maxx)return find_max(lc);
else return find_max(rc);
} int find_biggest(int now,int a,int b){
int l = nodes[now].l;
int r =nodes[now].r;
if(l == a&&r == b){
return find_max(now);
}
int mid = (l+r)/;
int ret ;
int lc = nodes[now].lc;
int rc = nodes[now].rc;
if(a<mid){
ret = find_biggest(lc,a,min(b,mid));
if(b>mid){
int tmp = find_biggest(rc,mid,b);
ret = arr[ret] >= arr[tmp] ? ret:tmp;
}
}else ret = find_biggest(rc,a,b);
return ret;
} int find_left(int now,int key){
int l = nodes[now].l;
int r = nodes[now].r;
if(l == r-)return l;
int lc = nodes[now].lc;
int rc = nodes[now].rc;
if(nodes[lc].maxx > key)return find_left(lc,key);
else return find_left(rc,key);
} int find_first(int now,int pos, int key){
int l = nodes[now].l;
int r = nodes[now].r;
if(l >= pos){
return find_left(now,key);
}
int mid = (l+r)/; int lc = nodes[now].lc;
int rc = nodes[now].rc;
int ret ;
if(pos < mid && nodes[lc].maxx > key){
ret = find_first(lc,pos,key);
if(ret >= pos && arr[ret] > key)return ret;
}
if(nodes[rc].maxx <= key)return r-;
return find_first(rc,pos,key); } void init(){
scanf("%d %d",&n,&m);
nodes_num = ;
arr[] = -;
arr[n+] = INT_MAX;
for(int i=;i<=n;++i)scanf("%d",&arr[i]);
tree_init(,n+);
memset(dp,,sizeof(dp));
for(int i=n;i>=;--i){
dp[i] = dp[find_first(,i+,arr[i])]+;
}
dp[] = dp[]+;
for(int i=;i<m;++i){
int a,b;
scanf("%d %d",&a,&b);
int l_pos = find_biggest(,,a);
int key = max(b,arr[l_pos]);
int r_pos = find_first(,a+,max(b,arr[l_pos]));
int ans = dp[] - dp[l_pos] + + dp[r_pos];
if(b > arr[l_pos] )ans++;
cout<<ans<<'\n';
} } int main(){ cin>>t;
while(t--)init(); return ;
}

HDU暑假多校第八场J-Taotao Picks Apples的更多相关文章

  1. HDU暑假多校第八场G-Card Game

    一.题意 给出N个卡牌,卡牌的正反两面具有两个数字,取值范围为[1,2*n],给出若干个默认正面向上的卡牌,求最小反转多少张卡牌可以使得,每张卡牌朝上的面上都有一个不同的数字,同时满足最小反转次数的反 ...

  2. HDU暑假多校第四场J-Let Sudoku Rotate

    一.题意 Sudoku is a logic-based, combinatorial number-placement puzzle, which is popular around the wor ...

  3. HDU暑假多校第六场K-werewolf

    一.题意 好人必然说真话,坏人不一定说真话,给定N个人的言论<每人一个发言.不谈及自己>,要求指出有多少个人一定是好人,有多少个人一定是坏人.#define 狼人 坏人#define 村民 ...

  4. HDU暑假多校第三场H.Monster Hunter

    一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...

  5. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  6. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  7. 2020牛客多校第八场K题

    __int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...

  8. 2014 HDU多校弟六场J题 【模拟斗地主】

    这是一道5Y的题目 有坑的地方我已在代码中注释好了 QAQ Ps:模拟题还是练的太少了,速度不够快诶 //#pragma comment(linker, "/STACK:16777216&q ...

  9. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

随机推荐

  1. Selenium2学习(九)-- 多窗口,句柄(handle)

    前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 一.认识多窗 ...

  2. 安装OUD报错,unsupported classversion 51.0

    查找,错误代码,在一篇博客中看到:补充:后经实例证明,在eclipse中进行开发的时候,build path 中JDK进行类库的编译(就是你使用类在不在这个JDK中),java compiler co ...

  3. 12C RAC 常用检查命令,持续总结中

    grid: olsnodes -s列出集群中节点crsctl check cluster -all检查几圈状态crsctl check clustercrsctl check crs 检查当前节点sr ...

  4. javascript Object与Array用法

    引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起.引用类型的值是引用类型的一个实例. 一.Object ECMAScript中的对象其实就是一组数据和功能的结合. Object类型其实是所 ...

  5. C语言 Printf函数

    #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... printf(&qu ...

  6. [转]查找问题的利器 - Git Bisect

    转自:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...

  7. 「SDOI2008沙拉公主的困惑」

    题目 看着有点可怕 求 \[\sum_{i=1}^{n!}[(i,m!)=1]\] 考虑一下\(m=n\)的时候的答案 非常显然就是\(\varphi(m!)\) 而如果\(n>m\) 非常显然 ...

  8. (第三场) C Shuffle Cards 【STL_rope || splay】

    题目链接:https://www.nowcoder.com/acm/contest/141/C 题目描述 Eddy likes to play cards game since there are a ...

  9. 2017.9.12 初入HTML -----学习总结(二)

    接上:..... (4)标记可分为: 4.1单标记:(单标记仅单独使用就可以表达完整的意思) 基本语法:<标记名称/> 例如:<br/>实现换行的功能.<hr/>实 ...

  10. 【luogu T24743 [愚人节题目5]永世隔绝的理想乡】 题解

    题意翻译 我们来说说王的故事吧. 星之内海,瞭望之台.从乐园的角落告知汝等.汝等的故事充满了祝福.只有无罪之人可以进入——『永世隔绝的理想乡(Garden of Avalon)』! 题目背景 zcy入 ...