用一个双向链表来查找比当前元素大的前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. jmeter并发定时器

    jmeter并发定时器

  2. MySQL存储过程(更新指定字段的数据)

    mysql存储过程示例: USE 数据库名称;DROP PROCEDURE IF EXISTS 数据库名称.存储过程名称;delimiter $$CREATE PROCEDURE 数据库名称.存储过程 ...

  3. FZU 1977 Pandora adventure (插头DP,常规)

    题意:有一个n*m矩阵,其中有些格子必走,有些格子不可走,其他格子是可走也可不走,问有多少条哈密顿回路? 思路: 本来是一道很简单的题,代码写多了连白痴bug都查不出了,竟然用i>=ex& ...

  4. 机器学习之-奇异值分解(SVD)原理详解及推导

    转载 http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充 ...

  5. Bootstrap历练实例:基本按钮群组

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. Bootstrap 表格2

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. Flask——基础知识

    Flask应用程序 一个简单的Flask应用程序 # 导入flask程序 from flask import Flask # 初始化flask对象 app = Flask(__name__) # 装饰 ...

  8. mysql 复制中的 paxso 的两阶段和事务两阶段的区别

    1.普通的两阶段是 推送不同的数据给不同的主机,一旦出现网络中断,造成问题是不可服务. 因为本身有锁,故无所谓. 2.paxos 的两阶段是将相同的 数据给不同的主机,一旦超过半数即可认为成功.

  9. STATIC 和 CLASS

    STATIC 和 CLASS 由 王巍 (@ONEVCAT) 发布于 2015/01/28 Swift 中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是 static 和 class ...

  10. 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼

    离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...