题解:

发现是一个环,而环的题目有一些就是要转化成为链

首先找到一个最高点,中间断开

然后当作一条链来做

代码:

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int N=+;
int a[N],b[N],left[N],right[N],same[N],sta[N],bz[N];
int i,j,k,l,t,n,m,mx,top;
ll ans;
int read()
{
int x=;
char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x;
}
int main()
{
n=read();
fo(i,,n)
{
a[i]=read();
if (!mx||a[i]>a[mx]) mx=i;
}
fo(i,mx,n) b[++top]=a[i];
fo(i,,mx-) b[++top]=a[i];
fo(i,,n) a[i]=b[i];
top=;
fo(i,,n)
{
while (top&&a[i]>=a[sta[top]]) top--;
left[i]=sta[top];
sta[++top]=i;
}
top=;
sta[]=n+;
fd(i,n,)
{
while (top&&a[i]>=a[sta[top]])
{
if (a[i]==a[sta[top]]) same[i]=same[sta[top]]+;
top--;
}
right[i]=sta[top];
sta[++top]=i;
}
fo(i,,n)
{
if (left[i]>) ans++;
if (right[i]<=n) ans++;
ans+=(ll)same[i];
}
mx=;
fo(i,,n)
{
if (mx<=a[i]) bz[i]=;
mx=max(mx,a[i]);
}
mx=;
fd(i,n,)
{
if (mx<=a[i]) bz[i]=;
mx=max(mx,a[i]);
}
fo(i,,n) ans+=bz[i];
printf("%I64d\n",ans);
}

51nod1482的更多相关文章

  1. [51nod1482]部落信号 单调栈

    ~~~题面~~~ 题解: 可以发现这是一道单调栈的题目,首先来考虑数字没有重复时如何统计贡献. 因为这是一个环,而如果我们从最高的点把环断开,并把最高点放在链的最后面(顺时针移动),那么因为在最高点两 ...

随机推荐

  1. weka中算法说明[转]

    1) 数据输入和输出WOW():查看Weka函数的参数.Weka_control():设置Weka函数的参数.read.arff():读Weka Attribute-Relation File For ...

  2. 使用caffe训练自己的图像数据(未完)

    参考博客:blog.csdn.net/drrlalala/article/details/47274549 1,首先在网上下载图片,猫和狗.直接保存下载该网页,会生成一个有图片的文件夹.caffe-m ...

  3. HDU 2222 Keywords Search(AC自动机模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出多个单词,最后再给出一个模式串,求在该模式串中包含了多少个单词. 思路: AC自动机的模板题. ...

  4. POJ 3628 Bookshelf2(0-1背包)

    http://poj.org/problem?id=3628 题意:给出一个高度H和n个牛的高度,要求把牛堆叠起来达到H,求出该高度和H的最小差. 思路:首先我们计算出牛的总高度sum,sum-H就相 ...

  5. Java jdbc访问sqlserver,oracle数据库 DEMO

    1.JDBC访问Oracle数据库 public class Jdbc_Oracle { // 静态代码块,只会执行一次,类似C#静态构造方法 static { try { // 加载数据库驱动一次 ...

  6. shell 循环总结

    #!/bin/bash my_arry=(a b "c","d" abc) echo "-------FOR循环遍历输出数组--------" ...

  7. ubuntu 14.04 添加、删除用户,修改用户名称,修改主机名

    ubuntu添加用户 sudo adduser test ubuntu删除用户 sudo userdel test cd /home/ sudo rm -r test

  8. c++ 对符合条件的元素进行计数(count_if)

    #include <iostream> // cout #include <algorithm> // count_if #include <vector> // ...

  9. C++异常及捕获_01

    ZC: Win7x64 + qt-opensource-windows-x86-msvc2010_opengl-5.3.2.exe 1. class AA { public: void A() { & ...

  10. linux c/c++ 删除文件

    linux c/c++ 删除文件 #include <stdio.h> int FileRemove(const char* fname) { return remove(fname); ...