hdu 6058 Kanade's sum
来源:互联网 发布:java web基础知识书籍 编辑:程序博客网 时间:2024/06/14 03:45
题意:
找到 l (1~n ) r(l~n)的第k大的和。
思路:
当时想明白了。没写对。。看了下别人代码。。模拟链表。
先每次找到最小值,然后访问左侧和右侧,乘起来之后,更新左侧右侧指针。
#include <stdio.h>#include <algorithm>#include <cstring>using namespace std;const int maxn=500005;int nxt[maxn],pre[maxn];int id[maxn],pos[maxn];int l[maxn],r[maxn];int k,n;long long solve(int x){ int left=0,right=0; for(int i=x;i!=0&&left<=k;i=pre[i]) { l[++left]=i-pre[i]; } for(int i=x;i<=n&&right<=k;i=nxt[i]) { r[++right]=nxt[i]-i; } long long ans=0; for(int i=1;i<=left ;i++) { if(k-i+1<=right&&k-i+1>=1) ans+=(l[i]*r[k-i+1]); } return ans;}void del(int x){ pre[nxt[x]]=pre[x]; nxt[pre[x]]=nxt[x];}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); int x; for(int i=1;i<=n;i++) { scanf("%d",&x),id[x]=i; } pre[0]=0,nxt[n+1]=n+1; nxt[0]=1,pre[n+1]=n; for(int i=1;i<=n;i++) { pre[i]=i-1; nxt[i]=i+1; } long long ans=0; for(int i=1;i<=n;i++) { ans+=(long long )i*(solve(id[i])); del(id[i]); } printf("%lld\n",ans); }}
阅读全文
0 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
- HTTP 长连接和短连接是什么?
- [Leetcode] 328. Odd Even Linked List 解题报告
- iOS 利用Router机制进行动态页面跳转
- Equilibrium Mobile UVA
- Bitmap内存优化
- hdu 6058 Kanade's sum
- for语句
- 8.2 数据结构
- easyui文件的上传和下载,从页面到后台
- RMQ ST算法模板
- 廖雪峰《python3 基础教程》读书笔记——第五章
- Java中的向上转型和向下转型
- 构造函数的调用规则
- JavaScript 中的闭包