HDU 6058 Kanade's sum 链表+枚举
来源:互联网 发布:java查询oracle数据库 编辑:程序博客网 时间:2024/05/23 12:23
题意是说给出n个数,这n个数为[1,n]打乱顺序放入,求出这些数构成的所有区间的第k大数的和。
要直接去做肯定不行,比赛时候主席树、找规律各种方法都用上还是TLE没能过,比完赛之后看标程才知道这题可以用链表来存储做这道题目。
首先读入数据,然后记录每一个数的位置,用数组来构建一个双向链表,然后从1开始找,因为1是最小的,所以往左往右找数,只要构成一个长度为k的区间,1就是第k大的数。之后将1从删掉,再去找2,依然往两边去扩散区间,为了防止1删去的影响,应用他们的位置相减来得到结果,一直找到n-k+1,就能得到所有数的结果。
程序中用pos数组来记录位置,pre和np是用来模拟双向链表的过程进行指向,之后的t和s数组来记录下位置,之后往左寻找x个数,则就是要往右找k-x-1个数。
下面AC代码:(基本是改于标程= =)
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[1000005];int pos[1000005];int s[1000005];int t[1000005];int pre[1000005];int np[1000005];int n;int eras(int x){ int pp=pre[x]; int nn=np[x]; if(pre[x]) np[pre[x]]=nn; if(np[x]<=n) pre[np[x]]=pp; pre[x]=np[x]=0; return 0;}int main(){ int T; int i,j,d; long long ans; int k; int p; int ss,tt; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); memset(pre,0,sizeof(pre)); memset(np,0,sizeof(np)); for(i=1;i<=n;i++) { scanf("%d",&a[i]); pos[a[i]]=i; } for(i=1;i<=n;i++) { pre[i]=i-1; np[i]=i+1; } ans=0; for(j=1;j<=n-k+1;j++) { p=pos[j]; ss=tt=0; for(d=p;d!=0&&ss<=k+1;d=pre[d]) { ss++; s[ss]=d; } for(d=p;d!=n+1&&tt<=k+1;d=np[d]) { tt++; t[tt]=d; } ss++; tt++; s[ss]=0; t[tt]=n+1; for(i=1;i<=ss-1;i++) { if(k+1-i<=tt-1&&k+1-i>=1) { ans+=(long long)(t[k+1-i+1]-t[k+1-i])*(long long)(s[i]-s[i+1])*(long long)j; //cout<<ans<<"+=(long long)("<<t[k+1-i+1]<<"-"<<t[k+1-i]<<")*(long long)("<<s[i]<<"-"<<s[i+1]<<")*"<<j<<endl; } } eras(p); } cout<<ans<<endl; } return 0;}
阅读全文
1 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-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
- 命令行参数
- pandas入门——数据转换
- bit、byte、位、字节、汉字、字符之间的区别
- Web内容回顾
- yii POST提交 Bad Request (#400)---Unable to verify your data submission的错误解决方法
- HDU 6058 Kanade's sum 链表+枚举
- 2017 Multi-University Training Contest
- ACM集训日记-8月2日
- 【mysql优化 2】索引条件下推优化
- 每日一题(11)—— 结构体大小
- JS的 try catch使用心得
- N
- QT UI显示中文的三种方法
- ORACLE数据库-数据控制语言DCL