除了平時做練習賽外,現在主要學習數論與資料結構,資料結構丟了好久了,重新學習還是發現了很多問題!
題意:在每個測試的第一行,是兩個正整數 n 和 m ( 0< n <= 100000, 0 < m <= 100000 ),分別代表學生的數目和操作的數目。
學生id編號分別從 1 編到 n。
第二行包含 n 個整數(範圍在 0 到 100 ),代表這 n 個學生的初始成績,其中第 i 個數代表 id 為 i 的學生的成績。
接下來有 m 行,每行有三個數,意思如下:
先輸入乙個數x,然後分兩種情況:
(1 <= x <= 2^31-1)
若x^x%999997是乙個素數,則再輸入兩個數a,b,
意思是將id為 a 的學生的成績更新成b (1 <= a <= n, 0 <= b <= 100)
若x^x%999997不是乙個素數,則再輸入兩個數le,ri,
意思是輸出區間【le,ri】中的學生的最低成績、最高成績、成績總和 (1 <= le <= ri <= n)
sample input
2 869 24
131744484 1 1
598487296 2 2
542004961 2 2
241081 1 2
23299929 2 36
213276816 1 2
85264 1 2
350288656 1 2
sample output
69 69 69
24 24 24
24 24 24
24 69 93
36 69 105
36 69 105
36 69 105
hint
【特別說明】
在本題中,我們認為0和1也是素數!!!!
#include#includeusing namespace std;
#define maxn 100005
#define maxn1 1000005
#define mod 999997
#define ll __int64
struct data
tree[3*maxn];
int a[maxn];
bool prime[maxn1];
int min(int p,int q)
void init()
void change(int p,int i,int x)
if(i<=tree[p<<1].r)
change(p<<1,i,x);
else
change(p<<1|1,i,x);
tree[p].minp=min(tree[p<<1].minp,tree[p<<1|1].minp);
tree[p].maxp=max(tree[p<<1].maxp,tree[p<<1|1].maxp);
tree[p].sump=tree[p<<1].sump+tree[p<<1|1].sump;
}data query(int p,int l,int r)
int main()
} }return 0;
}
杭電1754 線段樹(單點更新 區間最值)
杭電1754原題傳送門 線段樹單點更新詳解傳送門 寫在最前面 用scanf printf 代替cin cout 時間少的不是一點點。同樣的 scanf能過,cin超時。嗯,玄學做題。已過 include include include include using namespace std cons...
HDU 4032 線段樹單點更新 區間最值
1.題目鏈結。題目大意 在一段長為n的線段上,有m個操作。某人起始點在0,現在他想吃餡餅,m個操作種,第一種為在某個點長出來乙個餡餅,第二個為這個人要開始吃餡餅。吃餡餅的時候,總是找距離的當前點最近的那個點去吃,如果發現有兩個最近點,那麼就按照上一次的方向去吃。問最後操作完,這個人走了多長的距離?2...
單點更新,區間查詢線段樹
線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...