CF5E Bindian Signalizing
题目
这题目是真的很水,洛谷给他紫题也差不多算恶意评分了吧233
这种一眼切的题改了很长时间,不是什么n-1搞错,就是什么and打成or,所以写这篇博客给自己长个记性QWQ
题意:n座山组成一个环,相连的圆弧上其他山它们高那么这两座山能互相看到,求能看到的山的组数。
题解:设left[i]表示左边第一个比i高的位置,同理right[i]表示右边第一个比i高的位置。count[i]表示i到right[i]区间(i不在区间内,right[i]在)内高度等于i的山的个数。
注意要用long long
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000010;
long long ans;
int n, p;
int leftt[MAXN], rightt[MAXN], a[MAXN], b[MAXN], countt[MAXN];
inline int read() {
char ch; bool f = false; int res = 0;
while (((ch = getchar()) < '0' || ch > '9') && ch != '-');
if (ch == '-') f = true; else res = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') res = (res << 3) + (res << 1) + ch - '0';
return f? ~res + 1 : res;
}
int main() {
n = read();
for (int i = 0; i < n; ++ i) {
a[i] = read();
}
p = 0;
for (int i = 1; i <= n; ++ i) //find max
if (a[i] > a[p])
p = i;
for (int i = 0; i <= n; ++ i) // link
b[i] = a[(i + p) % n];
for (int i = 1; i <= n; ++ i) {
leftt[i] = i - 1;
while (leftt[i] && b[i] >= b[leftt[i]])
leftt[i] = leftt[leftt[i]];
//printf("%d\n",leftt[i]);
}
for (int i = n - 1; i >= 0; i --) {
rightt[i] = i + 1;
while (rightt[i] < n && b[i] > b[rightt[i]])
rightt[i] = rightt[rightt[i]];
if (rightt[i] < n && b[i] == b[rightt[i]]) {
countt[i] = countt[rightt[i]] + 1;
rightt[i] = rightt[rightt[i]];
}
}
for (int i = 0; i < n; ++ i) {
ans += countt[i];
if (b[i] < b[0]) {
ans += 2;
if (!leftt[i] && rightt[i] == n)
ans --;
}
//printf("%lld\n", ans);
}
printf("%lld\n", ans);
return 0;
}
CF5E Bindian Signalizing的更多相关文章
- Codeforces Beta Round #5 E. Bindian Signalizing 并查集
E. Bindian Signalizing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...
- CF5E 【Bindian Signalizing】
题意 \(n\)座山组成一个环,相连的圆弧上其他山它们高那么这两座山能互相看到,求能看到的山的组数. 题解 设\(left[i]\)表示左边第一个比\(i\)高的位置,同理\(right[i]\)表示 ...
- 【单调栈】【CF5E】 Bindian Signalizing
传送门 Description 给你一个环,环上有一些点,点有点权.定义环上两点能相互看见当且仅当两点间存在一个弧使得弧上不存在一个点的点权大于着两个点.求一共有多少个点能互相看到 Input 第一行 ...
- 「CF5E」Bindian Signalizing
传送门 Luogu 解题思路 很显然的一点,任何一条可能成为路径的圆弧都不可能经过最高的点,除非这条路径全是最高点. 所以我们先把最大值抠掉,把剩下的按原来的顺序排好. 从前往后.从后往前扫两次,用单 ...
- codeforces 5E(非原创)
E. Bindian Signalizing time limit per test 4 seconds memory limit per test 256 megabytes input stand ...
- CF5E-Bindian Signalizing【单调栈】
正题 题目链接:https://www.luogu.com.cn/problem/CF5E 题目大意 圆上有\(n\)个山,两个山之间可以看到当且仅当它们之间的两条弧中有一条满足所有山都不高于它们两个 ...
- CodeForces5E 环转链,dp思想
http://codeforces.com/problemset/problem/5/E 众所周知,在很久以前,在今天的 Berland 地区,居住着 Bindian 部落.他们的首都被 n 座山所环 ...
随机推荐
- Windows WMIC命令使用详解(附实例)
第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在WMIC命令行提示符上,命令以交互的方式执行 执行“wmic”命令启动WMIC命令行环境.这个命令可以在 ...
- Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】
在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着.目前,Marek Szyprow ...
- python ----面向对象的三大特性---多态
多态 多态 不同的子类对象调用相同的父类方法,产生不同的执行结果. 以继承和重写父类方法为前提
- 一、Windows Server 2016 AD服务器搭建
简介: AD是Active Directory的简写,中文称活动目录.活动目录(Active Directory)主要提供以下功能: 1)服务器及客户端计算机管理 2)用户服务 3)资源管理 4)桌面 ...
- 既然CPU同一时间只能执行一个线程,为什么存在并发问题
一点小疑惑终于解开啦 1.CPU的时间是按时间片分的,而不是一个时间点,并发问题是由于CPU线程切换导致的. 现在假设有一段代码 if(i == 1) { i++; //断点1 system.out. ...
- Python面试常见的问题
So if you are looking forward to a Python Interview, here are some most probable questions to be ask ...
- 数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
https://blog.csdn.net/qq_31125793/article/details/51241943 背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推 ...
- spring上下文和springMVC上下文的关系
查看原文
- 无post按钮提交表单
<form id="form1" name="form" action="url" method="GET"> ...
- linux命令之:yum
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...