1. 程式人生 > >P1438 無聊的數列

P1438 無聊的數列

查詢 printf ctype pen 兩個 modify urn scan 需要

P1438 無聊的數列

題目背景

無聊的YYB總喜歡搞出一些正常人無法搞出的東西。有一天,無聊的YYB想出了一道無聊的題:無聊的數列。。。(K峰:這題不是傻X題嗎)

題目描述

維護一個數列{a[i]},支持兩種操作:

1、1 L R K D:給出一個長度等於R-L+1的等差數列,首項為K,公差為D,並將它對應加到a[L]~a[R]的每一個數上。即:令a[L]=a[L]+K,a[L+1]=a[L+1]+K+D,

a[L+2]=a[L+2]+K+2D……a[R]=a[R]+K+(R-L)D。

2、2 P:詢問序列的第P個數的值a[P]。

輸入輸出格式

輸入格式:

第一行兩個整數數n,m,表示數列長度和操作個數。

第二行n個整數,第i個數表示a[i](i=1,2,3…,n)。

接下來的m行,表示m個操作,有兩種形式:

1 L R K D

2 P 字母意義見描述(L≤R)。

輸出格式:

對於每個詢問,輸出答案,每個答案占一行。

輸入輸出樣例

輸入樣例#1:
5 2
1 2 3 4 5
1 2 4 1 2
2 3
輸出樣例#1:
6

說明

數據規模:

0≤n,m≤100000

|a[i]|,|K|,|D|≤200

Hint:

有沒有巧妙的做法?

技術分享
 1 /*
 2     其實並不是維護一個等差序列
 3     只需要維護l~r區間的首項 k 和公差 d 就好了
 4     l~r 的子區間 x~y 的首項 k‘=k+d*(x-l);
 5     d‘=d;
 6     查詢的時候 不要把標記忘了 其實標記不需要下放 
 7     但是 這題有毒 我用讀入優化 2個TLE
 8     換成scanf結果就AC了 
 9 */
10 #include <ctype.h>
11 #include <cstdio>
12 
13 const int MAXN=100010
; 14 15 struct node { 16 int l,r; 17 int sum; 18 int k,d; 19 }; 20 node t[MAXN<<2]; 21 22 int n,m,k,d; 23 24 int a[MAXN]; 25 26 inline void build_tree(int now,int l,int r) { 27 t[now].l=l,t[now].r=r; 28 if(l==r) { 29 scanf("%d",&t[now].sum); 30 return; 31 } 32 int mid=(l+r)>>1; 33 build_tree(now<<1,l,mid); 34 build_tree(now<<1|1,mid+1,r); 35 } 36 37 void modify(int now,int l,int r) { 38 if(l<=t[now].l&&r>=t[now].r) { 39 t[now].k+=k+d*(t[now].l-l); 40 t[now].d+=d; 41 return; 42 } 43 int mid=(t[now].l+t[now].r)>>1; 44 if(l<=mid) modify(now<<1,l,r); 45 if(r>mid) modify(now<<1|1,l,r); 46 } 47 48 int query(int now,int pos) { 49 if(t[now].l==t[now].r) return t[now].sum+t[now].k; 50 int ans=t[now].k+t[now].d*(pos-t[now].l); 51 int mid=(t[now].l+t[now].r)>>1; 52 if(pos<=mid) return ans+query(now<<1,pos); 53 if(pos>mid) return ans+query(now<<1|1,pos); 54 } 55 56 int hh() { 57 int flag,l,r; 58 scanf("%d%d",&n,&m); 59 build_tree(1,1,n); 60 for(int i=1;i<=m;++i) { 61 scanf("%d",&flag); 62 if(flag==1) { 63 scanf("%d%d%d%d",&l,&r,&k,&d); 64 modify(1,l,r); 65 } 66 else { 67 scanf("%d",&l); 68 printf("%d\n",query(1,l)); 69 } 70 } 71 } 72 73 int sb=hh(); 74 int main() {;}
代碼

P1438 無聊的數列