acm.hdu.edu.cn/showproblem.php?pid=6058

【题意】

  • 给定一个排列,计算

【思路】

  • 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k大,那么ai对答案的贡献就是ai*ni
  • 以ai为起点,统计ai右边离ai最近的,比ai大的k个数的位置
  • 同理统计左边的位置,组合得到答案
  • 关键是得到比ai大的离ai最近的k个数的位置
  • 因为是排列,所以每个数都不相等,可以记录每个数的位置,然后从小到大枚举ai,这样维护一个双向链表,保证链表中的数就是满足条件的离ai最近的比ai的数
  • 每次处理ai之后把ai从链表中删除,这样处理ai+1时链表中就都是比ai大的数
  • 删除操作是O(1),总的时间复杂度是O(nk)

【Acceped】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<stack>
  9. #include<map>
  10. using namespace std;
  11. const int maxn=5e5+;
  12. typedef long long ll;
  13. int a[maxn];
  14. int p[maxn];
  15. int pre[maxn];
  16. int nxt[maxn];
  17. int b[maxn];
  18. int c[maxn];
  19. int n,k;
  20. int main()
  21. {
  22. int T;
  23. scanf("%d",&T);
  24. while(T--)
  25. {
  26. scanf("%d%d",&n,&k);
  27. for(int i=;i<=n;i++)
  28. {
  29. scanf("%d",&a[i]);
  30. p[a[i]]=i;
  31. pre[i]=i-;
  32. nxt[i]=i+;
  33. }
  34. ll ans=;
  35. for(int i=;i<=n;i++)
  36. {
  37. ll num=;
  38. int pos=p[i];
  39. int cntr=,cntl=;
  40. for(int j=pos;j<=n&&cntr<k;j=nxt[j])
  41. {
  42. b[cntr++]=nxt[j]-j;
  43. }
  44. for(int j=pos;j>=&&cntl<k;j=pre[j])
  45. {
  46. if(k--cntl>=cntr)
  47. {
  48. cntl++;
  49. continue;
  50. }
  51. else
  52. {
  53. c[cntl]=j-pre[j];
  54. num+=b[k--cntl]*c[cntl];
  55. cntl++;
  56. }
  57.  
  58. }
  59. ans+=num*i;
  60. nxt[pre[pos]]=nxt[pos];
  61. pre[nxt[pos]]=pre[pos];
  62. }
  63. printf("%lld\n",ans);
  64. }
  65. return ;
  66. }

链表

【链表】2017多校训练三 HDU 6058 Kanade's sum的更多相关文章

  1. 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing

    acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...

  2. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  3. hdu 6058 Kanade's sum(模拟链表)

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. HDU 6058 Kanade's sum 二分,链表

    Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...

  5. 2017ACM暑期多校联合训练 - Team 3 1003 HDU 6058 Kanade's sum (模拟)

    题目链接 Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest elem ...

  6. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

  7. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

  8. 【双向bfs】2017多校训练十 HDU 6171 Admiral

    [题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...

  9. HDU 6058 Kanade's sum —— 2017 Multi-University Training 3

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

随机推荐

  1. azkaban web ui界面出现异常诡异“丑”界面的问题解决(图文详解)

    前期博客 启动azkaban时出现User xml file conf/azkaban-users.xml doesn't exist问题解决(图文详解) 问题详情 [hadoop@master co ...

  2. Angularjs中表格的增删改查

    在一个管理系统中,不外乎都是增删改查.现在比如有个表格,我想修改当前行的数据,如下图所示 一点击修改的时候,当前页面我需要修改的数据,变成能修改的样式,点击保存能保存当前修改的数据,如下图所示 需要引 ...

  3. a=a+b与a+=b的区别

    在一次工作中身边的一位资深的同事突然问了个a=a+b与a+=b有什么区别 此时有点尴尬了 不知道是真的不知道咧还是别有用意....今天抽点时间针对此问题做个小总结 一.性能方面 a=a+b是加法运算 ...

  4. SEO 第六章

    SEO第六章 本次课程目标: 1.      掌握网站的内链优化 2.      网站的URL优化 一. 网站地图 1. 什么是网站地图? 网站地图也叫站点地图,英文名叫sitemap,指的网站所有内 ...

  5. Android(java)学习笔记181:多媒体之图片画画板案例

    1.首先我们编写布局文件activity_main.xml如下: <RelativeLayout xmlns:android="http://schemas.android.com/a ...

  6. UGUI世界坐标转换为UI本地坐标

    以下是实现hud跟随3D物体的脚本,只是测试用,不是开发中的代码,脚本挂在任意游戏物体上 demo下载 using UnityEngine; public class SceneFollowUI : ...

  7. day24-2 单例模式

    目录 单例模式 类内部定义静态方法实现单例模式 装饰器实现单例模式 元类实现单例模式 单例模式 单例模式:基于某种方法实例化多次得到实例是同一个 当实例化多次得到的对象中存放的属性都一样的情况,应该将 ...

  8. Mac 查看端口情况

    一个进程可以占用多个端口. 查看某个进程占用哪些端口: lsof -nP | grep TCP | grep -i 进程名 ➜ cocos_creator lsof -nP | grep TCP | ...

  9. DP || HYSBZ 1207 打鼹鼠

    n*n的网格,有m个鼹鼠,t时间会有一只鼹鼠出现在(x,y)点处,如果机器人也在这个点就可以打到鼹鼠 机器人初始位置任意,每秒可以移动一格,问最多打到多少鼹鼠 *解法:f[i]表示前i只鼹鼠打了多少个 ...

  10. FastDFS和集中存储方式对比

    指标 FastDFS   NFS  集中存储设备如NetApp.NAS 线性扩容性  高  差  差 文件高并发访问性能 高 差  一般 文件访问方式 专有API POSIX  支持POSIX 硬件成 ...