ACM 竞赛高校联盟 练习赛 第六场 光头强的强迫症(线段树)
链接:https://nanti.jisuanke.com/t/16878
分析:先挖个坑。。这题貌似有问题,按题意应该是能砍则砍,但是样例是按能得到的最大数来算的。。下面先按能砍则砍来分析。。
首先预处理一下,f[i]表示从1砍到i,能砍的最大数,b[i]表示如果把i砍了,从i往后一共能砍多少棵,MAX[i]表示从1到i,砍过的树中的最大高度。f和MAX直接O(n)处理就行了,b[i]用线段树来处理,b[i]=b[j]+1,j是满足h[j]>h[i]且j>i的j中最小值,复杂度为O(nlogn)。
然后询问,如果b>MAX[a-1],第a棵修改后依然要砍,因此ans=1+f[a-1]+b[j],j是满足j>a且h[j]>b的j中最小值;否则,不砍第a棵,ans=f[a-1]+b[j],j是满足j>a且h[j]>MAX[a-1]的j中最小值。复杂度为O(nlogn)。
以下代码不能AC,样例都过不了。。坐等出题人修改题意或样例再改。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=4e5+5; 6 int n,m; 7 class segTree{ 8 public: 9 int a[maxn],s[maxn*4]; 10 void build(int node,int begin,int end){ 11 if(begin==end){ 12 s[node]=begin; 13 }else{ 14 build(2*node,begin,(begin+end)/2); 15 build(2*node+1,(begin+end)/2+1,end); 16 if(a[s[2*node]]>=a[s[2*node+1]]) 17 s[node]=s[2*node]; 18 else 19 s[node]=s[2*node+1]; 20 } 21 } 22 int query(int node,int begin,int end,int left,int right,int low_bound){ 23 if(left>end||right<begin) 24 return -1; 25 // if(begin>=left&&end<=right) 26 // return s[node]; 27 if(begin==end){ 28 if(a[begin]>low_bound)return begin; 29 return -1; 30 } 31 int q1,q2; 32 if(a[s[2*node]]>low_bound)return query(2*node,begin,(begin+end)/2,left,right,low_bound); 33 if(a[s[2*node+1]]>low_bound)return query(2*node+1,(begin+end)/2+1,end,left,right,low_bound); 34 return -1; 35 } 36 }st; 37 int Max[maxn],sum_front[maxn],sum_back[maxn]; 38 int h[maxn]; 39 int main(){ 40 // freopen("e:\\in.txt","r",stdin); 41 scanf("%d%d",&n,&m); 42 Max[0]=0,sum_front[0]=0; 43 for(int i=1;i<=n;i++){ 44 scanf("%d",&h[i]); 45 st.a[i]=h[i]; 46 if(h[i]>Max[i-1]){ 47 sum_front[i]=sum_front[i-1]+1; 48 Max[i]=h[i]; 49 }else{ 50 sum_front[i]=sum_front[i-1]; 51 Max[i]=Max[i-1]; 52 } 53 } 54 int k; 55 ta.init(n); 56 st.build(1,1,n); 57 sum_back[n]=1; 58 for(int i=n-1;i>=1;i--){ 59 k=st.query(1,1,n,i+1,n,h[i]); 60 if(k!=-1)sum_back[i]=1+sum_back[k]; 61 else sum_back[i]=1; 62 } 63 int a,b; 64 for(int i=0;i<m;i++){ 65 scanf("%d%d",&a,&b); 66 int ans=sum_front[a-1]; 67 if(b>Max[a-1]){ 68 ans++; 69 k=st.query(1,1,n,a+1,n,b); 70 if(k!=-1)ans+=sum_back[k]; 71 }else{ 72 k=st.query(1,1,n,a+1,n,Max[a-1]); 73 if(k!=-1) 74 ans+=sum_back[k]; 75 } 76 printf("%d\n",ans); 77 } 78 return 0; 79 }
转载于:https://www.cnblogs.com/7391-KID/p/7478889.html
ACM 竞赛高校联盟 练习赛 第六场 光头强的强迫症(线段树)相关推荐
- ACM 竞赛高校联盟 练习赛 第六场 韩梅梅的抽象画(图论水题)
链接:https://nanti.jisuanke.com/t/16876 题意:给定一个无向图,求是否含3个或以上有根树,且根在同一个环上. 分析:只含一个环,剩下的都是树,因此必然有n==m,满足 ...
- ACM 竞赛高校联盟 练习赛 第二场 BC
B. 题解: 枚举约数即可,判断n个数能否填约数的整数倍 #include <iostream> #include <cstring> #include <cstdio& ...
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...
- 计蒜客 ACM竞赛高校联盟训练赛 第8场 煎牛排
水一水. https://nanti.jisuanke.com/t/24205 煎牛排 题目描述 又是一个难得的周六,是时候远离食堂和外卖出去大吃一顿了.圈内知名吃货AA正想着中午去吃汉堡炸鸡烤肉火锅 ...
- 牛客网暑期ACM多校训练营(第六场)J Heritage of skywalkert
题目链接:https://www.nowcoder.com/acm/contest/144/J 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 牛客网暑期ACM多校训练营(第六场)J-Heritage of skywalkert
链接:https://www.nowcoder.com/acm/contest/144/J 来源:牛客网 题目描述 skywalkert, the new legend of Beihang Univ ...
- 牛客网暑期ACM多校训练营(第六场) - (A,C,J)
比赛链接:https://www.nowcoder.com/acm/contest/144#question A Singing Contest 题意:有编号1~2^n的2^n个人参加唱歌比赛,每人有 ...
- 牛客网暑期ACM多校训练营(第六场) C.Generation I (思维+逆元+组合数学)
题目链接 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Oak is given N e ...
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
题目描述 Kanade has n boxes , the i-th box has p[i] probability to have an diamond of d[i] size. At the ...
最新文章
- springmvc二十三:日期格式化
- 开始Windows Embedded Compact 7的第一个项目——虚拟机上的CEPC
- 魔兽服务器状态页面,谁动了我的服务器 WOW大服务器优势何时展现
- 让source insight更好的支持中文
- visual studio 2010运行速度提速
- php字符集转换,php字符集转换
- opencomm在c语言中的作用,你能用C语言编写面向对象的代码吗?
- 微信和QQ可以关闭广告了,每次能关6个月
- HTML5模拟衣服撕扯动画
- python遍历json_Python学习笔记:Python3中Json数据遍历取指定值
- 软件测试面试必考的SQL语句
- Command ‘docker‘ not found, but can be installed with:
- dos2unix介绍
- noi2016试题C语言,noip2016普及组初赛试题和答案.pdf
- linux双显卡自动切换,Deepin(Linux)双显卡之bumblebee(大黄蜂)、Prime及手动切换方案...
- 摆脱 AI 生产“小作坊”:如何基于 Kubernetes 构建云原生 AI 平台
- h5微信页面在手机微信端和微信web开发者工具中都能正常显示,但是在pc端微信浏览器上打不开(显示空白)...
- 【Stanford Online】Engineering: Algorithms1 NO.2 Asymptotic analysis
- pdf转jpg在线转换免费
- 全球与中国远程摄像机市场深度研究分析报告
热门文章
- 微信小程序教程笔记5
- early stopping softmax批量梯度下降(BGD)手动实现
- caffe上手:微调CaffeNet用于车颜色识别
- 《小欢喜》欢喜人生,人生如画,画里有话,话说人生
- python实践统计学中的三大相关性系数,并绘制相关性分析的热力图
- 2019ccpc河北省赛总结
- Outlook验证服务器证书,OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书...
- linux闹钟命令,Linux基础命令一
- 2021-06-27函数定义与参数
- 区块链 xuperchain xuper-java-sdk 部署使用EVM 合约 教程