1687 陣列操作(非常規思維)

2021-09-02 05:16:08 字數 1706 閱讀 7027

1687: 陣列操作

time limit: 1 sec memory limit: 128 mb

[submit][status][web board]

description

給你乙個初始的長度為n的陣列。(1<=n<=105)

有兩個操作:

op1(l, r):給兩個整數l和r(1<=l<=r<=當前陣列長度)。你需要計算陣列從l到r的所有元素的和。

op2(x):給你乙個整數x(|x| <= 109),你需要將x新增到陣列的頭部。原先的第乙個元素變成第二個元素,第二個元素變成第三個,以此類推。並且陣列的長度增加1.

input

多組測試資料,處理到檔案結尾。

每組測試資料,首先給出乙個n(1 <= n <= 105), 表示初始的陣列的元素個數。

第二行n個數字表示初始陣列的n個元素,a1 a2 … an.(|ai| <= 109)。

第三行有乙個q,表示有q個操作。1 <= q <= 105

接下來q行,每行的第乙個數表示操作的型別,只可能是1或者2,形式如下:

1 l r:操作1,求l到r的元素的和。

2 x:操作2,將x新增到陣列頭部。

output

對於每組測試資料,首先輸出"case x:",表示當前是第x組測試資料。

然後對於每個操作1輸出對應的答案,對於操作2不需要任何輸出。

sample input

101 2 3 4 5 6 7 8 9 10

41 1 10

1 1 1

1 10 10

1 2 7

56 7 8 9 10

92 5

2 41 2 7

2 32 2

2 11 1 10

1 1 1

1 10 10

sample output

case 1:551

1027

case 2:

4555110

hint

source

ac**~:

#include #include long long a[200005],b[200005];

int main()

for(int j = 1; j <= n; j++)//最後乙個數到倒數第j個數的和

int q,num,t;

scanf("%d",&q);

printf("case %d:\n",++c);

while(q--)

else}}

return 0;

}

(用動態陣列+數狀陣列)時間超限**:

//時間超限,樹狀陣列中整合陣列c更新慢(每次加乙個數要更新,耗時啊!!)

#include #include using namespace std;

vectora(200005),c(200005);

int n;

int lowbit(int x)

long long sum(int y)

void update(int y,int k)

int main()

scanf("%d",&q);

printf("case %d:\n",++c);

while(q--)

else}}

}return 0;

}

程式設計的非常規總結

1 將問題簡化,從比較簡單的情況開始分析,比如1個元素情況,2個元素情況,3個元素情況,不斷增加,尋找規律,這樣有利於發現規律,從而解決問題,並且也有利於處理邊界情況。比如程式設計之美1.11 又如送貨站選址問題 1的個數問題等都可一通過逐漸的分析加以解決 2 從比較簡單的例子,模擬程式執行過程,比...

Ubuntu非常規命令tips

最後利用 update rc.d 命令更新系統啟動項 如 sudo update rc.d disable transparent hugepages defaults p.s.disable transparent hugepages在文末 update alternatives display ...

非常規應用 bbed介紹

bbed安裝 cd oracle home rdbms lib make f ins rdbms.mk oracle home rdbms lib bbed 也可通過以下命令將bbed生成到 oracle home bin目錄 make f ins rdbms.mk bbed oracle home...