【2017 Multi-University Training Contest - Team 3】Kanade's sum
【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的更多相关文章
- 2017 Multi-University Training Contest - Team 3—HDU6058 Kanade's sum
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题目意思:给你一个排列,求所有区间长度大于等于k的区间第k大的数的和…… 思路:一开始看到区间k ...
- 【2017 Multi-University Training Contest - Team 2】TrickGCD
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...
- 【2017 Multi-University Training Contest - Team 2】Maximum Sequence
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...
- 【2017 Multi-University Training Contest - Team 2】 Regular polygon
[Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...
- 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?
[Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Competition
[Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...
- 【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 ...
- 【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= ...
- 【2017 Multi-University Training Contest - Team 4】Time To Get Up
[Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...
随机推荐
- NodeJS学习笔记 进阶 (3)Nodejs 进阶:Express 常用中间件 body-parser 实现解析(ok)
个人总结:Node.js处理post表单需要body-parser,这篇文章进行了详细的讲解. 摘选自网络 写在前面 body-parser是非常常用的一个express中间件,作用是对http请求体 ...
- 一次Linux LVM VG丢失完整找回过程记录
某客户的一台PC服务器连接了一台HP EVA 的FC SAN存储,划了一个6T的LUN分作一个单独的VG使用,在某一次异常掉电之后,发现该VG完全丢失,使用vgs/pvs/lvs命令均无法找到此VG及 ...
- Unity Shader (四)片段程序示例
1.环境光+漫反射+高光+点光源 Shader "Custom/Example_Frag_1" { properties { _MainColor(,,,) _Specular ...
- 洛谷 P1703 那个什么密码2
P1703 那个什么密码2 题目背景 https://www.luogu.org/problem/show?pid=1079 题目描述 与原题一模一样.具体不同请见输入格式 输入输出格式 输入格式: ...
- 安装Signavio Web设计器
在Jbpm3版本号中,这个著名的开源项目并没有基于浏览器的图形化流程设计器,结果导致流程设计一直停留在CS阶段. 比方我之前做过的一个OA项目.项目中採用的就是Jbpm3.因为它不支持在浏览器中的图形 ...
- vue2.0 vue-loader
vue-cli npm install 脚手架: vue-loader 1.0 -> new Vue({ el: '#app', components:{App} }) 2.0-> new ...
- Cisco交换机解决网络蠕虫病毒入侵问题
Cisco交换机解决网络蠕虫病毒入侵问题 今年来网络蠕虫泛滥给ISP和企业都造成了巨大损失,截至目前已发现近百万种病毒及木马.受感染的网络基础设施遭到破坏,以Sql Slammer为 ...
- Android 使用Retrofit获取JSON数据
在大家使用网络请求的时候,往往会出现一种情况:需要拿到服务器返回来的JSON字符串,而Retrofit会默认将Json解析,而又没有直接暴露出拿到Json字符串的方法: 今天测接口的时候,发现当数据正 ...
- JSP中 input type 用法
JSP中 input type 用法 Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=te ...
- 实现人脸识别性别之路---open CV将图片显示出来
import cv2filename='E:\\tensorflow\\bu.jpg'#图片的地址 # face_cascade=cv2.CascadeClassifier('C:\\anconda3 ...