HDU6058 [2017多校联合3] Kanade's sum 我可能是个假链表
2017-08-02 21:07
519 查看
Kanade's sumhttp://acm.hdu.edu.cn/showproblem.php?pid=6058
题意:给array A[1..n],定义f(l,r,k)为区间A[l..r]中第k大的元素
(当[l..r]中元素不满足k个时,f()=0),计算∑nl=1∑nr=lf(l,r,k)
分析:计算所有可组成的连续区间中,第k大的元素之和
等价于==>对每一元素,当它为第k大时所在的区间个数*它本身(A[1..n]是数字从1到n的排列)
Sample Imput
1
5 2
1 2 3 4 5
Sample Output
30【=1(1,2)+2*2(2,3),(1,2,3)+3*3(3,4),(2,3,4),(1,2,3,4)+4*4(4,5),(3,4,5),(2,3,4,5),(1,2,3,4,5)】
题意:给array A[1..n],定义f(l,r,k)为区间A[l..r]中第k大的元素
(当[l..r]中元素不满足k个时,f()=0),计算∑nl=1∑nr=lf(l,r,k)
分析:计算所有可组成的连续区间中,第k大的元素之和
等价于==>对每一元素,当它为第k大时所在的区间个数*它本身(A[1..n]是数字从1到n的排列)
Sample Imput
1
5 2
1 2 3 4 5
Sample Output
30【=1(1,2)+2*2(2,3),(1,2,3)+3*3(3,4),(2,3,4),(1,2,3,4)+4*4(4,5),(3,4,5),(2,3,4,5),(1,2,3,4,5)】
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=500009; int T,n,k,a[maxn],pos[maxn],pre[maxn],np[maxn]; int s[maxn],t[maxn]; long long ans=0; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); pos[a[i]]=i;//记录元素位置 pre[i]=i-1;//链表前驱 np[i]=i+1;//链表后继 } ans=0; int s0=0,t0=0; for(int num=1;num<=n-k+1;num++)//枚举可能成为第k大的数[1..n-k+1] { int p=pos[num];//元素num的位置 //??? s0=0,t0=0; //寻找前后k个比它大的数 for(int i=p;i&&s0<=k+1;i=pre[i]) s[++s0]=i; for(int j=p;j<=n&&t0<=k+1;j=np[j]) t[++t0]=j; //首尾额外添加两个无限大的数 s[++s0]=0; t[++t0]=n+1; for(int i=1;i<=s0-1;i++) { int tmp=k-i+1; if(tmp<=t0-1&&tmp>0) ans+=(s[i]-s[i+1])*1LL*(t[tmp+1]-t[tmp])*num; //*1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量 } //从链表中将此数删除 int tpre=pre[p]; int tnp=np[p]; if(tpre) np[tpre]=tnp; if(tnp<=n) pre[tnp]=tpre; pre[p]=np[p]=0; //??? } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- HDU 2017 多校联合训练赛3 3003 6058 Kanade's sum 枚举 模拟链表
- (2017多校训练第三场)HDU - 6058 Kanade's sum 链表
- HDU6058 Kanade's sum(链表)
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- 2017 多校训练第三场 HDU 6058 Kanade's sum
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- 2017多校联合第三场 1003题 hdu 6058 Kanade's sum 链表
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- 2017第三次多校联合hdu6058
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- HDU-6058 Kanade's sum - 2017 Multi-University Training Contest - Team 3(思维+模拟链表)
- 2017 Multi-University Training Contest - Team 3 1003(hdu 6058) Kanade's sum(链表)(set)
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- 2017 Multi-University Training Contest 3 && HDOJ 6058 Kanade's sum 【链表模拟】
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- 2017杭电多校第三场 1003 Kanade's sum(hdu6058 区间内第k大)
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- 【HDU6058】Kanade's sum(暴力 or 链表)