Description
有一列元素,每一个元素有三个属性:标号、标识符、数值。这些元素按照标号从1~n排列,标识符也是1~n的一个排列,初始时数值为0。当然我们可以把每个元素看成一个多维数字,那么这列元素就是一个数列。
现在请你维护这个数列,使其能支持以下两种操作:1.将标号为l~r的所有元素的数值先乘上x,再加上y;2.将标识符为l~r的所有元素的数值先乘上x,再加上y。当然你还得回答某些询问:1.标号为l~r的所有元素的数值的和;2.标识符为l~r的所有元素的数值的和。

Input
第一行有两个正整数n、m,分别表示数列长度和操作与询问个数的总和。第二行有n个正整数,表示每个元素的标识符,保证这n个数是1~n的一个排列。接下来m行,每行的第一个数字为op。若op为0,则表示要进行第一个操作,接下去四个数字表示l,r,x,y;若op为1,则表示要进行第二个操作,接下去四个数字表示l,r,x,y;若op为2,则表示要回答第一个询问,接下去两个数字表示l,r;若op为3,则表示要回答第二个询问,接下去两个数字表示l,r。

Output
包含若干行,每行表示一个询问的答案。由于答案可能很大,只要请你输出答案对536870912取模后的值即可。

Sample Input
4 4
2 1 4 3
0 2 3 4 5
1 1 3 4 7
2 1 1
3 1 1

Sample Output
7
27

HINT
第一次操作后,数列变为0 5 5 0
第二次操作后,数列变为7 27 5 7
N,M<=50000, 1<=L<=R<=N 0<=X,Y<=2^31-1


KD-Tree裸题,将\(a_i\)看做平面上的点\((i,p_i)\),每次操作都是一个矩形

支持打标记,复杂度\(O(n\sqrt{n})\)

然后你发现Bzoj死活过不去

卡了1h多的常无果……网上搜索取模优化……顺便看了一下膜数转二进制后的结果……

膜数=\(2^{29}\)……

我#$%&#&(脏话)

然后这题就过了……

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){int x=0,f=1; char ch=gc();for (;ch<'0'||ch>'9';ch=gc())   if (ch=='-')    f=-1;for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';return x*f;
}
inline int read(){int x=0,f=1; char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar())  if (ch=='-')    f=-1;for (;ch>='0'&&ch<='9';ch=getchar())    x=(x<<3)+(x<<1)+ch-'0';return x*f;
}
inline void print(int x){if (x<0)    putchar('-'),x=-x;if (x>9)    print(x/10);putchar(x%10+'0');
}
const int N=5e4,Mod=536870912;
int n,m,T;
struct S1{#define ls(x) tree[x].ls#define rs(x) tree[x].rsint tot,root;struct node{int type,ls,rs,v[2],Max[2],Min[2],val;int cnt,mlt,sum,len;bool operator <(const node &tis)const{return v[T]<tis.v[T];}}tree[N+10];void Add(int *a,int v){a[0]=a[1]=v;}void updata(int p){tree[p].Min[0]=min(tree[p].v[0],min(tree[ls(p)].Min[0],tree[rs(p)].Min[0]));tree[p].Min[1]=min(tree[p].v[1],min(tree[ls(p)].Min[1],tree[rs(p)].Min[1]));tree[p].Max[0]=max(tree[p].v[0],max(tree[ls(p)].Max[0],tree[rs(p)].Max[0]));tree[p].Max[1]=max(tree[p].v[1],max(tree[ls(p)].Max[1],tree[rs(p)].Max[1]));}int build(int l,int r,int type){T=type;int mid=(l+r)>>1,p=mid;nth_element(tree+l,tree+mid,tree+r+1);tree[p].type=type,tree[p].mlt=1,tree[p].len=r-l+1;if (l<mid)  ls(p)=build(l,mid-1,type^1);if (r>mid)  rs(p)=build(mid+1,r,type^1);updata(p);return p;}void init(){Add(tree[0].Max,-inf),Add(tree[0].Min,inf);for (int i=1;i<=n;i++)  tree[i].v[0]=i,tree[i].v[1]=read();root=build(1,tot=n,0);}void Add_mlt(int p,int v){tree[p].val*=v;tree[p].sum*=v;tree[p].mlt*=v;tree[p].cnt*=v;}void Add_cnt(int p,int v){tree[p].val+=v;tree[p].cnt+=v;tree[p].sum+=tree[p].len*v;}void pushdown(int p){if (tree[p].mlt!=1){Add_mlt(ls(p),tree[p].mlt);Add_mlt(rs(p),tree[p].mlt);tree[p].mlt=1;}if (tree[p].cnt){Add_cnt(ls(p),tree[p].cnt);Add_cnt(rs(p),tree[p].cnt);tree[p].cnt=0;}}void Modify(int p,int x,int y,int mv,int cv){//cnt_v,mlt_vif (x>tree[p].Max[T]||y<tree[p].Min[T]) return;if (x<=tree[p].Min[T]&&tree[p].Max[T]<=y){Add_mlt(p,mv),Add_cnt(p,cv);return;}pushdown(p);if (x<=tree[p].v[T]&&tree[p].v[T]<=y)   (tree[p].val*=mv)+=cv;Modify(ls(p),x,y,mv,cv),Modify(rs(p),x,y,mv,cv);tree[p].sum=tree[ls(p)].sum+tree[rs(p)].sum+tree[p].val;}int Query(int p,int x,int y){if (x>tree[p].Max[T]||y<tree[p].Min[T]) return 0;if (x<=tree[p].Min[T]&&tree[p].Max[T]<=y)   return tree[p].sum;pushdown(p);int res=Query(ls(p),x,y)+Query(rs(p),x,y);if (x<=tree[p].v[T]&&tree[p].v[T]<=y)   res+=tree[p].val;return res;}
}KD;//K-D Tree
int main(){n=read(),m=read();KD.init();for (int i=1;i<=m;i++){int type=read();if (type<=1){int l=read(),r=read(),x=read(),y=read();T=type;KD.Modify(KD.root,l,r,x,y);}if (type>1){int l=read(),r=read();T=type-2;printf("%d\n",KD.Query(KD.root,l,r)&(Mod-1));}}return 0;
}

转载于:https://www.cnblogs.com/Wolfycz/p/10262475.html

[BZOJ4303]数列相关推荐

  1. BZOJ4303 : 数列

    将每个点看成二维坐标点$(i,a_i)$,那么每次操作的范围都是一个矩形. 于是建立KD-Tree,通过打标记支持操作即可. 时间复杂度$O(m\sqrt{n})$. #include<cstd ...

  2. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

  3. 剑指offer:面试题10- I. 斐波那契数列

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...

  4. [NOI2005]维护数列

    输入格式 输入文件的第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目. 第 2 行包含 N 个数字,描述初始时的数列. 以下 M 行,每行一条命令,格式参见问题 ...

  5. 【BZOJ4282】慎二的随机数列 乱搞

    [BZOJ4282]慎二的随机数列 Description 间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列, 准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦夕 ...

  6. 用递归法计算斐波那契数列的第n项

     斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...

  7. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

  8. 用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?

    自己写的,感觉挺有成就感的,就展示出来吧! 判断一个≥2的整型数是否存在于斐波那契数列中? 若存在,则返回第几项:若不在,则返回-1 #include <stdio.h> long gen ...

  9. 算法(1)斐波那契数列

    1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...

  10. NOIP模拟题 斐波那契数列

    题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...

最新文章

  1. YOLOv5x6模型来了! 同样支持CPU上ONNX部署与推理
  2. 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]
  3. java 静态方法上的泛型
  4. python概述_Python-概述
  5. 编译器不识别stm指令_编译器简介
  6. 处理数字_5_非NULL值的列的个数
  7. 装车机器人_15秒装车!行李智能分拣机器人亮相厦门机场
  8. Java黑皮书课后题第5章:5.11(找出能被5或6整除的数,但不能同时整除)编写程序,显示从100到1000之间能被5或6整除但不能同时整除的数,每行显示10个。数字之间用一个空格字符隔开
  9. 电信运营商x86服务器定制策略
  10. 整合 centos安装python的介绍
  11. python 电脑文件变动提醒_Python整理文件方法,效率提升100倍-docx是什么文件
  12. 51NOD-1027 大数乘法【大数】
  13. c语言进度条窗口,【C语言】进度条实现
  14. c语言编程中的幂函数如何编写,c语言幂函数_C语言循环与递归实现整数幂函数...
  15. C#——NPOI对Excel的操作、导入导出时异常处理(三)
  16. U盘直装CentOS 8并配置服务器环境教程指南
  17. zoj 2476 Total Amount
  18. 5G知识之5G技术指标、应用场景及相关技术(零星版)
  19. 超人视觉怎么样/机器视觉培训适合报培训班吗
  20. C语言三位数分别输出个位十位百位

热门文章

  1. java条件运算符类型转换_Java数据类型、运算符及类型转换
  2. 小熊派鸿蒙开发版,小熊派IoT开发板系列教程合集
  3. spring5.0学习笔记3
  4. spring5.0学习笔记1
  5. 在Python中使用XGBoost和scikit-learn进行随机梯度增强
  6. Anscombe's Quartet 问题
  7. 机器学习十大算法的核心思想、工作原理、适用 情况及优缺点
  8. h5 如何录音保存上传_H5录音及保存到后台recorder.js实现
  9. 如何使用JdbcTemplate实现数据的增删改查?
  10. python点击屏幕_python实现鼠标自动点击屏幕