日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[洛谷P1438] 无聊的数列

發(fā)布時(shí)間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [洛谷P1438] 无聊的数列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

洛谷題目鏈接:無聊的數(shù)列

題目背景

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

題目描述

維護(hù)一個(gè)數(shù)列{a[i]},支持兩種操作:

1、1 L R K D:給出一個(gè)長度等于R-L+1的等差數(shù)列,首項(xiàng)為K,公差為D,并將它對(duì)應(yīng)加到a[L]~a[R]的每一個(gè)數(shù)上。即:令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個(gè)數(shù)的值a[P]。

輸入輸出格式

輸入格式:

第一行兩個(gè)整數(shù)數(shù)n,m,表示數(shù)列長度和操作個(gè)數(shù)。

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

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

1 L R K D

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

輸出格式:

對(duì)于每個(gè)詢問,輸出答案,每個(gè)答案占一行。

輸入輸出樣例

輸入樣例#1: 復(fù)制

5 2
1 2 3 4 5
1 2 4 1 2
2 3

輸出樣例#1: 復(fù)制

6

說明

數(shù)據(jù)規(guī)模:

0≤n,m≤100000

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

分析一下題意:給出一個(gè)長度為n的序列,m次操作,單點(diǎn)修改和區(qū)間修改,單點(diǎn)查詢.

做法:

  • 差分記錄修改
  • 線段樹維護(hù)區(qū)間
  • 查詢時(shí)輸出修改的值加原值

下面貼一下代碼:

#include<bits/stdc++.h> #define ll(x) (x<<1) #define rr(x) (x<<1|1) using namespace std; const int N=100000+5;int n, m, w[N];struct segment_tree{int l, r, sum, tag; }t[N*4];int gi(){int ans = 0 , f = 1; char i = getchar();while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}return ans * f; }void up(int x){t[x].sum = t[ll(x)].sum+t[rr(x)].sum; }void build(int node,int l,int r){t[node].l = l; t[node].r = r;if(l == r) return;int mid = (l+r>>1);build(ll(node),l,mid);build(rr(node),mid+1,r);up(node); }void pushdown(int node){int ls = ll(node), rs = rr(node), tag = t[node].tag;int l = t[node].l, r = t[node].r , mid = (l+r>>1);t[ls].tag += tag; t[rs].tag += tag;t[ls].sum += tag*(mid-l+1); t[rs].sum += tag*(r-mid);t[node].tag = 0; }void updata(int node,int l,int r,int val){if(l <= t[node].l && t[node].r <= r){t[node].tag += val;t[node].sum += val*(t[node].r-t[node].l+1);return;}if(t[node].tag) pushdown(node);int mid = (t[node].l+t[node].r>>1);if(l <= mid) updata(ll(node),l,r,val);if(mid < r) updata(rr(node),l,r,val);up(node); }int query(int node,int l,int r){if(l <= t[node].l && t[node].r <= r) return t[node].sum;if(r < t[node].l || t[node].r < l) return 0;if(t[node].tag) pushdown(node);return query(ll(node),l,r)+query(rr(node),l,r); }int main(){//freopen("data.in","r",stdin);int flag, l, r, k, d; n = gi(); m = gi();for(int i=1;i<=n;i++) w[i] = gi();build(1,1,n);while(m--){flag = gi(); l = gi();if(flag == 1){r = gi(); k = gi(); d = gi();updata(1,l+1,r,d); updata(1,l,l,k);if(r+1 <= n) updata(1,r+1,r+1,-d*(r-l)-k);//因?yàn)榻涞臅r(shí)候沒有建n+1的下標(biāo),所以特判防越界}else printf("%d\n",w[l]+query(1,1,l));}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/BCOI/p/8867637.html

總結(jié)

以上是生活随笔為你收集整理的[洛谷P1438] 无聊的数列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。