bzoj1660[Usaco2006 Nov]Bad Hair Day 乱发节*
bzoj1660[Usaco2006 Nov]Bad Hair Day 乱发节
题意:
给一个序列a,令ci=ai+1到an第一个比ai大的位置j与i的距离。求sigma(i,1,n)ci。
题解:
用一个递减的单调栈维护。注意最后答案要开long long。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 80100 5 using namespace std; 6 7 inline int read(){ 8 char ch=getchar(); int f=1,x=0; 9 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 10 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 11 return f*x; 12 } 13 int n,a[maxn],x[maxn],y[maxn],sz; long long ans; 14 int main(){ 15 n=read(); for(int i=1;i<=n;i++)a[i]=read(); x[0]=0x3fffffff; y[0]=n+1; sz=0; 16 for(int i=n;i>=1;i--){while(a[i]>x[sz])sz--; ans+=(y[sz]-i-1); x[++sz]=a[i]; y[sz]=i;} 17 printf("%lld",ans); return 0; 18 }
20160804