语文成绩
題目背景
語文考試結束了,成績還是一如既往地有問題。
題目描述
語文老師總是寫錯成績,所以當她修改成績的時候,總是累得不行。她總是要一遍遍地給某些同學增加分數,又要注意最低分是多少。你能幫幫她嗎?
//這又跟神器有什么關系呢?神說:呵呵。
//因為n和p的范圍比較大 建議C++選手使用scanf讀入.
//同時建議寫讀入優化....
//最后一個點,親測pas讀入800+ms,c/C++的scanf 1200+ms,所以這個點的時限改為2s
輸入格式
第一行有兩個整數n,p,代表學生數與增加分數的次數。
第二行有n個數,a1~an,代表各個學生的初始成績。
接下來p行,每行有三個數,x,y,z,代表給第x個到第y個學生每人增加z分。
輸出格式
輸出僅一行,代表更改分數后,全班的最低分。
輸入輸出樣例
輸入 #1復制 3 2 1 1 1 1 2 1 2 3 1 輸出 #1復制 2說明/提示
對于40%的數據,有n<=1000
對于60%的數據,有n<=10000
對于80%的數據,有n<=100000
對于100%的數據,有n<=5000000,p<=n,學生初始成績<=100,z<=100
?
?
?
可以拿線段樹做,但我是拿差分數組做的,比線段樹要快,O(n),的時間復雜度。
?
#include<cstdio> #include<iostream> using namespace std;int n,i,p,j,a[5000005],x,y,z,w[5000005];inline int read() {int x=0;char ch=getchar();char c=ch;while(ch>'9'||ch<'0')c=ch,ch=getchar();while(ch<='9'&&ch>= '0')x=x*10+ch-'0',ch=getchar();if(c=='-')x=x*-1;return x; }int main(){n=read();p=read();for(i=1;i<=n;i++){a[i]=read();w[i]=a[i]-a[i-1];}while(p--){x=read();y=read();z=read();w[x]+=z;w[y+1]-=z;}int ans=w[1];for(i=1;i<=n;i++){a[i]=a[i-1]+w[i];ans=min(ans,a[i]);}printf("%d",ans);return 0; }?
轉載于:https://www.cnblogs.com/hrj1/p/11143008.html
總結
- 上一篇: 搭建ELK-流水账-只记思路
- 下一篇: 项目培训计划表