zoukankan      html  css  js  c++  java
  • 【Luogu P2048】[NOI2010] 超级钢琴

    链接:

    题目

    题目大意:

    在一个长度为 (n) 的数列里,找出长度在 ([L,R]) 中的 (k) 个子段,使它们的和最大。

    正文:

    我们可以把问题转化为求出一部分的:

    [sum_{x}-sum_{x-i}quad(iin [L,R]) ]

    其中 (sum) 是前缀和。

    可以考虑枚举左端点,然后用 ST 表找到最优的右端点,然后把它丢到一个大根堆里,就可以解决答案了吗?

    并不。原因是,一个左端点,除了最优的右端点,其它的可能对于总答案来说还是较为优秀的,也不能忽略。而这一个问题可以分治解决:假设当前最优的右端点是 (x),可以在 ([l,x-1]) 或者 ([x+1,r]) 里再找一个。这是整道题的核心。

    可能是我自己的锅,但是实践发现枚举左端点要比枚举右端点更优秀。

    代码:

    const int N = 5e5 + 10;
    
    int n, k, L, R;
    ll sum[N], f[N][25], ans;
    struct node
    {
    	ll x, y, l, r;
    	inline bool operator < (const node& a) const
    	{
    		return sum[y] - sum[x - 1] < sum[a.y] - sum[a.x - 1];
    	}
    };
    priority_queue<node> q;
    
    ll query (int l, int r)
    {
    	int t = log2(r - l + 1);
    	return sum[f[l][t]] > sum[f[r - (1 << t) + 1][t]]? f[l][t]: f[r - (1 << t) + 1][t];
    }
    
    int main()
    {
    //  freopen(".in", "r", stdin);
    	scanf("%d%d%d%d", &n, &k, &L, &R);
    	for (int i = 1; i <= n; i++)
    		scanf ("%lld", &sum[i]), sum[i] += sum[i - 1],
    		f[i][0] = i;
    	for (int j = 1; j <= 20; j++)
    		for (int i = 1; i + (1 << j - 1) <= n; i++)
    			f[i][j] = sum[f[i][j-1]] > sum[f[i+(1<<j-1)][j-1]]? f[i][j-1]: f[i+(1<<j-1)][j-1];
    	for (int i = 1; i + L - 1 <= n; ++i)
    		q.push((node){i, query(i + L - 1, min(i + R - 1, n)), i + L - 1, min(i + R - 1, n)});
    	for (; k--; )
    	{
    		node x = q.top();q.pop();
    		ans += sum[x.y] - sum[x.x - 1];
    //		printf ("%lld
    ", sum[x.x] - sum[x.y]);
    		if (x.l != x.y) q.push((node){x.x, query(x.l, x.y - 1), x.l, x.y - 1});
    		if (x.r != x.y) q.push((node){x.x, query(x.y + 1, x.r), x.y + 1, x.r});
    	}
    	printf ("%lld
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    WINCE串口驱动MDD层代码简单分析
    WinCE下,快速编译驱动及BSP
    如何使用ulink2烧写二进制文件
    PB6.0 快速编译单个驱动技巧
    WinCE5.0和WinCE6.0下,编译选项介绍
    WINCE串口驱动PDD层代码简单分析
    浅谈WinCE平台USB摄像头驱动开发流程
    WinCE中,环境变量的添加,删除和查询
    WinCE API
    WINCE 6.0安装顺序说明
  • 原文地址:https://www.cnblogs.com/GJY-JURUO/p/14347339.html
Copyright © 2011-2022 走看看