Hduacm—5497

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 typedef long long LL;
 8 const int maxn = 1e5+100;
 9 int a[maxn];
10 struct Bittree
11 {
12     int tr[maxn];
13     void init()
14     {
15         memset(tr,0,sizeof(tr));
16     }
17     void update(int x,int v)
18     {
19         for (;x<maxn;x+=(x&-x)) tr[x] += v;
20     }
21     int query(int x)
22     {
23         int res = 0;
24         for (;x;x-=(x&-x)) res += tr[x];
25         return res;
26     }
27 }L,R;
28
29
30 void slove()
31 {
32     int i,n,m;
33     LL cur = 0,ans;
34     L.init();R.init();
35     scanf("%d%d",&n,&m);
36     for (i = 0;i<n;i++)
37     scanf("%d",&a[i]);
38     for (int i = n-1;i>=m;--i)
39     {
40         cur += R.query(a[i]-1);
41         R.update(a[i],1);
42     }
43     ans = cur;
44
45     for (i = 0;i+m<n;++i)
46     {
47         R.update(a[i+m],-1);
48         cur+=R.query(a[i]-1);
49         cur-=R.query(a[i+m]-1);
50         cur+=L.query(n+1-(a[i]+1));
51         cur-=L.query(n+1-(a[i+m]+1));
52         L.update(n+1-(a[i]),1);
53         ans = min(ans,cur);
54     }
55     printf("%I64d\n",ans);
56 }
57
58 int main()
59 {
60     int T;
61     scanf("%d",&T);
62     while (T--)
63     {
64         slove();
65     }
66     return 0;
67 }

代码

时间: 2024-08-05 22:02:34

Hduacm—5497的相关文章

hdu-acm steps FatMouse&#39;s Speed

本想用暴力法先试试的,案例和自己找的数据都过掉了,但是始终wa,本来期待的是tle,结果始终wa.所以也就懒的管了,直接用dp来做了.主要是因为最近在刷暴力法和dp这两个专题,所以才想好好利用一下这道题.如果有哪位发现了我的第一个程序的错误,还望告知. 暴力法(此程序不知道为何wa) 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 #include"cmat

HDU 5497 Inversion

Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description You have a sequence \{a_1,a_2,...,a_n\} and you can delete a contiguous subsequence of length m. So what is the minimum number of inversions after the deletion. I

hduacm 5255

http://acm.hdu.edu.cn/showproblem.php?pid=5255 枚举a和c  求解b #include <cstdio> #include <cstring> #include <map> #include <string> #include <algorithm> using namespace std ; typedef long long LL ; #define clr( a , x ) memset ( a

hdu-acm stepsHumble Numbers

这是我做的第六道动态规划水题,对动态规划差不多有了一个大致的概念.动态规划有几个关键因素,第一是最优子结构,第二是状态和状态转移方程.整个过程都是以  最优  为中心的.因此在状态转移方程中常涉及到几个子状态的最优化的判断.这道题既采用了递堆的思想,又采用了一点动态规划的思想.状态转移方程为:f[i]=min{2*f[p],3*f[q],5*f[r],7*f[s]}; 1 #include"iostream" 2 #include"stdio.h" 3 #inclu

hdu-acm steps Max sum

/*求最大字段和,d[i]表示已 i 结尾(字段和中包含 i )在 a[1..i] 上的最大和,d[i]=(d[i-1]+a[i]>a[i])?d[i-1]+a[i]:a[i];max = {d[i],1<=i<=n} ;至于起点和终点,要各定义一个变量去跟踪,尤其是起点*/ #include"iostream"#include"stdio.h"#include"algorithm"#include"string.h&

hdu-acm steps 命运

/*表示刚刚接触dp.这是我接触到的第3道dp题,刚开始以为是要用dfs+dp,后来栈溢出...仔细想想, 其实这道题和数塔差不多,只要每步都得到最优子结构,最后结果一定是最优的.题目的初始化要做好,这样 可以避免很多的麻烦*/ #include"iostream"#include"stdio.h"#include"algorithm"#include"string.h"#include"cmath"#in

hdu-acm steps 免费馅饼

/*dp入门级的题目,和数塔是一样的,这道题不用做什么优化,感觉时间复杂度不会超.主要还是细节上的问题, 这道题的状态和状态方程都容易找到,采用自底向上的方式会好很多*/ #include"iostream"#include"algorithm"#include"stdio.h"#include"string.h"#include"cmath"#include"queue"#define

hduacm集训单人排位赛1002

自适应simpson积分公式 通过二分区间递归求simpson积分 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib&g

hduacm 3183 rmq

http://acm.hdu.edu.cn/showproblem.php?pid=3183 问题等价与取N-M个数,每次取的时候保证后面能取的个数足够,并且取的数最小  查询最小用rmq 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 6 using namespace std; 7 8 9 const int maxn = 10000