用一个双向链表来查找比当前元素大的前k-1个元素和后k-1个元素 ,从小到大枚举x,算完x的贡献后将x从链表中删除,优化到O(nk)。

  1. /*hdu6058[链表维护] 2017多效3*/
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. typedef long long LL;
  5. int T, n, k, temp;
  6. int pos[], pre[], nxt[];
  7. LL a[], b[];
  8. LL ans = ;
  9. LL Getans(int x) {
  10. int r1 = , r2 = ;
  11. LL ret = ;
  12. for (int i = x; i >= && r1 <= k; i = pre[i]) {
  13. a[++r1] = i - pre[i];//向前找k-1个比当前元素大的
  14. }
  15. for (int i = x; i <= n && r2 <= k; i = nxt[i]) {
  16. b[++r2] = nxt[i] - i;//向后找k-1个比当前元素大的
  17. }
  18. for (int i = ; i <= r1; i++) {
  19. if (k - i + <= r2 && k - i + >= ) {
  20. //cout << x << ' ' << a[i] << ' ' << b[k - i + 1] << endl;
  21. ret += a[i] * b[k - i + ];
  22. }
  23. }
  24. return ret;
  25. }
  26. void del(int i) {
  27. pre[nxt[i]] = pre[i];
  28. nxt[pre[i]] = nxt[i];
  29. }
  30. void connect(int u, int v) {
  31. nxt[u] = v;
  32. pre[v] = u;
  33. }
  34. void solve() {
  35. for (int i = ; i <= n; i++)
  36. connect(i, i + );
  37. for (int i = ; i <= n; i++) {
  38. ans += Getans(pos[i]) * i;
  39. del(pos[i]);//每次删去一个, 保证其他所有元素都比当前元素大
  40. }
  41. printf("%lld\n", ans);
  42. }
  43. int main() {
  44. scanf("%d", &T);
  45. while (T--) {
  46. ans = ;
  47. scanf("%d %d", &n, &k);
  48. for (int i = ; i <= n; i++) {
  49. scanf("%d", &temp);
  50. pos[temp] = i;
  51. }
  52. solve();
  53. }
  54. return ;
  55. }

hdu6058[链表维护] 2017多校3的更多相关文章

  1. 【链表】2017多校训练三 HDU 6058 Kanade's sum

    acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...

  2. 2017 多校4 Wavel Sequence

    2017 多校4 Wavel Sequence 题意: Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and ...

  3. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  4. 2017 多校5 hdu 6093 Rikka with Number

    2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...

  5. 2017 多校5 Rikka with String

    2017 多校5 Rikka with String(ac自动机+dp) 题意: Yuta has \(n\) \(01\) strings \(s_i\), and he wants to know ...

  6. 2017 多校4 Security Check

    2017 多校4 Security Check 题意: 有\(A_i\)和\(B_i\)两个长度为\(n\)的队列过安检,当\(|A_i-B_j|>K\)的时候, \(A_i和B_j\)是可以同 ...

  7. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

  8. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  9. 2017 多校1 I Curse Myself

    2017 多校2 I Curse Myself(第k小生成树) 题目: 给一张带权无向连通图,该图的任意一条边最多只会经过一个简单环,定义\(V(k)为第k小生成树的权值和\),求出\(\sum_{k ...

随机推荐

  1. JS 一个页面关闭多个页面

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  2. SQL 转换函数

    1.字符串与字符串相加 字符串相加   得到的是拼接成一列的字符串类型 例如 select name+code from car       name是nvarchar  code也是nvarchar ...

  3. 将从SQL2008 r2里备份的数据库还原到SQL2008中

    从标题可以看出这是未解决上一篇遗留问题写的,现在我也不知道这个可不可以成功,方法似乎查到了一种,具体怎样还不清楚:而且,我想说的是“我踩雷了”. 这篇的主角是“Database Publishing ...

  4. docker配置国内镜像

    1. 配置 root@ros-OptiPlex-3050:~# cat /etc/docker/daemon.json {    "graph": "/mnt/docke ...

  5. License开源许可协议

    开源许可协议 License是软件的授权许可,表述了你获得代码后拥有的权利,可以对别人的作品进行何种操作,何种操作又是被禁止的. 开源许可证种类 Open Source Initiative http ...

  6. 把apk文件拖到re-sign.jar运行打开的界面找不到指定文件

    下载一个zipalign.exe放到tools目录下面就可以了 点击下载

  7. 多线程threadvar 变量设定

    Delphi管理多线程之线程局部存储:threadvar 尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题.其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一 ...

  8. poi导出word模板项目实例(一个文件)

    在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面   <table class="formTa ...

  9. ios之UIAlertView

    举例: UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Default Alert View"messa ...

  10. Codeforces Round #510 #C Array Product

    http://codeforces.com/contest/1042/problem/C 给你一个有n个元素序列,有两个操作:1,选取a[i]和a[j],删除a[i],将$a[i]*a[j]$赋值给a ...