原題鏈結
考察:樹狀陣列
確實簡單....就是差分+樹狀陣列即可.本蒟蒻還以為又有什麼神乎其神的優化.....
思路:我們先看第乙個指令:第一類指令形如c l r d
,表示把數列中第 l∼r
'>l∼r 個數都加
l∼
r'>l∼
r'>d
'>d
。l∼r
'>d
'>l~r區間內+d
l∼r
'>d
'>.l∼
r'>d
'>單看這個操作容易想到差分. 即 修改b[l]與b[r+1]l∼
r'>d
'>l∼
r'>d
'>再看第二個指令:第二類指令形如q x
,表示詢問數列中第 x
'>
x 個數的值。
l∼
r'>d
'>x
'>
x
'>
x'>配合上乙個指令的差分陣列.這裡如果考慮差分就是求x的字首和.l∼
r'>d
'>x
'>我們綜合來看,修改b陣列兩個單點的值,求x的字首和.這正好對應樹狀陣列的操作.因此可以用樹狀陣列優化時間複雜度.
1 #include 2 #include 3using
namespace
std;
4 typedef long
long
ll;5
const
int n = 100010;6
ll b[n],m,n,tr[n];
7char s[2];8
void insert(int l,int r,intx)9
12int lowbit(int
x)13
16void add(int k,int
x)17
20 ll ask(int
x)21
26int
main()
2734
for(int i=1;i<=n;i++) add(i,b[i]);
35while(m--)
3640 scanf("
%d%d
",&r,&x);
41 add(l,x); add(r+1,-x);42}
43return0;
44 }
acwing 242 乙個簡單的整數問題
給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的格式如題...
Acwing 242 乙個簡單的整數問題
給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的格式如題...
一天乙個演算法題 簡單的 求乙個整數的反序列整數。
例如 現在有整數1234,輸出4321整數,問題摘自 演算法實現的不夠好.package com.jue.numberreverse public class numberreverse public static int getreversedatanumber int old int newda...