• 差分


     差分是一种支持进行区间大量修改的操作。精巧而不难理解,在竞赛中是一种很常用的小技巧。

        首先是思想:

        假如有一个年级考试,批卷时发现有一题全体改错了,需要全部加x分。按照朴素暴力的思想,就是将以前所有的批了的试卷全部再拿出来,再一张张的加分。这当然过于的慢,所以便有了差分的这种算法:说白了,就是将一整个考场的试卷封面上写上“加x分”,这样便省去了许多功夫。

        然后是实现:

        有一个区间,要将第n~m(m>n)的所有数全部加x,如图:

        

        在差分数组c中打两个标记,时间复杂度为O(1),暴力的速度为O(n-m)。

        附代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int SIZE=10005;
     
    int a[SIZE],c[SIZE*10];
    int ans=0,ask,n,m,x,y,w;
     
    int main()
    {
    	cin>>n>>m;	//输入数列长度和修改次数
    	for (int i=1;i<=n;i++) cin>>a[i];	//输入数列
    	for (int i=1;i<=m;i++){
    		cin>>x>>y>>w; //从x到y全部加w
    		c[x]+=w;	  //x处标记+w 
    		c[y+1]-=w; 	  //y+1处标记-w 
    	}
    	cin>>ask;		//输入查询下标 
    	for (int i=1;i<=ask;i++) ans+=c[i];
    	cout<<a[ask]+ans; //不要忘记加原数列值 
    	
    	return 0;
    }
  • 相关阅读:
    vue表单验证定位到错误的地方
    INSPINIA Version 2.5 Bootstrap3
    volatile 彻底搞懂
    solr6.4.2之webservice兼容升级
    快速排序
    Elasticsearch调优篇 10
    TCP 连接为什么需要 3 次握手和 4 次挥手
    搜索技术与方案的选型与思考
    Elasticsearch调优篇 09
    Elasticsearch调优篇 08
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089002.html
Copyright © 2020-2023  润新知