首页 > 其他分享 >再谈 前缀和,差分

再谈 前缀和,差分

时间:2023-06-16 22:33:46浏览次数:30  
标签:std 前缀 int res 再谈 long 差分

预计学习时间: 一天

因为发现有好多题目都需要利用前缀和还有差分来进行优化,所以要花一天的时间把这种基础算法学完.

//前缀和:
//二维前缀和:
//1-1 激光炸弹: https://www.luogu.com.cn/problem/P2280
//这里只需要建立一个二维前缀和,然后遍历每一个框架就可以
//不能枚举所有的点,因为点实在是太多了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5010;
int n,r,s[N][N],res;
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>r;
    r=min(r,5002);
    for(int i=0;i<n;i++){
        int a,b,c;
        cin>>a>>b>>c;
        s[a][b]+=c;
        //因为如果点在边上的话,是无效的,所以我们的框是要框住比自己小的
        //3x3的框就要框2x2的炸弹
    }
    for(int i=1;i<=5002;i++)
        for(int j=1;j<=5002;j++) s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
    for(int i=r;i<=5002;i++) 
        for(int j=r;j<=5002;j++) res=max(res,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]);
    cout<<res;
    return 0;
}
//差分
//增减序列:https://ac.nowcoder.com/acm/contest/999/B
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long res,ans,c[N],n,a[N];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],c[i]=a[i]-a[i-1];
    for(int i=2;i<=n;i++){
        if(c[i]>0) res+=c[i];//统计所有的差分正数
        else if(c[i]<0) ans-=c[i];//所有的差分负数
    //这里讲一下思路: 对于整个差分数列,有正值有负值,那么我们的目标是2-n的序列全变为0
    //通过改变某一区间让min(正,负)变为0,剩下的一个让从1开始到n结束来
    //因为如果改变当前的c[i]值的话,可以巧妙地发现,知识改变的当前的值,后面的c仍然不变,所以可以随意放心的改
    }
    cout<<min(res,ans)+abs(res-ans)<<endl<<abs(res-ans)+1;
    return 0;
}

 

标签:std,前缀,int,res,再谈,long,差分
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17486625.html

相关文章

  • 在freeSwitch中,使用拨号计划实现来自gateway 为gw80 的来电转向 gateway 为gw4的,并且
    可以通过如下拨号计划实现该功能:```<include><contextname="default"><extensionname="forward_call"><conditionfield="destination_number"expression="^53(\d+)$"><actionapplication=&q......
  • 主叫是053158263720,被叫是手机号,转向gateway 是gw4 ,并且被叫前缀加上88
    可以使用以下拨号计划来实现: <include><contextname="public"><extensionname="forward_call"><conditionfield="caller_id_number"expression="^053158263720$"/><conditionfield="destination_number&......
  • Windows批量修改或去除文件前缀脚本
    chcp65001@echooffsetlocalEnableDelayedExpansionset/pfolderPath="请输入需要修改前缀的文件夹路径:"set/poldPrefix="请输入原前缀:"set/pnewPrefix="请输入新前缀:"for%%iin("%folderPath%\%oldPrefix%*")do(set"filen......
  • 51nod-1280 前缀后缀集合
    原题链接1280 前缀后缀集合题目来源: Codility基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注一个数组包含N个正整数,其中有些是重复的。一个前缀后缀集是满足这样条件的下标对(P,S),0<=P,S......
  • FOTA差分升级过程
    FOTA升级过程如下:新老固件进行差异分析,生成差分升级包并上传至云端服务器。设备收到升级命令,擦除FOTA分区。设备开始接收差分文件,并写入FOTA分区。内部的bootloader程序将解差分并还原。将差分升级包的内容搬运至APP分区,覆盖原有的固件数据。设备对固件进行校验,以确保更新......
  • image标签的SRC加上前缀
    <template> <viewclass="content"> <viewclass="itemtop"v-for="(item,index)intoplist"> <viewclass="oneitem_img"> <image:src="aaa(item.avator)"></image&......
  • 关于前缀和的一些基础概念
    写在前面在数据结构和算法中,前缀和(PrefixSum)是一种常见的技术,用于快速计算数组或序列中某个位置之前的元素的和。除了常规的前缀和之外,还有一些常见的前缀和的变种前缀和的种类常规前缀和对于数组nums,前缀和prefixSum[i]表示从索引0到索引i(包括i)的元素的和。prefixSum[i]=......
  • 差分数组详解
    一维差分数组假设给你一个数组nums,先对区间[a,b]中每个元素加3,在对区间[c,d]每个元素减5……,这样非常频繁的区间修改,常规的做法可以一个个计算。publicvoidincrement(int[]nums,inta,intb,intk){for(intindex=a;index<=b;index++){......
  • LeetCode----前缀和
    1算法原理适用场景:利用preSum数组,可以在O(1)的时间内快速求出nums任意区间[i,j]内的所有元素之和sum(i,j)=preSum(j+1)-preSum[i]算法模板classNumArray:def__init__(self,nums:List[int]):N=len(nums)self.preSum=[0]*(N+1)......
  • 前缀和的应用 II
    目录应用应用1:396.旋转函数题目分析代码实现应用应用1:396.旋转函数题目396.旋转函数给定一个长度为n的整数数组 nums 。假设 arrk 是数组 nums 顺时针旋转k个位置后的数组,我们定义 nums 的旋转函数  F 为:F(k)=0*arrk[0]+1*arrk[1]+...+(n......