【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6058

【Description】



给你n个数;

它们是由(1..n)组成的排列;

然后给你一个数字k;

让你求这个序列的所有长度大于等于k的区间的第k大值的和;

【Solution】



数组模拟链表;

我们从小到大枚举数字x,寻找以x为第k大的数字的区间有多少个;

数组中只保留了了大于等于x的数字的信息

(即每次做完数字x为第k大的区间之后,把x删掉);

每次在做x的时候;

在x的左半部分找最近的比它大的k-1个数字,

然后从那第k-1个数字开始,将其位置设置为L,然后初始时刻,右端点位置R设置为x的位置;

因为模拟链表的数组中,存放的都是大于等于x的数字

所以当前的(L..R)这一段的第k大值肯定是数字x的;

(这时设L再往左跳一次会到达tL,R向右跳一次会到达tR);

(则答案加上x*(L-tL)*(tR-R),因为tL+1..L中任意一个数字作为区间左端点,R..rR-1中任意一个数字作为区间右端点,这些区间的k大值都是x)

然后左端点L肯定不能再往左移动了,不然x就不是第k大数了;

于是L往右移动一次;

同时R也跟着往右移动一次

(中间小于x的数字已经在之前的操作中删掉了,可以直接跳到下一个大于等于x的数字)

这样就能保证(L+1,R+1)这段区间也满足x是k大值;

再用上面的增加答案的方法增加答案就好;

直到L变成x为止

可能x左边没有k-1个大于它的数字;

那么就不用找那么多;

然后R提前先往右跳缺少(即却几次才够k-1个数字)次就好;



【NumberOf WA】



1



【Reviw】



利用链表这一工具,快速获取左边和右边最近的若干个大于某个数的位置;

再思考一下如何固定x为第k大值;

再利用乘法原理求出区间个数;

每个区间对答案贡献一样.

从而求出答案;



【Code】

#include <bits/stdc++.h>
using namespace std;
#define LL long long const int N = 5e5; int n,T,k,a[N+100],b[N+100][2],pos[N+100]; void del(int x){
int pre = b[x][0],after = b[x][1];
b[pre][1] = after;
b[after][0] = pre;
} int main(){
scanf("%d",&T);
while (T--){
LL ans = 0;
scanf("%d%d",&n,&k);
for (int i = 1;i <= n;i++){
scanf("%d",&a[i]),b[i][0] = i-1,b[i][1] = i+1;
pos[a[i]] = i;
} for (int x = 1;x <= n;x++){
int i = pos[x],cntr = 0;
for (int j = 1;j <= k-1;j++){
int ti = b[i][1];
if (ti > n) break;
cntr++;
i = ti;
} int l = pos[x];
for (int j = 1;j <= (k-1-cntr);j++)
l = b[l][0]; for (int j = i;j >= pos[x] && l;j = b[j][0],l = b[l][0])
ans += 1LL*x*(l-( (b[l][0]) > 0 ? b[l][0]:0))*
( (b[j][1] > n? (n+1):b[j][1]) - j);
del(pos[x]);
} printf("%lld\n",ans);
}
return 0;
}

【2017 Multi-University Training Contest - Team 3】Kanade's sum的更多相关文章

  1. 2017 Multi-University Training Contest - Team 3—HDU6058 Kanade's sum

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题目意思:给你一个排列,求所有区间长度大于等于k的区间第k大的数的和…… 思路:一开始看到区间k ...

  2. 【2017 Multi-University Training Contest - Team 2】TrickGCD

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...

  3. 【2017 Multi-University Training Contest - Team 2】Maximum Sequence

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...

  4. 【2017 Multi-University Training Contest - Team 2】 Regular polygon

    [Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...

  5. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?

    [Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...

  6. 【2017 Multi-University Training Contest - Team 5】Rikka with Competition

    [Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...

  7. 【2017 Multi-University Training Contest - Team 5】Rikka with Subset

    [Link]: [Description] 给你a数组的n个数的所有2^n个子集的2^n个子集元素的和; 子集元素的和最大为m; 告诉你各个子集元素的和出现的次数; 如 1 2 则0出现1次,1出现1 ...

  8. 【2017 Multi-University Training Contest - Team 5】Rikka with Graph

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6090 [Description] 给你n个点; 让你在这n个点上最多连m条无向边; 使得 ∑ni= ...

  9. 【2017 Multi-University Training Contest - Team 4】Time To Get Up

    [Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...

随机推荐

  1. SPFA的小优化

    标签:闲扯 SPFA的小优化 1. 向队尾加入元素时,如果它比对首还优,就把把它直接和队首交换. 拿一个双端队列来实现 (手写 , head ,tail   STLdeque亲测及其慢) 这个小优化其 ...

  2. Java Web Application——servlet

    概述 是一个部署于web服务器中的实现了servlet接口的Java类,用于响应web请求 Web容器(也称为servlet容器)本质上是与servlet交互的Web服务器的组件.Web容器负责管理s ...

  3. 钓鱼WIFI的防范

    实际上,Wi-Fi接入点(AP).路由器和热点常常是高度暴露的攻击面.用户一不小心就有可能踏进攻击者设置的Wi-Fi陷阱,为企业造成信息泄露或经济损失. 如今Wi-Fi 6时代悄然到来,为高密海量无线 ...

  4. crm使用soap删除字段

    //C# 代码: //DeleteAttributeRequest request = new DeleteAttributeRequest(); //request.EntityLogicalNam ...

  5. DF标志和串移动指令(movsb/movsw)

    1.标志寄存器的第10位DF,方向标志位.在串处理指令中,控制每次操作后si,di的增减 DF=0,每次操作后,si.di添加 DF=1,每次操作后,si.di减小 我们能够用汇编语法描写叙述movs ...

  6. 简述SQL with(unlock)与with(readpast)

    所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...

  7. Chromium Graphics : GPU Accelerated Compositing in Chrome

    GPU Accelerated Compositing in Chrome Tom Wiltzius, Vangelis Kokkevis & the Chrome Graphics team ...

  8. LINUX中,find结合grep正则表达式,快速查找代码文件。

    ###目的###LINUX中,find结合grep正则表达式快速查找代码. 例如经常有需求:查找当前目录下所有.h文件中,"public开头,中间任意字符,以VideoFrameReceiv ...

  9. Felx之菜单导航

    Felx之菜单导航 环境搭建:MyEclipse 6.5+Flex Builder 3 Plug-in <?xml version="1.0" encoding=" ...

  10. javaScript [[scope]]学习笔记

    在javaScript 学习中,闭包肯定是一个让人头疼的问题,而闭包必定离不开[[scope]]作用域 scope存储了执行期上下文的集合 而了解scope以及scope链又是一个十分抽象的问题 我们 ...