首页 > 其他分享 >CCF认证——202109-2 贡献的变化——差分维护,前缀和算答案

CCF认证——202109-2 贡献的变化——差分维护,前缀和算答案

时间:2023-11-30 17:45:28浏览次数:33  
标签:cnt 前缀 int long 非零段 差分 202109 CCF define

https://www.acwing.com/problem/content/4010/
http://118.190.20.162/view.page?gpid=T130
脑子一热抱着玩的心态试了一下三分,当然炸了,就当初认识三分了。

正解是考虑p的变化的影响,p变成p+1的时候,答案的值取决于 p属于 相邻递增数对的值域区间 的数量。也可以考虑递减的情况,两种情况只需要考虑一种,对所有数都考虑都考虑那一种就可以了,两种代码都AC了。

分析:如果 a[i]>a[i−1]
意味着当p取到 a[i−1]+1 到 a[i] 之间的值时,非零段+1
使用数组cnt[],cnt[i] 表示p从i-1上升到i时,非零段数量的变化
从正向前缀和中找出最大值就是所要的结果。边界问题不需要处理,因为全局数组默认是0,可以构成递增或递减的情况,
正向前缀和本质上就是差分操作的前缀和累加。
这道题纠结的地方在于为什么维护的是答案,不是变化量,但其实就是变化量,cnt[1]的值就是最初数列中的非零段数量,当从1变到2的时候,cnt前缀和就是考虑了变化量的答案。如果都考虑递增,由于边界问题的不用处理,所以即使还考虑递减结果会多1,正好是边界比较的时候补回来的。

// Problem: 非零段划分
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/4010/
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
//# define int long long
#define ull unsigned long long
#define pii pair<int,int>
//#define double in
#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl  "\n"

const int N = 5e5 + 10;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
int n, m;
int a[N];int cnt[10010];
void solve(){
	cin>>n;
	bool flag=false;
	for(int i=1;i<=n;i++){
	cin>>a[i];
	if(a[i]>0)flag=true;
	}
	if(!flag){
		cout<<0<<endl;
		return ;
	}
	else {
		int mx=-1;
		for(int i=1;i<=n;i++){
			if(a[i]>a[i-1]){
				
			//本质上是给这个区间加1,然后考虑差分降低时间复杂度
			//加1的含义是p在这个区间的时候,非零子段数量加1
			cnt[a[i-1]+1]++;
			cnt[a[i]+1]--;
			}
		}
		int s=0;
		
		for(int i=1;i<=10000;i++){
			s+=cnt[i];
			mx=max(s,mx);
		}
		cout<<mx<<endl;
	}
}
int main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);

    int t;
   t=1;
    while (t--) {
solve();
    }
    return 0;
}

标签:cnt,前缀,int,long,非零段,差分,202109,CCF,define
From: https://www.cnblogs.com/mathiter/p/17867899.html

相关文章

  • 【CCFCSP】2309真题笔记
    -1.坐标变换(Ⅰ分析签到题√AC:不够精简#include<iostream>#include<vector>usingnamespacestd;constintmaxn=100;intdxy[2];intxy[maxn+1][2];intmain(){intm,n;cin>>n>>m;intdx=0,dy=0;while(n--){//操作cin>&g......
  • 差分算法总结
    差分是前缀和的逆运算一维差分对于a1,a2,…,an,构造b1,b2,…,bn,使得ai= b1+ b2 + …+bi。此时,b数组成为a数组的差分,a数组称为b数组的前缀和。题目链接:https://www.acwing.com/problem/content/799/代码模版:1#include<iostream>23usingnamespacestd;45co......
  • 【图论】差分约束与SPFA 11.25学习小结
    开篇碎碎念每次都是以开篇碎碎念开头,虽然不知道为什么,但似乎成为了惯例。本来是直接看的差分约束,一上来发现一堆不等式,以为是数学的一个tag乱入图论(x,结果发现还真的是建图来做的,然后学了一下之后...负边权?!跑不了dijkstra啊!!于是学了一下SPFA(虽然...SPFA已死)然后顺道写了一下关于......
  • ccf 202309 02
    分析思路:当数据变多的适合,O(n方)的复杂度就不适合了此时发现弧度可以累加,k可以累乘考虑再开辟两个数组,分别存放从操作一到操作n的累乘、累加和在使用时,就不需要再一遍遍加,只用让m_roof的减去或者除以m_ground即可注意:!!!!下表的m_ground需要再减1,因为这个时候才相当于从m_ground......
  • ccfcsp 2023-09-02
    问题:a。80分档1.对于下标:题目中要求了下表n是从1开始2.cout时要cout<<fixed<<value 注意要fixed才能够输出完整的,不然只会输出前六位加上,且用e的形式表示 代码:#include<iostream>#include<math.h>usingnamespacestd;intmain(){  //ncaozuomgeshu ......
  • [Deeplearning] 20210919小学组 取数游戏
    首先明确一下贪心策略:两人必然会从大往小取当自己无法得分时,最优策略就是不让对方得分当自己可以得分时,得分所以,最后只需要便利数组,当A或B能得分时便得分,不能得分就不得分,但是不管能否得分都需要将最大的数取出代码:#include<bits/stdc++.h>usingnamespacestd;intn,a[......
  • 前缀和、差分
    前缀和、差分前缀和可以快速求区间和。差分相当于前缀和的逆运算。前缀和、差分都是以空间换时间的算法前缀和定义前缀和可以简单理解为「数列的前n项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。一维前缀和题目一LuoguP8218【深进1.例1】求区间和#in......
  • 单端信号和差分信号
    单端信号和差分信号是两种常见的数字信号传输方式:单端信号:-使用单线传输信号,地线作为参考电平。-发送端将数字信号直接发送到传输线上。-接收端根据传输线上的电平高低判断数字信号是1还是0。-优点是实现简单,只需要一条传输线。-缺点是易受外界电磁干扰,传输距离较短。差分......
  • DOJ-team-match 7-20210919小学组-取数游戏
    DOJ-team-match7-20210919小学组-取数游戏取数游戏题目传送门首先明确一下贪心策略:两人必然会从大往小取当自己无法得分时,最优策略就是不让对方得分当自己可以得分时,得分所以,最后只需要便利数组,当A或B能得分时便得分,不能得分就不得分,但是不管能否得分都需要将最大的数取......
  • 差分与前缀和学习笔记
    本来是不想写这篇博客的,但为了课前十分钟还是来水一发前缀和简介继续引用OI-Wiki的话(OI-Wiki$yyds$!):前缀和可以简单理解为「数列的前$n$项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。也就是说,我们能使用$O(n)$的时间进行预处理,在$O(1)$的时间内求出......