Taotao Picks Apples
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相关推荐
- 【杂题总汇】HDU-6406 Taotao Picks Apples
[HDU 6406]Taotao Picks Apples 多校赛的时候多写了一行代码就WA了--找了正解对拍,在比赛结束后17分钟AC了? ◇ 题目 +传送门+ <手写翻译> 有n个苹果 ...
- Taotao Picks Apples HDU - 6406
K - Taotao Picks Apples 题目链接:HDU - 6406 题意:树上有一排苹果,每个苹果又同的高度,taotao要摘苹果,而且必须从第一个苹果开始摘,然后没遇到一个高度比之前摘得 ...
- HDU 6406 Taotao Picks Apples(前缀和+二分)
HDU 6406 Taotao Picks Apples(前缀和+二分) Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- hdu - 6406 Taotao Picks Apples(离线+离散+技巧)
题目链接:Taotao Picks Apples 题目大意:有n个数,m个操作,每个操作x,q,将x位的数字改为q,输出改完数后数组的递增序列有多长(只能从第一个数开始找,并且必须依次找更大的数). ...
- 【hdu 6406】Taotao Picks Apples
[链接] 我是链接,点我呀:) [题意] 题意相当于问你改变一个位置之后. 从左往右扫描最大值.这个最大值会改变多少次. [题解] 假设我们改变的是i这个位置,下面说的a[i]都是改成q之后的a[i] ...
- 多校1010 Taotao Picks Apples
>>点击进入原题<< 思路:题解很有意思,适合线段树进阶 #include<cstdio> #include<cmath> #include<cs ...
- HDU - 6406 Taotao Picks Apples(线段树区间合并)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次询问,每次询问假设如果设置 a[ pos ] = val 的话,那么此时序列中的最长上升子序列是多少,此时的上升子序列指的是 ...
- 多校 hdu 6406 Taotao Picks Apples(线段树)
设d1[ i ]为从a1开始到 ai 的最长递增子序列长度,设d2[ i ]为从ai开始到an的最长递增子序列长度,假设要把ap改为q,可以把序列分为1到p-1和p+1到n两段,可以用线段树找到1到p ...
- hdu 6406 Taotao Picks Apples 线段树
hdu 6406 多校八第十题,设d1[ i ]为从a1开始到 ai 的最长递增子序列长度,设d2[ i ]为从ai开始到an的最长递增子序列长度,假设要把ap改为q,可以把序列分为1到p-1和p+1 ...
最新文章
- Python自动化测试白羊座-week3切片+元组
- Pandas进阶修炼120题,给你深度和广度的船新体验
- linux c ping实现
- java filesystem 追加_java 如何往已经存在的excel表格里面追加数据的方法
- elementui的el-tree第一次加载无法展开和选中的问题
- L1-042. 日期格式化
- tomcat start 无法启动_解密Springboot内嵌Tomcat
- 开课吧课堂:数据可视化的制作方法与准则有哪些?
- springboot配置手动提交_kafka教程-springboot消费者-手动提交offset
- BERT出来后难道我们无路可走了吗?错!这些新想法你需要了解!
- 在spring中手动编写事务
- delphi 获取驱动盘的卷标 号
- windows 错误代码2
- 梦幻西游网页版服务器,服务器荣辱战,《梦幻西游网页版》梦幻攻防战“挖矿人”经验来啦...
- [todo] 如何高效工作
- 一种改版后检查硬件PCB生产资料的方法***-----Gerber对比,检查的方法
- 模仿360安全卫士项目笔记8
- 各种类型相机rtsp取流格式大汇总
- 日常英语---十二、MapleStory/Monsters/Level 1-10(Horny Mushroom)
- 思博伦TestCenter进行某大型保险集团广域网测试——路由器测试_双极未来