BZOJ3922 Karin的弹幕 [线段树]
来源:互联网 发布:哪呢儿软件下载 编辑:程序博客网 时间:2024/06/04 23:20
Notice:九月份月赛将于本周五晚六点到十一点进行,欢迎大家参加,鸣谢Claris主持,欢迎进群633587999交流!
Problem 3922. – Karin的弹幕
3922: Karin的弹幕
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 607 Solved: 231
[Submit][Status][Discuss]
Description
Karin在战斗之余的闲暇时光里喜欢上B站看鬼畜视频,尤其喜欢发弹幕。她这天对一个视频的弹幕产生了兴趣,她记录了每个时间点的弹幕数量,并且可能对一段呈等差数列的时间的弹幕数量求最大值;她还可能修改某个时间点的弹幕数量。
为了不在Yuuna面前暴露出她弱爆了的数学能力,保持她傲娇的属性,你需要帮助她。
精简题意:给定一个序列,支持以下操作:①对一段下标是等差数列的子序列进行求最大值操作(参见输入格式);②单点修改。
Input
第一行是一个整数n,
第二行是一个长度为n的整数序列a1…an,
第三行是一个整数m,
接下来m行,每行首先有一个整数op,
然后,若op=0,则之后有两个整数p,v,代表将a[p]的值加上v,
若op=1,则之后有两个整数x0,d,代表询问max{a[x0],a[x0+d],a[x0+2d],…,a[x0+kd]}(x0+kd<=n,x0+(k+1)d>n)。
数据中可能有多余空格。
Output
对每个op=1,单独输出一行,代表该等差子序列的最大值。
Sample Input
【输入样例1】
10
1 6 1 4 9 4 8 2 8 5
10
1 3 3
0 5 4
0 3 8
1 2 5
1 4 8
1 7 5
1 3 6
0 1 2
1 5 3
1 4 9
【输入样例2】
10
-9 -6 2 -10 -2 -6 10 6 -4 -2
10
1 2 3
1 6 3
0 7 8
0 4 -6
0 10 -5
1 10 4
0 3 -8
1 2 4
0 10 -5
1 1 2
10
1 6 1 4 9 4 8 2 8 5
10
1 3 3
0 5 4
0 3 8
1 2 5
1 4 8
1 7 5
1 3 6
0 1 2
1 5 3
1 4 9
【输入样例2】
10
-9 -6 2 -10 -2 -6 10 6 -4 -2
10
1 2 3
1 6 3
0 7 8
0 4 -6
0 10 -5
1 10 4
0 3 -8
1 2 4
0 10 -5
1 1 2
Sample Output
【输出样例1】
8
8
4
8
9
13
4
【输出样例2】
6
-4
-7
-6
18
8
8
4
8
9
13
4
【输出样例2】
6
-4
-7
-6
18
HINT
【数据范围】
1<=n<=70000,
1<=m<=70000,
保证任何时刻abs(a[i])(1<=i<=n)<=2147483647,
0<=op<=1,
1<=p<=n,
abs(v)<=2147483647
1<=x0<=n,
1<=d<=n,
保证涉及的所有数在C++的int内。
2015.4.2新加四组数据
Source
本题题意就是对每个等差数列维护一棵线段树。
网上的大佬说差值为5好,那就5吧。。。。。
第一次把线段树写入struct中。。。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ls rt<<1#define rs rt<<1|1const int INF = 0x3f3f3f3f,N=3e5,M=5;using namespace std;int src[N],n,m;struct Segment_Tree{ int sum[N],st[N],en[N],c[N],t[N]; void up(int rt){ sum[rt]=max(sum[ls],sum[rs]); } void build(int rt=1,int l=1,int r=n){ if(l==r){ sum[rt]=t[l],c[l]=rt;return ; } int mid=l+r>>1; build(ls,l,mid),build(rs,mid+1,r),up(rt); } void init(int d){ int p=0; for(register int i=1;i<=d;i++){ for(register int k=i;k<=n;k+=d) st[k]=++p,t[p]=src[k]; for(int k=i;k<=n;k+=d)en[k]=p; } build(); } void add(int x,int w){ sum[x=c[st[x]]]+=w; for(x>>=1;x;x>>=1)up(x); } int query(int l,int r,int rt=1,int L=1,int R=n){ if(L==l&&r==R)return sum[rt]; register int mid=(L+R)>>1; if(r<=mid)return query(l,r,ls,L,mid); else if(l>mid)return query(l,r,rs,mid+1,R); else return max(query(l,mid,ls,L,mid),query(mid+1,r,rs,mid+1,R)); } int ask(int x){return query(st[x],en[x]);}}a[M+1];template<class T>inline void read(T &res){ static char ch;T flag=1; while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48; while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;}int main(){ read(n); for(register int i=1;i<=n;i++)read(src[i]); for(register int i=1;i<=M;i++)a[i].init(i); for(read(m);m--;){ int x,y,z; read(x),read(y),read(z); if(x==0){ src[y]+=z; for(register int i=1;i<=M;i++)a[i].add(y,z); }else{ if(z==0)printf("%d\n",src[y]); else if(z>M){ int ans=-INF; while(y<=n)ans=max(ans,src[y]),y+=z; printf("%d\n",ans); }else printf("%d\n",a[z].ask(y)); } } return 0;}
阅读全文
0 0
- 【BZOJ3922】Karin的弹幕 线段树&暴力
- BZOJ3922 Karin的弹幕 [线段树]
- 【BZOJ3922】Karin的弹幕
- BZOJ3922 Karin的弹幕
- BZOJ 3922 Karin的弹幕 线段树
- BZOJ 3922:Karin的弹幕 【线段树】+【暴力】
- BZOJ 3922: Karin的弹幕 线段树 暴力乱搞
- BZOJ 3922 Karin的弹幕 解题报告
- 自定义的弹幕效果
- 弹幕的简单实现
- 发射弹幕的Dialog
- 弹幕的开发(DanmakuFlameMaster)
- 带头像的弹幕
- 简单的弹幕效果
- 视频直播的弹幕
- Android的简易弹幕
- 简单的弹幕
- Android弹幕的实现
- 使用python切片实现二维数组复制
- 实现换肤的前章:Android资源管理机制
- Nginx tomcat SSL证书与Https应用部署
- 安卓应用下载自动安装代码
- GCD相关
- BZOJ3922 Karin的弹幕 [线段树]
- domain、entity和model的package的不同用法?
- Redis实战之多用户聊天室
- AC自动机模板
- Python3在win7下生成云图 学习python过程以及坑
- thinkphp5实战系列(三)入口文件隐藏和url路由优化
- ご馳走になる vs ご馳走する vs ご馳走様でした
- Android ViewPager Fragment 切换刷新数据,解决生命周期只走一次的问题
- 设计模式--观察者模式