ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

中秋节yyds

2022-09-11 07:30:26  阅读:203  来源: 互联网

标签:yyds ch 中秋节 int 最大值 修改 maxn ll


P8539 「Wdoi-2」来自地上的支援

为什么都在用线段树啊?

首先,我们发现一个数如果有一次没有被选,那它以后就永远不会被选上了,所以x被选k次的临界是它从x到x+k-1一直被选上,x+k-1>n就不合法了。

为了保证这个数在它自己的位置上被选中第一次,它需要比前面的修改后最大值大或相等(因为修改值和原值相等时选原值),继续修改下去,它自己的不断增加的修改值还要大于后面的每一个原值。

这里涉及到了修改值的预处理,先用没有任何变动的A进行题目中的操作,因为比较的只是相对大小,与其每次找出来最大的让它+v,不如先对于每一个数把v*i减掉,比较相对大小时就相当于和与它比较的数的修改值相比了。

所以就用线段树——前面的预处理,后面的最大值区间查询。

可是线段树是没有必要的。

我们发现要保持在1~x-1和x+1~x+k-1之内只要区间够大就要必选x,所以我们只需要一个前缀,f[i]表示在原来的A中截止到i最大的修改值的位置,就是他原来由于B最大什么的已经加上了若干个v,我们只需要让A比这个临界区间范围内最大可能的B大就好了。

分成4种情况:

前两种,如果这最大值就是x,那么它是无效的,因为x的初始值成了变量,它原来在A中的值是可行解但不是最优解,所以预处理的时候还要处理上次大值g,不用严格(可以相等),把这个g看做是最大值,如果它出现在x之前,修改值和它相等就可以了,出现在x之后就需要修改值一定比它大。x需要加上它和最大值的差值,如果最大值在它之前就加上正差距,否则加上负差距,在代码里的体现是x*v和A[maxpos]直接加,因为A都是减过的。

最大值不是x那直接用最大值f就可以了,不管次大值g什么事,其他的都一样。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 2e6 + 3;
const int INF = 0x7fffffff; 

int n, m, X[maxn], K[maxn];
ll v, A[maxn], f[maxn], g[maxn], w, l;
ll an2, an1;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
        {
            f = -1;
        }
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}

int main()
{
    n = read(); m = read(); v = read();
    for(int i=1; i<=n; i++)
    {
        A[i] = read();
    }
    for(int i=1; i<=m; i++) 
    {
        X[i] = read(); K[i] = read();
    }
    A[0] = -INF;
    for(int i=1; i<=n; i++)
    {
        A[i] = w = A[i] - i*v;
        if(w >= A[f[i-1]]) g[i] = f[i-1], f[i] = i;
        else if(w >= A[g[i-1]]) g[i] = i, f[i] = f[i-1];
        else g[i] = g[i-1], f[i] = f[i-1];
    }
    for(int i=1; i<=m; i++)
    {
        int x = X[i], k = K[i], y = x+k-1; 
        l = 0;
        if(y < n) l = max(0ll, x*v+(f[y]==x?A[g[y]]+(g[y]>x):A[f[y]]+(f[y]>x)));
        an1 ^= l; an2 += l;
    }
    printf("%lld %lld\n", an1, an2);

    return 0;
}
View Code

 

标签:yyds,ch,中秋节,int,最大值,修改,maxn,ll
来源: https://www.cnblogs.com/Catherine2006/p/16683408.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有