---
# System prepended metadata

title: 1-2難題筆記
tags: [文華社課]

---

---
tags: 文華社課
---
> 文華高中電腦研究社29th
> 編輯 : 黃昱凱

# 1-2難題筆記
前綴和預處理
時間複雜度:**O(n * n) -> O(n)**
可以快速計算區間和
初始化 第一項為原值
即pre[1] = a[1] 或 pre[0] = 0
接著每項是前項之和
即pre[i] = pre[i-1] + a[i];

區間[l, r]的值即為
pre[r] - pre[l-1]
## a693:
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define N 100005
    int pre[N] = {0};  //Initialization 
    int a[N];
    int n, m;
int main(){
    cin >> n >> m;
    for(int i = 1;i <= n;i ++){
        cin >> a[i];
    }
    pre[0] = 0;
    for(int i = 1;i <= n;i ++){ // fills prefix sum array
        pre[i] = pre[i-1] + a[i];
    }
    for(int i = 0;i < m;i ++){
        int l, r;
        cin >> l >> r;
        cout << pre[r] - pre[l-1] <<endl;
    }
    return 0;
}
```
## a015
有時候陣列如果讀到範圍以外的值會導致RE
可以稍微開大一點
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define N 105
#define M 105
int main(){
    int n, m;
    while(cin >> n >> m){
        int a[n+5][m+5];//開大一點比較沒問題
        int ans[n+5][m+5];
        for(int i = 0;i < n;i ++){
            for(int j = 0;j < m;j ++){
                cin >> a[i][j];
            }
        }
        swap(n, m);
        for(int i = 0;i < n;i ++){
            for(int j = 0;j < m;j ++){
                ans[i][j] = a[j][i];
                cout << ans[i][j] <<" ";
            }
            cout << endl;
        }
    }
    return 0;
}
```