K-Anonymous Sequence

                                                                                                                                                     K-Anonymous Sequence
Time Limit: 4000MS Memory Limit: 65536K
Total Submissions: 6525 Accepted: 2173

Description

The explosively increasing network data in various application domains has raised privacy concerns for the individuals involved. Recent studies show that simply removing the identities of nodes before publishing the graph/social network data does not guarantee privacy. The structure of the graph itself, along with its basic form the degree of nodes, can reveal the identities of individuals.

To address this issue, we study a specific graph-anonymization problem. We call a graph k-anonymous if for every node v, there exist at least k-1 other nodes in the graph with the same degree as v. And we are interested in achieving k-anonymous on a graph with the minimum number of graph-modification operations.

We simplify the problem. Pick  n nodes out of the entire graph  G and list their degrees in ascending order. We define a sequence  k-anonymous if for every element  s, there exist at least  k-1 other elements in the sequence equal to  s. To let the given sequence  k-anonymous, you could do one operation only—decrease some of the numbers in the sequence. And we define the cost of the modification the sum of the difference of all numbers you modified. e.g. sequence 2, 2, 3, 4, 4, 5, 5, with  k=3, can be modified to 2, 2, 2, 4, 4, 4, 4, which satisfy 3-anonymous property and the cost of the modification will be |3-2| + |5-4| + |5-4| = 3.

Give a sequence with n numbers in ascending order and k, we want to know the modification with minimal cost among all modifications which adjust the sequence k-anonymous.

Input

The first line of the input file contains a single integer T (1 ≤ T ≤ 20) – the number of tests in the input file. Each test starts with a line containing two numbers n (2 ≤ n ≤ 500000) – the amount of numbers in the sequence and k (2 ≤ k ≤ n). It is followed by a line with n integer numbers—the degree sequence in ascending order. And every number s in the sequence is in the range [0, 500000].

Output

For each test, output one line containing a single integer—the minimal cost.

Sample Input

2
7 3
2 2 3 4 4 5 5
6 2
0 3 3 4 8 9

Sample Output

3
5

Source

思路:Fi=min(Fj+sum[i]sum[j](ij)×a(j+1))Fi=min(Fj+sum[i]−sum[j]−(i−j)×a(j+1)) 0<=j<=ik.  套斜率dp即可。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 300010
#define maxn 500005
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
#define REP(j, a, b) for(int j = (a); j <= (b); ++ j)
#define PER(i, a, b) for(int i = (a); i >= (b); -- i)
const long long inf=1LL<<61;
using namespace std;
template <class T>
inline void rd(T &ret){
    char c;
    ret = 0;
    while ((c = getchar()) < '0' || c > '9');
    while (c >= '0' && c <= '9'){
        ret = ret * 10 + (c - '0'), c = getchar();
    }
}
long long p[maxn],dp[maxn],sum[maxn],q[maxn];
int T,n,k;
double slope(int u,int v){
     double y=dp[v]-sum[v]+v*p[v+1]-dp[u]+sum[u]-u*p[u+1];
     double x=p[v+1]-p[u+1];
     if(!x&&!y)return inf;
     return y/x;
}
int main(){
    rd(T);
    while(T--){
         rd(n),rd(k);
         for(int i=1;i<=n;i++){
             scanf("%d",&p[i]);
             sum[i]=sum[i-1]+p[i];
         }
         REP(i, k, n)dp[i]=sum[i]-i*p[1];
         REP(i, 0, k-1)dp[i]=inf;
         int h=1,t=1;
         q[1]=k;
         REP(i, k, n){
            while(h<t&&slope(q[h],q[h+1])<=i)h++;
            dp[i] = min(dp[i], dp[q[h]] + sum[i] - sum[q[h]] - (i - q[h]) * p[q[h] + 1]);
            while(h<t&&slope(q[t],i-k+1)<=slope(q[t-1],q[t]))t--;
            q[++t]=i-k+1;
         }
         cout<<dp[n]<<endl;
    }
}

 

转载于:https://www.cnblogs.com/czy-power/p/10365824.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值