Codeforces 5E Bindian Signalizing 题解
来源:互联网 发布:即时通信软件排行 编辑:程序博客网 时间:2024/06/08 10:29
题意
有一个城市被山环绕,人们都住在美丽的山上,每座山上都有一个监察者,维护人们的安全,当有危险的时候,一个监察者会立即点火作为信号,引起其他监察者注意,一个监察者能看到另一个监察者发出的信号当且仅当连接他们的圆弧中间的山没有一座山是高过这两个观察者所在的山中的任意一座的。因为对于任意两座山都有两条弧将他们相连,所以当至少有一个弧满足之前那个条件时,一个监察者就可以看到另一个监察者的信号。一个城市的安全系数就是有多少对监察者满足互相可以看到对方信号,求这个城市的安全系数
思路
首先将问题转化到直线上,我们选取最高的一座山(如果有多个就随便选一个),以它为头重排序列,然后再复制一份最高的山到结尾。考虑一对山,我们让高度较小的那一座(如果有多个就是位置最靠左那个)负责贡献答案。对每一座山,我们需要考虑3个值l[i]左边第一座比它高的山的位置,r[i]右边第一座比它高的山的位置,c[i]表示在它右边有多少山跟它一样高,这三个可以递推得到,那么每座山对于答案的贡献起码会有c[i],对于非最高的山,还可以再加两对,就是(x,l[x])和(x,r[x]),不过需要注意如果l[x]=0且r[x]=n时实际只是一对
代码
#include <cstdio>long long h[1000001],hh[1000001],c[1000001],r[1000001],l[1000001];int main(){ long long n,maxx,maxi,ans; scanf("%lld",&n); for(long long i=0;i<n;i++) scanf("%lld",&h[i]); maxi=0; maxx=h[0]; for(long long i=1;i<n;i++) if(h[i]>maxx) { maxx=h[i]; maxi=i; } for(long long i=0;i<n;i++) hh[i]=h[(maxi+i)%n]; hh[n]=hh[0]; c[n]=0; for(long long i=n-1;i>=0;i--) { r[i]=i+1; while(r[i]<n&&hh[i]>hh[r[i]]) r[i]=r[r[i]]; if(r[i]<n&&hh[i]==hh[r[i]]) { c[i]=c[r[i]]+1; r[i]=r[r[i]]; } } l[0]=0; for(long long i=1;i<=n;i++) { l[i]=i-1; while(l[i]>0&&hh[i]>=hh[l[i]]) l[i]=l[l[i]]; } ans=0; for(long long i=0;i<n;i++) { ans+=c[i]; if(hh[i]<hh[0]) { if(l[i]==0&&r[i]==n) ans++; else ans+=2; } } printf("%lld\n",ans); return 0;}
阅读全文
0 0
- Codeforces 5E Bindian Signalizing 题解
- codeforces 5E Bindian Signalizing
- Codeforces 5E Bindian Signalizing
- Codeforces 5E. Bindian Signalizing
- codeforces 5E Bindian Signalizing
- Codeforces E.Bindian Signalizing
- Codeforces Beta Round #5 E. Bindian Signalizing
- codeforces 5.E. Bindian Signalizing
- CF 5 E. Bindian Signalizing
- 2017京东笔试编程题-保卫方案 | Codeforces Beta Round #5 E.Bindian Signalizing
- E. Bindian Signalizing (拆环成链)(好题)
- CF5E Bindian Signalizing
- Codeforces5E - Bindian Signalizing
- Codeforces 165E Compatible Numbers 题解&代码
- Codeforces 7E Defining Macros 题解
- Codeforces 808E Selling Souvenirs 题解
- 【codeforces 733E】Sleep in Class 题解
- Codeforces 526E Transmitting Levels 题解
- 数据库常见面试题
- Linux的SOCKET编程详解——非常叼
- 决策树算法学习笔记(二)
- 我的学习之路_第十六章_xml
- DICOM靶区头文件解析
- Codeforces 5E Bindian Signalizing 题解
- 调整表格的行间距
- 剖析ActivityManagerService源码,了解广播接收和发送机制(二)
- 静态代码块
- 《需求分析》 --- 读书笔记
- 循环队列
- Linux+Anaconda+ tensorflow + keras 安装
- 自增自减
- Java多线程与并发学习之(二):创建线程的方式