[JSOI2009]等差数列

2021-04-21 22:28

阅读:320

标签:href   题目   title   printf   pushd   分数   ons   修改   ||   

第一篇博客哒

  • 题面 https://www.luogu.com.cn/problem/P4243

首先看到区间加等差数列我们可以首先想到使用差分数组

就是记一个bi=ai+1-ai

然后每次修改a到ar就只用将bl-1,br单点修改,bl至br-1区间修改就可以了

区间修改?我们首先想到了线段树

线段树可以维护是否为等差数列吗???

可以!

每个结点维护上啥线段树必要的l,r,lazy标记什么的在多维护一个结构体val

val 里面有什么呢?

首先为了下面转移方便维护区间最左边lv,最右边的点的值rv

然后维护ls,rs,nos,lrs

分别表示[l,r) (l,r] (l,r) [l,r] 区间的答案

开始转移

我们考虑合并区间a,和区间b

考虑ar bl这两个点

有以下三种情况

  1. 可以直接合并。如果两者的差值相同,则可以将原来的等差数列合并为一个
  2. a两侧都不选,左边的右端点作为一个等差数列的首项(所以不选),b就要选择左端点(因为他不用考虑做首项了)
  3. a选右端点,b的左端点作为一个等差数列的首项,所以b两边都不选

如何操作,看代码吧

#include
inline int min(int a,int b){return avoid read(T &x){
    x=0;int f=0;char ch=getchar();
    while(ch‘9‘) {f|=(ch==‘-‘);ch=getchar();}
    while(ch>=‘0‘&&ch>1;
  build(pos>1;
  if(ymid) modify(pos>1;
  pushdown(pos);
  if(ymid) return query(pos

  

 

[JSOI2009]等差数列

标签:href   题目   title   printf   pushd   分数   ons   修改   ||   

原文地址:https://www.cnblogs.com/Phoenix41/p/12247103.html

上一篇:vue.js三种安装方式

下一篇:JS定时器


评论


亲,登录后才可以留言!