【链接】 我是链接,点我呀:)

【题意】

题意相当于问你改变一个位置之后。
从左往右扫描最大值。这个最大值会改变多少次。

【题解】

假设我们改变的是i这个位置,下面说的a[i]都是改成q之后的a[i]
我们完全可以直接暴力算出来左边的最大值会改变多少次以及右边的最大值会改变多少次。
那么如何找呢?
首先在1..i-1当中找到那个最大值a[idx1]
这个可以用st表预处理出来。
然后如果a[i]这个位置是更新最大值中的某一次的话ans++。
显然a[i]要满足>a[idx1]
如果不满足的话,那么a[i]就不是更新最大值中的某一次,ans不变就好仍然为0
然后我们可以通过一次扫描就能预处理出来到达a[idx1]需要更新多少次最大值。

然后我们可以用ST表。找出来最近的大于key的数字a[idx2]

(只需看看L..mid这一段最大值(用st表获得)是不是大于key,是的话R = mid-1否则L = mid +1,这样写一下二分就能求出a[idx2]了

这里的key,如果a[i]>a[idx1],那么key = a[i]否则key = a[idx1];(因为要满足递增的性质。

(注意千万别以为是upper_bound....upper_bound找的是最小的大于key的数字a[idx2]...比如a={2 4 3}|,set.upper_bound(2)的结果是3而不是离他更近的4.。。。。

之后只要求出a[idx2]开始还要更新多少次最大值就可以了。

这个可以从后往前维护一个单调队列。单调队列的长度就是更新最大值的次数。

ans+=到达idx1更新的次数+idx2到最后更新的次数。

输出ans就好。

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 1E5; int n,m,a[N+10],_size[N+10];
int dl[N+10],h,t,step[N+10],dp[N+10][20]; int ma(int i,int j){
if (a[i]>=a[j]) return i;
return j;
} int get_ma(int l,int r){
if (l>r) return 0;
int len = log2(r-l+1);
return ma(dp[l][len],dp[r-(1<<len)+1][len]);
} int get_first_bigger(int q,int L){
int l = L,r = n,temp = -1;
while (l <= r){
int mid = (l+r)>>1;
if (a[get_ma(L,mid)]>q){
temp = mid;
r = mid-1;
}else l = mid + 1;
}
return temp;
} int main(){
//freopen("D:\\rush.txt","r",stdin);
//freopen("D:\\rush_out.txt","w",stdout);
int T;
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
h = 1,t = 0;
for (int i = n;i >= 1;i--){
while (h<=t && a[i]>=a[dl[t]]) t--;
dl[++t] = i;
_size[i] = t-h+1;
}
step[1] = 1;
int cur = 1;
for (int i = 2;i <= n;i++)
if (a[i]>a[cur]){
step[i] = step[cur]+1;
cur = i;
}
for (int i = 0;i <= n;i++) dp[i][0] = i;
for (int l = 1;l <= 17;l++){
for (int i = 1;i <= n;i++){
if ((i+(1<<l)-1)>n) break;
dp[i][l] = ma(dp[i][l-1],dp[i+(1<<(l-1))][l-1]);
}
}
for (int i = 1;i <= m;i++){
int p,q;
scanf("%d%d",&p,&q);
int idx = get_ma(1,p-1);
int key = q,ans = 0;
if (q<=a[idx]){
key = a[idx];
ans = -1;
}
int idx2 = get_first_bigger(key,p+1);
if (idx2==-1){
ans += step[idx]+1;
}else{
ans += step[idx]+1+_size[idx2];
}
printf("%d\n",ans);
}
}
return 0;
}

【hdu 6406】Taotao Picks Apples的更多相关文章

  1. 【hdu 6333】Harvest of Apples

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 假设T[i][j]表示的是杨辉三角第i层前j项的和. 会发现它同样满足杨辉三角的性质. 即 T[i][j] = T[i-1][j-1 ...

  2. 【杂题总汇】HDU-6406 Taotao Picks Apples

    [HDU 6406]Taotao Picks Apples 多校赛的时候多写了一行代码就WA了……找了正解对拍,在比赛结束后17分钟AC了

  3. hdu 6406 Taotao Picks Apples 线段树 单点更新

    Taotao Picks Apples Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  4. [乱搞]hdu 6406 Taotao picks apples 笛卡尔树+倍增

    题目链接 Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n app ...

  5. hdu 6406 Taotao Picks Apples (线段树)

    Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n apples o ...

  6. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  7. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  8. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  9. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

随机推荐

  1. android中常见的内存泄漏和解决的方法

    android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢.事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了. 写在前面的一 ...

  2. GCD&amp;&amp;LCM的一些经典问题

    1.1~n的全部数的最小公倍数:lightoj 1289  传送门 分析:素因子分解可知这个数等于小于1~n的全部素数的最高次幂的乘积 预处理1~n的全部质数,空间较大,筛选的时候用位图来压缩.和1~ ...

  3. UVa 11466 - Largest Prime Divisor

    題目:給你一個整數n(不超過14位).求出他的最大的素數因子.假设仅仅有一個素數因子輸出-1. 分析:數論. 直接打表計算10^7內的全部素數因子,然後用短除法除n.記錄最大的因子就可以. 假设最後下 ...

  4. 编程基础知识——C++能不能支持Java和ObjC的反射?

    C++能不能支持Java和ObjC的反射? 要回答这个问题.首先我们要清楚什么是反射.什么是反射? 教科书的解释我就不说了,(^o^)事实上我也记不得.实际开发应用的反射就是在没有某个类型的头文件或者 ...

  5. php Aes 128位算法

    <?php class Mcrypt { private static $key = "fsdjfojojodjiovjojgfosdjfiojio"; private st ...

  6. .NET WebForm 简介(9.19)

    WebForm是微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率. WinForm是C/S(客户端) 主要是本机执行 WebF ...

  7. JavaScript操作HTML&CSS简单入门

    - Java攻城狮学习路线 - 一. JavaScript基础 输出 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML 文档中. 使用 ...

  8. 常用的CSS命名

    头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体佈局宽度:wrapper 左右中:left rig ...

  9. 修复wordpress插件编辑器漏洞

    具体方法,将下面的代码添加到您的配置文件 wp-config.php中: define( 'DISALLOW_FILE_EDIT', true ); 以此关闭插件编辑器功能,一切就这么简单,漏洞也就不 ...

  10. wpf 错误 执行了 QueryInterface 调用,请求提供 COM 可见的托管类“BoilerMonitoringV1._0.MapControl”的默认 IDispatch 接口。

    在做wpf嵌入地图时,在自定义的WebBrowser 里面使用JavaScript调用外部方法的时报的错误 在原来的WinForm里 我们只要在窗体类设置的头部设置个 [System.Runtime. ...