COGS 36. 求和问题
生活随笔
收集整理的這篇文章主要介紹了
COGS 36. 求和问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間限制:1.2 s?? 內存限制:128 MB
【問題描述】 在一個長度為n的整數數列中取出連續的若干個數,并求它們的和。 【輸入格式】 輸入由若干行組成,第一行有一個整數n??? 第二行有n個整數
??? 第三行有一個整數m
??? 下面m行,每行兩個整數i與j(i<=j),表示求和的起始和終止位置。 【輸出格式】
??? 輸出有m行, 每行一個整數,表示這個數段數列的和。
【輸入樣例】 輸入文件 82 3 4 7 8 9 10 234?
5
2 3
4 7
1 3
7 7?
7 8?
? 輸出文件 7?
34
9
10?
244 【數據規模】 對于40%的數據,n<=1000,m<=1000,數列中的數不超過32767,數列的和不超過10^9
對于70%的數據,n<=10000,m<=2*10^5,數列中的數不超過32767
對于100%的數據,n<=10000,m<=2*10^5,數列中的數不超過10^9 線段樹區間求和? 屠龍寶刀點擊就送 #include <cstdio>using namespace std;typedef long long LL; struct node {LL l,r,dis; }tree[1000001]; LL ans,u,v,m,n,i,j; void up(LL now) {tree[now].dis=tree[now*2].dis+tree[now*2+1].dis; } void read(LL &x) {x=0;LL f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+(LL)ch-48;ch=getchar();}x=x*f; } void build(LL l,LL r,LL now) {tree[now].l=l;tree[now].r=r;if(tree[now].l==tree[now].r){read(tree[now].dis);return;}LL mid=(l+r)>>1;build(l,mid,now*2);build(mid+1,r,now*2+1);up(now); } void query(LL now) {if(tree[now].l>=u&&tree[now].r<=v){ans+=tree[now].dis;return;}LL m=(tree[now].l+tree[now].r)>>1;if(u<=m) query(now<<1);if(v>m) query(now<<1|1); } int main() {freopen("sum.in","r",stdin);freopen("sum.out","w",stdout);read(n);build(1,n,1);read(m);while(m--){read(u);read(v);ans=0;query(1);printf("%lld\n",ans);}fclose(stdin);fclose(stdout);return 0; }
?
轉載于:https://www.cnblogs.com/ruojisun/p/6506345.html
總結
以上是生活随笔為你收集整理的COGS 36. 求和问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python list 和 tuple
- 下一篇: Hello,PyQt5!