問題描述
有n個格仔,從左到右放成一排,編號為1-n。
共有m次操作,有3種操作型別:
1.修改乙個格仔的權值,
2.求連續一段格仔權值和,
3.求連續一段格仔的最大值。
對於每個2、3操作輸出你所求出的結果。
輸入格式
第一行2個整數n,m。
接下來一行n個整數表示n個格仔的初始權值。
接下來m行,每行3個整數p,x,y,p表示操作型別,p=1時表示修改格仔x的權值為y,p=2時表示求區間[x,y]內格仔權值和,p=3時表示求區間[x,y]內格仔最大的權值。
輸出格式
有若干行,行數等於p=2或3的操作總數。
每行1個整數,對應了每個p=2或3操作的結果。
樣例輸入
4 31 2 3 4
2 1 3
1 4 3
3 1 4
樣例輸出63
資料規模與約定
對於20%的資料n <= 100,m <= 200。
對於50%的資料n <= 5000,m <= 5000。
對於100%的資料1 <= n <= 100000,m <= 100000,0 <= 格仔權值 <= 10000
用線段樹來解題,一開始的時候結點空間開小了= =
因為n個格仔,用線段樹的話一共會有2*n-1個結點,所以我不小心就開了2*n-1個結點的空間
結果。。。一半超時。。
修改後發現還是有乙個用例超時,上**:
#include#includeusing namespace std;
const int max_n = 100005;
#define max(a,b) a>b?a:b
struct nodenode[10 * max_n];
int nodevalue[max_n];
//建樹
void buildtree(int i, int left, int right)
else
}//區間更新
void update(int i, int x, int changedx)
else
}//查詢區間最大值
//i表示node[i]結點,left,right表示查詢範圍
int findmax(int i, int left, int right)
if (left <= node[2 * i].right)
else
}if (right >= node[2 * i + 1].left)
else
}return maxvalue;
}//查詢區間數值之和
int findtotal(int i, int left, int right)
if (left <= node[2 * i].right)
else
}if (right >= node[2 * i + 1].left)
else
}return total;
}int main()
}
然後我修改了一下,不要在每乙個查詢區間數值方法裡面比較最大值和總和,而是在left == right的時候才比較最大值和總和。
ac**:
#include#includeusing namespace std;
const int max_n = 100005;
#define max(a,b) a>b?a:b
struct nodenode[10 * max_n];
int nodevalue[max_n];
int maxvalue = -1;
int totalvalue = 0;
//建樹
void buildtree(int i, int left, int right)
else
}//區間更新
void update(int i, int x, int changedx)
else
}//查詢區間最大值
//i表示node[i]結點,left,right表示查詢範圍
void findmax(int i, int left, int right)
if (left <= node[2 * i].right)
else
}if (right >= node[2 * i + 1].left)
else
}}//查詢區間數值之和
void findtotal(int i, int left, int right)
if (left <= node[2 * i].right)
else
}if (right >= node[2 * i + 1].left)
else
}}int main()}/*
for(int j = 1;j<=2*n-1;j++)
*//*
cout<<"1 到 4號格仔最大值: "
}
藍橋杯 ALGO 8 演算法訓練 操作格仔(線段樹)
問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p...
藍橋杯 ALGO 8(線段樹)
演算法訓練 操作格仔 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m...
藍橋杯 演算法訓練 ALGO12
問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,則第i個數比第i 2個數大。比如,當k 3時,有...