• 【洛谷P4231】三步必杀【差分】


    题目大意:

    题目链接:https://www.luogu.org/problemnew/show/P4231
    一个序列,初始值全部为0。每次修改一段区间[l,r][l,r],区间[l,r][l,r]中第ii个元素加上等差数列的第ii项。求最终数列的异或和以及最大值。


    思路:

    n107nleq 10^7。连带loglog的数据结构都不给过。
    由于每次加的是一个等比数列,所以考虑使用差分来解决这个问题。
    假设原数列为aa,差分数列为bb

    编号 1 2 3 4 5 6 7 8 9
    aa 0 0 0 0 0 0 0 0 0
    bb 0 0 0 0 0 0 0 0 0

    这次在[3,6][3,6]中加入等差数列,首项加xx,莫项加yy,公差为dd

    编号 1 2 3 4 5 6 7 8 9
    aa 0 0 xx x+dx+d x+2dx+2d x+3d(y)x+3d(y) 0 0 0
    bb 0 0 xx dd dd dd x3d(y)-x-3d(-y) 0 0

    那么现在就是一个单点修改+区间修改的问题了。用线段树时间复杂度O(nlogn)O(nlog n)
    这样的复杂度还是不够优秀,如果可以把区间修改去掉,那么就可以直接在数列上单点修改了。
    那么就在bb数组上再进行一次差分,这样就可以把dd消掉。

    编号 1 2 3 4 5 6 7 8 9
    aa 0 0 xx x+dx+d x+2dx+2d yy 0 0 0
    bb 0 0 xx dd dd dd y-y 0 0
    cc 0 0 xx dxd-x 0 0 yd-y-d yy 0

    所以我们每次修改时单点修改4个点就可以了。
    那么考虑如何用cc数组推出最终的aa数组。
    根据差分,有ai=j=1ixk=1jcxka_i=sum^{i}_{j=1}sum^{j}_{xk=1}c_{xk}。这个xk=1jcxksum^{j}_{xk=1}c_{xk}可以把cxkc_{xk}做一个前缀和,然后易得ai=ai1+sumia_i=a_{i-1}+sum_i。这样就O(n+m)O(n+m)完成了这道题。


    代码:

    #include <cstdio>
    #include <string>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    const int N=1e7+10;
    int n,m,l,r;
    ll a[N],sum[N],add,x,y,ans1,ans2;
    
    ll read()
    {
    	ll d=0;
    	char ch=getchar();
    	while (!isdigit(ch)) ch=getchar();
    	while (isdigit(ch))
    		d=(d<<3)+(d<<1)+ch-48,ch=getchar();
    	return d;
    }
    
    int main()
    {
    	n=(int)read(); m=(int)read();
    	for (int i=1;i<=m;i++)
    	{
    		l=(int)read(); r=(int)read(); x=read(); y=read();
    		add=(y-x)/(ll)(r-l);
    		a[l]+=x;
    		a[l+1]+=add-x;
    		a[r+1]-=add+y;
    		a[r+2]+=y;
    	}
    	for (int i=1;i<=n;i++)
    	{
    		sum[i]=sum[i-1]+a[i];
    		a[i]=a[i-1]+sum[i];
    		ans1^=a[i];
    		ans2=max(ans2,a[i]);
    	}
    	printf("%lld %lld
    ",ans1,ans2);
    	return 0;
    }
    
  • 相关阅读:
    mysql子查询
    hibernate lazy属性true false extra 抓取策略
    unittest下,生成的测试报告
    python创建excel文件,并进行读与存操作
    configparser模块简介
    PyCharm里面的c、m、F、f、v、p分别代表什么含义?
    Python之路(第十七篇)logging模块
    configparser模块简介
    python中os.sep的作用以及sys._getframe().f_back.f_code.co_xxx的含义
    os.getcwd()和os.path.realpath(__file__)的区别
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998128.html
Copyright © 2020-2023  润新知