• ksum及二维版本


    Peter喜欢玩数组。NOIP这天,他从Jason手里得到了大小为n的一个正整数数组。Peter求出了这个数组的所有子段

    和,并将这n(n+1)/2个数降序排序,他想知道前k个数是什么。
    输入
    第一行包含两个整数 n 和 k。
    接下来一行包含 n 个正整数,代表数组。
    ai≤109 k≤n(n+1)/2,n≤100000,k≤100000
    输出
    输出 k 个数,代表降序之后的前 k 个数,每个数字后面有一个空格
    样例输入 Copy
    3 4
    1 3 4
    样例输出 Copy
    8 7 4 4

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    struct node{
        int l,r;
        long long s;
    }t,z;
    int n,k,a[100010];
    long long s;
    priority_queue<node> q;
    bool operator <(node a,node b){
        return a.s<b.s;
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
    	{
            scanf("%d",&a[i]);
            s+=a[i];
        }
        t.s=s;
        t.l=1;
        t.r=n;
        q.push(t);
        for(int i=1;i<=k;i++)
        {
        	t=q.top();
        	q.pop();
        	printf("%lld ",t.s);
        	z.l=t.l;
        	z.r=t.r-1;
        	z.s=t.s-a[t.r];
        	q.push(z);
        	if(t.r==n)
        	{
        		z.l=t.l+1;
        		z.r=t.r;
        		z.s=t.s-a[t.l];
        		q.push(z);
    		}
    	}
        return 0;
    }
    

      

    https://www.cnblogs.com/GXZlegend/p/7816312.html

    【bzoj4165】矩阵 堆+STL-map
    定义和谐矩阵为长不小于 Mina 且宽不小于 Minb 的矩阵,矩阵的权值为整个矩阵内所有数的和。给定一个长为 N,宽为 M 的矩阵 A,求它的所有和谐子矩阵中权值第 K 小的矩阵,并输出它的权值。
    输入

    第 1 行为五个正整数,分别为 N , M , Mina , Minb , K,相邻两个数用一个空格分隔。接下来的 N 行,每行 M
    个用一个空格分隔的数,表示给定的矩阵 A。
    1 <= N,M <=1000, 1 <= Mina <= N, 1 <= Minb <= M,
    1 <= K <= 250000 ,矩阵 A 内每个数均为不超过 3000 的非负整数
    输出

    仅一行,一个数,表示第 K 小矩阵的权值。如果第 K 小矩阵不存在,输出-1。
    样例输入

    3 4 2 2 3
    0 1 3 7
    1 16 5 2
    7 6 9 3

    样例输出

    19

    堆+STL-map

    这种类型的题也没少做了,初次写这样的大概是 [NOI2010]超级钢琴 。

    由于所有元素非负,因此一个矩形的权值和一定比其任意一个子矩形权值和大。因此只有在处理完子矩形后才处理该矩形。

    使用堆维护贪心顺序,初始时把所有长度为Mina,宽度为Minb的矩形加入堆中,每次取堆顶元素,并把该举行左、右、上、下扩展一层所得的矩形加入堆中。

    然而这样矩形会计算重复,因此需要使用hash表储存一个矩形是否出现过。

    我使用了map,由于常数巨大而垫底...

    时间复杂度 O(nm+klogk)

    #include <set>
    #include <queue>
    #include <cstdio>
    #include <cctype>
    #include <cstring>
    #define N 1010
    using namespace std;
    typedef pair<int , int> pr;
    typedef long long ll;
    ll sum[N][N];
    struct data
    {
        int a , b , c , d;
        data() {}
        data(int w , int x , int y , int z) {a = w , b = x , c = y , d = z;}
        bool operator<(const data &x)const {return a == x.a ? b == x.b ? c == x.c ? d < x.d : c < x.c : b < x.b : a < x.a;}
        ll query()const {return sum[c][d] - sum[c][b - 1] - sum[a - 1][d] + sum[a - 1][b - 1];}
    };
    struct cmp
    {
        bool operator()(const data &x , const data &y)
        {
            return x.query() > y.query();
        }
    };
    priority_queue<data , vector<data> , cmp> heap;
    set<data> s;
    inline char nc()
    {
        static char buf[100000] , *p1 , *p2;
        return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;
    }
    inline int read()
    {
        int ret = 0; char ch = nc();
        while(!isdigit(ch)) ch = nc();
        while(isdigit(ch)) ret = ((ret + (ret << 2)) << 1) + (ch ^ '0') , ch = nc();
        return ret;
    }
    int main()
    {
        int n = read() , m = read() , p = read() , q = read() , k = read() , i , j;
        ll ans = 0;
        data t , tmp;
        for(i = 1 ; i <= n ; i ++ )
            for(j = 1 ; j <= m ; j ++ )
                sum[i][j] = read() + sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1];
        for(i = 1 ; i <= n - p + 1 ; i ++ )
            for(j = 1 ; j <= m - q + 1 ; j ++ )
                t = data(i , j , i + p - 1 , j + q - 1) , heap.push(t) , s.insert(t);
        for(i = 1 ; i <= k ; i ++ )
        {
            if(heap.empty())
            {
                puts("-1");
                return 0;
            }
            t = heap.top() , heap.pop() , ans = t.query();
            if(t.a > 1 && s.find(tmp = data(t.a - 1 , t.b , t.c , t.d)) == s.end()) heap.push(tmp) , s.insert(tmp);
            if(t.b > 1 && s.find(tmp = data(t.a , t.b - 1 , t.c , t.d)) == s.end()) heap.push(tmp) , s.insert(tmp);
            if(t.c < n && s.find(tmp = data(t.a , t.b , t.c + 1 , t.d)) == s.end()) heap.push(tmp) , s.insert(tmp);
            if(t.d < m && s.find(tmp = data(t.a , t.b , t.c , t.d + 1)) == s.end()) heap.push(tmp) , s.insert(tmp);
        }
        printf("%lld
    " , ans);
        return 0;
    }
    

      

  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/cutemush/p/14081711.html
Copyright © 2020-2023  润新知