GDOI2016模拟8.15蜘蛛侠
2015-08-15 21:43
351 查看
题目
话说世界上有很多超级英雄:蝙蝠侠,蜘蛛侠,超人,名字都写不出来的人等等。在他们之中有一个叫Kickass。今天他想模仿蜘蛛侠,所以他选择了一排高楼来跳。
具体来说,他选择了一列N幢高楼,从左到右标号为1到N。一开始他在第K幢高楼。不幸的是,Kickass能力非常有限,只能跳到向左或向右相邻的高楼,而且他要跳到的楼的高度必须不能大于他现在处在的楼的高度。Kickass不想自己看起来很渣渣,所以他在一些高楼顶部放了蹦床,从这些高楼起跳,能跳到任何其他的高楼,不管要跳到的高楼在哪里或是多高。
你的任务是找到Kickass在第K高楼起跳能跳到的最多不同的高楼数。如果Kickass跳到一幢高楼超过一次,我们只会算一次。并且,即使Kickass没有重新跳到,第K幢高楼还是要算入答案。
这个比较明显可以用暴力做:
我们可以发现所有弹簧分别向左、向右连续单调不减的楼都可以到达,那么先打个标记,并统计入答案内(若s不能到达弹簧,则暴力求s向左、向右最长的单调不增的楼加上等高反向的一段),然后再找没被标记的最长单调不减或不增的一段,加入答案,输出ans就行了
这些都可以在O(n)做出来
贴代码
话说世界上有很多超级英雄:蝙蝠侠,蜘蛛侠,超人,名字都写不出来的人等等。在他们之中有一个叫Kickass。今天他想模仿蜘蛛侠,所以他选择了一排高楼来跳。
具体来说,他选择了一列N幢高楼,从左到右标号为1到N。一开始他在第K幢高楼。不幸的是,Kickass能力非常有限,只能跳到向左或向右相邻的高楼,而且他要跳到的楼的高度必须不能大于他现在处在的楼的高度。Kickass不想自己看起来很渣渣,所以他在一些高楼顶部放了蹦床,从这些高楼起跳,能跳到任何其他的高楼,不管要跳到的高楼在哪里或是多高。
你的任务是找到Kickass在第K高楼起跳能跳到的最多不同的高楼数。如果Kickass跳到一幢高楼超过一次,我们只会算一次。并且,即使Kickass没有重新跳到,第K幢高楼还是要算入答案。
这个比较明显可以用暴力做:
我们可以发现所有弹簧分别向左、向右连续单调不减的楼都可以到达,那么先打个标记,并统计入答案内(若s不能到达弹簧,则暴力求s向左、向右最长的单调不增的楼加上等高反向的一段),然后再找没被标记的最长单调不减或不增的一段,加入答案,输出ans就行了
这些都可以在O(n)做出来
贴代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define N 300011 int n,s,ans; int a ; bool bz ; bool p; void init(){ scanf("%d %d",&n,&s); for (int i=1;i<=n;i++) scanf("%d",&a[i]); } void pre(){ static char c; static int x; for (int i=1;i<=n;i++){ scanf(" %c",&c); if (c=='T'){ p=1; x=i; bz[x]=1; for (--x;x&&a[x]>=a[x+1]&&!bz[x];bz[x--]=1); x=i; for (++x;x<=n&&a[x]>=a[x-1]&&!bz[x];bz[x++]=1); } } if (!bz[s])p=0; if (!p)return; } void work(){ static int x,y,z; if (p){ bz[0]=1,bz[n+1]=1; y=0,z=0; for (int i=1;i<=n;i++) if (bz[i]){ ans++; z=max(y,z); y=0; }else if (bz[i-1]) y=1; else if (a[i-1]>=a[i]) ++y; else{ z=max(y,z); y=1; } z=max(y,z); y=0; for (int i=n;i;i--) if (bz[i]){ z=max(y,z); y=0; }else if (bz[i+1]) y=1; else if (a[i+1]>=a[i]) ++y; else{ z=max(y,z); y=1; } z=max(y,z); ans+=z; }else{ x=s; ans=1; for (--x;x&&a[x]<=a[x+1];ans++,x--); x=s; for (;x<n&&a[x+1]==a[x];++x,ans++); x=s; z=1; for (x++;x<=n&&a[x]<=a[x-1];z++,x++); x=s; for(;x>1&&a[x-1]==a[x];--x,z++); ans=max(ans,z); } } void write(){ printf("%d",ans); } int main(){ init(); pre(); work(); write(); return 0; }
相关文章推荐
- Unity Action Game Demo(1)
- 观 GT Java语言管理系统的感悟
- Codeforces Gym 100203H Highways 最小生成树
- 《大型网站技术架构:核心原理与案例分析》读书笔记 - 网站的技术升级路线
- 病毒侵袭(我的第二道AC自动机(模板进一步升级完善))
- Java中堆内存和栈内存详解
- cocos2d-x开发日志07 —— 触摸处理
- Java字符串处理函数
- 设计原则之接口隔离原则(ISP)
- 使用ThreadSanitizer线程检查工具
- Odoo 养猪
- python 机器学习之kNN算法
- 求逆序对
- 构建Apache Tomcat 6.0 Servlet/JSP 容器
- Oracle中dual表的用途介绍
- TCP协议中的三次握手和四次挥手
- 黑马程序员----IO流(字符流、字节流、转换流)
- Matlab下一个SVM例子
- HDU 5172 pairs
- hdoj2037今年暑假不AC