ps:这题的难点,寻找修改的位置之后有多少个苹果能被吃掉,比赛的时候想到的是讨论修改的位置,预处理每个位置的最大值和吃到苹果的数量,记最大值所在的位置为 id, 记修改的位置为 pos,分三种情况讨论,① pos < id,维护一个从 id ~ 1的递减序列,修改后在这个序列里二分查找。② pos == id,维护一个 id + 1 ~ n的递增序列,修改后二分查找。三 pos > id,随便做。是不是感觉我说得很有道理~~~~,然而我并没写出来。实际上,这题离线后就好做了,从后往前维护一个单调栈,当前的元素修改了,就在单调栈中二分查找,O(mlog(n))。讲真,原来询问问题只有两种:强制在线和没要求……为啥我现在菜知道,orz。离线后一般要对询问排序,要不然离线没意义。(所以莫队的思想是很有用的),400ms哟

// 膜强无敌的老师: https://paste.ubuntu.com/p/jFChknqmCD/inline void upd(int &x, int y) { x < y && (x = y); }const int N = 100005;int n, m;
int a[N], cnt[N], Max[N], ans[N];vector<int> v;
vector<P> q[N];void Inite() {v.clear();cnt[0] = Max[0] = 0;for (int i = 1; i <= n; ++i) {cnt[i] = cnt[i - 1];Max[i] = Max[i - 1];if (a[i] > Max[i - 1]) cnt[i]++, Max[i] = a[i];}
}int main()
{//freopen("D:\\1.in", "r", stdin);//freopen("D:\\1.txt", "w", stdout);
BEGIN() {sc(n), sc(m);for (int i = 1; i <= n; ++i) sc(a[i]), q[i].clear();Inite();for (int i = 1; i <= m; ++i) {int pos, x;sc(pos), sc(x);q[pos].pb(P(x, i));}for (int i = n; i >= 1; --i) {for (auto &p : q[i]) {int pos, x;tie(x, pos) = p;int res = cnt[i - 1] + (x > Max[i - 1]);upd(x, Max[i - 1]);res += v.rend() - upper_bound(v.rbegin(), v.rend(), x);ans[pos] = res;}while(v.size() && v.back() <= a[i]) v.pp();v.pb(a[i]);}for (int i = 1; i <= m; ++i) pr(ans[i]);}return 0;
}

补充:线段树也可以做的,主席树也可以。因为对于每个点我们需要向后找最近的大于它的一个值。假设修改的位置为pos ,树的每个区间存的是该区间的最大值,那么我们就可以去寻找(pos + 1, n)这个区间比 a[pos] 大的位置在哪。具体看代码~,言而总之,总而言之,我们的目的是预处理出 从 i 这个位置向后递增的序列长度。因为实现不太优秀的原因,跑了700多ms

inline void upd(int &x, int y) { x < y && (x = y); }
/* 比较扯的是 N = 100005 会RE,OMG,就真的不能一发过吗? */
const int N = 200005;int n, m, tot, mPos;
int a[4 * N], b[N], cnt[N], Max[N], d[N];map<int, int> id;void Inite() {mem(d, 0);cnt[0] = Max[0] = 0;for (int i = 1; i <= n; ++i) {cnt[i] = cnt[i - 1];Max[i] = Max[i - 1];if (b[i] > Max[i - 1]) cnt[i]++, Max[i] = b[i];}
}inline void Pushup(int root) {a[root] = max(a[lson], a[rson]);
}void Build(int l, int r, int root) {if (l == r) {sc(a[root]);id[root] = ++tot;b[tot] = a[root];return;}int mid = (l + r) >> 1;Build(l, mid, lson);Build(mid + 1, r, rson);Pushup(root);
}

/*写挂了的查询!① mPos可能存在,但if过后直接退出而查不到那个位置去,② 当找到mPos后可能在其它节点再次被更新,而且会T,因为查询的代价可能不再是O(log(n))void Query(int l, int r, int root, int L, int R, int x) {    if (l > R || r < L || L > R) return;    if (L <= l && r <= R && l == r) {        mPos = id[root];        return;    }    int mid = (l + r) >> 1;    if (a[lson] > x) Query(l, mid, lson, L, R, x);    else if (a[rson] > x) Query(mid + 1, r, rson, L, R, x);}*/void Query(int l, int r, int root, int L, int R, int x) {if (l > R || r < L || L > R || mPos != -1) return;if (L <= l && r <= R && l == r) {mPos = id[root];return;}int mid = (l + r) >> 1;if (a[lson] > x) Query(l, mid, lson, L, R, x);if (a[rson] > x) Query(mid + 1, r, rson, L, R, x);
}int main()
{//freopen("D:\\1.in", "r", stdin);//freopen("D:\\1.txt", "w", stdout);
BEGIN() {sc(n), sc(m);tot = 0;Build(1, n, 1);Inite();for (int i = n; i; --i) {mPos = -1;Query(1, n, 1, i + 1, n, b[i]);if (mPos == -1) d[i] = 1;else d[i] = d[mPos] + 1;}//for (int i = 1; i <= n; ++i) cout << i << " " << d[i] << endl;for (int i = 1; i <= m; ++i) {int pos, x;sc(pos), sc(x);int res = cnt[pos - 1] + (x > Max[pos - 1]);upd(x, Max[pos - 1]);mPos = -1;Query(1, n, 1, pos + 1, n, x);if (mPos != -1) res += d[mPos];pr(res);}}return 0;
}

又ps:有心情的话我会补充主席树的代码,以及dp和倍增的代码,比较难求的东西只有一个,实现的方式只是手段。

转载于:https://www.cnblogs.com/zgglj-com/p/9486649.html

Taotao Picks Apples相关推荐

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

    [HDU 6406]Taotao Picks Apples 多校赛的时候多写了一行代码就WA了--找了正解对拍,在比赛结束后17分钟AC了? ◇ 题目 +传送门+ <手写翻译> 有n个苹果 ...

  2. Taotao Picks Apples HDU - 6406

    K - Taotao Picks Apples 题目链接:HDU - 6406 题意:树上有一排苹果,每个苹果又同的高度,taotao要摘苹果,而且必须从第一个苹果开始摘,然后没遇到一个高度比之前摘得 ...

  3. HDU 6406 Taotao Picks Apples(前缀和+二分)

    HDU 6406 Taotao Picks Apples(前缀和+二分) Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131 ...

  4. hdu - 6406 Taotao Picks Apples(离线+离散+技巧)

    题目链接:Taotao Picks Apples 题目大意:有n个数,m个操作,每个操作x,q,将x位的数字改为q,输出改完数后数组的递增序列有多长(只能从第一个数开始找,并且必须依次找更大的数). ...

  5. 【hdu 6406】Taotao Picks Apples

    [链接] 我是链接,点我呀:) [题意] 题意相当于问你改变一个位置之后. 从左往右扫描最大值.这个最大值会改变多少次. [题解] 假设我们改变的是i这个位置,下面说的a[i]都是改成q之后的a[i] ...

  6. 多校1010 Taotao Picks Apples

    >>点击进入原题<< 思路:题解很有意思,适合线段树进阶 #include<cstdio> #include<cmath> #include<cs ...

  7. HDU - 6406 Taotao Picks Apples(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次询问,每次询问假设如果设置 a[ pos ] = val 的话,那么此时序列中的最长上升子序列是多少,此时的上升子序列指的是 ...

  8. 多校 hdu 6406 Taotao Picks Apples(线段树)

    设d1[ i ]为从a1开始到 ai 的最长递增子序列长度,设d2[ i ]为从ai开始到an的最长递增子序列长度,假设要把ap改为q,可以把序列分为1到p-1和p+1到n两段,可以用线段树找到1到p ...

  9. hdu 6406 Taotao Picks Apples 线段树

    hdu 6406 多校八第十题,设d1[ i ]为从a1开始到 ai 的最长递增子序列长度,设d2[ i ]为从ai开始到an的最长递增子序列长度,假设要把ap改为q,可以把序列分为1到p-1和p+1 ...

最新文章

  1. Python自动化测试白羊座-week3切片+元组
  2. Pandas进阶修炼120题,给你深度和广度的船新体验
  3. linux c ping实现
  4. java filesystem 追加_java 如何往已经存在的excel表格里面追加数据的方法
  5. elementui的el-tree第一次加载无法展开和选中的问题
  6. L1-042. 日期格式化
  7. tomcat start 无法启动_解密Springboot内嵌Tomcat
  8. 开课吧课堂:数据可视化的制作方法与准则有哪些?
  9. springboot配置手动提交_kafka教程-springboot消费者-手动提交offset
  10. BERT出来后难道我们无路可走了吗?错!这些新想法你需要了解!
  11. 在spring中手动编写事务
  12. delphi 获取驱动盘的卷标 号
  13. windows 错误代码2
  14. 梦幻西游网页版服务器,服务器荣辱战,《梦幻西游网页版》梦幻攻防战“挖矿人”经验来啦...
  15. [todo] 如何高效工作
  16. 一种改版后检查硬件PCB生产资料的方法***-----Gerber对比,检查的方法
  17. 模仿360安全卫士项目笔记8
  18. 各种类型相机rtsp取流格式大汇总
  19. 日常英语---十二、MapleStory/Monsters/Level 1-10(Horny Mushroom)
  20. 思博伦TestCenter进行某大型保险集团广域网测试——路由器测试_双极未来

热门文章

  1. synchronized 异常_面试官,别挂电话,Synchronized,我还能说上半小时
  2. 一个人越来越沉默,即便是对着家人也无话可说,这究竟是怎么了?
  3. 你是没有可能把主业做得风雨飘摇,却把副业做得风生水起的
  4. 怎么把GMS的软件转到HMS?
  5. 运营商宣传的volte语音高清有啥好处啊?
  6. 行存储索引改换成列存储索引_索引策略–第2部分–内存优化表和列存储索引
  7. phpstorm设置xdebug调试
  8. JQuery获取第几个元素和判断元素在第几个
  9. Java 单例模式详解(转)
  10. ECNU 3263 丽娃河的狼人传说(差分约束)