zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    VTK初学一,动画加AVI录制终于做出来了
    QCamera获取摄像头图像(转载)
    VTK初学一,比较常见的错误2
    myeclipse2014鼠标单击后光标位置背景底色为白色太难看,行号显示
    记一次跟二房东公司(非中介个人房源无中介费)租房的经历
    求16进制数据或运算后的值(即多个16进制相加的和)
    error LNK2001: 无法解析的外部符号 "public: char * __thiscall
    如何利用指向数组的指针得到数组元素个数?
    C++判断字符串是否为空的一个小问题
    C++开发中BYTE类型数组转为对应的字符串
  • 原文地址:https://www.cnblogs.com/czy-power/p/10365824.html
Copyright © 2011-2022 走看看