Kanade's sum(hdu 6058)
来源:互联网 发布:java template 编辑:程序博客网 时间:2024/06/06 23:56
Let
Specially ,
Give you
There are T test cases.
For each test case,there are only two integers
15 21 2 3 4 5
30
题目大意:把一个数组分成若干子部分,求每部分中第k大的数的和是多少?
比较详细的解释:点击打开链接
#include <iostream>#include <bits/stdc++.h>using namespace std;int a[500005],lef[500005],righ[500005];typedef long long ll;int main(){ int T; scanf("%d",&T); while(T--) { int n,k,x; scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) { scanf("%d",&x); a[x]=i; lef[i]=0; righ[i]=n+1; } set<int>s; set<int>::iterator ite; lef[n+1]=0; righ[n+1]=n+1; s.insert(0); s.insert(n+1); ll ans=0; int r; for(int i=n; i>0; i--) { s.insert(a[i]); ite=s.find(a[i]); ite++; r=*ite; int l=lef[r]; lef[r]=a[i]; righ[a[i]]=r; righ[l]=a[i]; lef[a[i]]=l; if(n-i+1<k) continue; int nowl=a[i]; for(int j=1; j<=k&&nowl; j++) nowl=lef[nowl]; int nowr=nowl; for(int j=1; j<=k&&nowr!=n+1; j++) nowr=righ[nowr]; for(int j=1; j<=k; j++) { if(nowl==a[i]||nowr==n+1) break; int nextl=righ[nowl]; int nextr=righ[nowr]; ans+=(ll)(nextl-nowl)*(nextr-nowr)*i; // cout<<ans<<" "; //cout<<"_____________"<<endl; nowl=nextl; nowr=nextr; } } printf("%lld\n",ans); } return 0;}
- HDU-6058 Kanade's sum
- hdu 6058 Kanade's sum
- hdu 6058 Kanade's sum
- hdu 6058 Kanade's sum
- hdu 6058 Kanade's sum
- hdu 6058 Kanade's sum
- [HDU]6058 Kanade's sum
- hdu 6058 Kanade's sum
- hdu--6058Kanade's sum
- Kanade's sum HDU 6058
- HDU 6058 Kanade's sum
- Kanade's sum(hdu 6058)
- HDU 6058 Kanade's sum
- HDU 6058 Kanade's sum
- hdu 6058 Kanade's sum
- hdu 6058 Kanade's sum
- HDU 6058 Kanade's sum
- HDU 6058 Kanade's sum
- Spring学习(二)
- 菱形继承
- Android实现滑动悬浮置顶效果
- smb|ftp|nfs共享网络磁盘
- 动态获取权限工具类及其使用
- Kanade's sum(hdu 6058)
- 选择器
- Spring Aspect j
- 微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
- 《YOLO9000:Better,Faster,Stronger》笔记
- CoordinatorLayout中的大坑
- [Java] Java读取图片中的地理坐标(一)
- Unity5.x 全局光照系统问题下
- java中使用IO将文件切割后保存(FileInputStream、FileOutputStream)