日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ 228 士兵杀敌(五)

發布時間:2025/3/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ 228 士兵杀敌(五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

士兵殺敵(五)

時間限制:2000?ms ?|? 內存限制:65535?KB 難度:5 描述

南將軍麾下有百萬精兵,現已知共有M個士兵,編號為0~M,每次有任務的時候,總會有一批編號連在一起人請戰(編號相近的人經常在一塊,相互之間比較熟悉),最終他們獲得的軍功,也將會平分到每個人身上,這樣,有時候,計算他們中的哪一個人到底有多少軍功就是一個比較困難的事情。

在這樣的情況下,南將軍卻經常會在許多次戰役之后詢問軍師小工第i號士兵到第j號士兵所有人的總軍功數。

請你幫助軍師小工回答南將軍的提問。

輸入
只有一組測試數據
第一行是三個整數N,C,Q(1<=N,C,Q<=1000000),其中N表示士兵的總數。
隨后的C行,每行有三個整數Mi,Ni,Ai(0<=Mi<=Ni<=N,0<=Ai<=100),表示從第Mi號到第Ni號士兵所有人平均增加了Ai的軍功。
再之后的Q行,每行有兩個正正數m,n,表示南將軍詢問的是第m號士兵到第n號士兵。
輸出
請對每次詢問輸出m號士兵到第n號士兵的總軍功數,由于該數值可能太大,請把結果對10003取余后輸出
樣例輸入
5 3 2 1 3 2 2 4 1 5 5 10 1 5 2 3
樣例輸出
19 6
淚奔了!花費了好幾個小時,樹狀數組和線段樹都用上了,滿以為能提交成功,結果一提交,居然TLE!!!
只是因為不是在線問的!!!
TLE代碼:
#include<stdio.h> #include<string.h> int num[1000010],sum[3000000]; int N,t,count; int LowBit(int i) {return i&(-i); } void Plus(int i,int value) {while(i>0){num[i]=(num[i]+value)%10003;i-=LowBit(i);} } int Get(int i) {int result=0;while(i<=N){result=(result+num[i])%10003;i+=LowBit(i);}return result; } // 創建線段樹 void Create(int l,int r,int root) {if(l==r){sum[root]=Get(count);// printf("%d ",sum[root]);count++;return;}int mid=(l+r)/2;Create(l,mid,root*2);Create(mid+1,r,root*2+1);sum[root]=(sum[root*2]+sum[root*2+1])%10003; } void Query(int l,int r,int root,int a,int b) {if(a>r||b<l)return;if(a<=l&&b>=r){t=(t+sum[root])%10003;return;}int mid=(l+r)/2;Query(l,mid,root*2,a,b);Query(mid+1,r,root*2+1,a,b); } int main() {int C,Q,a,b,value,i;memset(num,0,sizeof(num));memset(sum,0,sizeof(sum));scanf("%d%d%d",&N,&C,&Q);for(i=1;i<=C;i++){scanf("%d%d%d",&a,&b,&value);Plus(a-1,-value);Plus(b,value);}count=1;Create(1,N,1);for(i=1;i<=Q;i++){scanf("%d%d",&a,&b);t=0;Query(1,N,1,a,b);printf("%d\n",t);}return 0; }
別人的AC碼:
#include<stdio.h> #include<string.h> #define M 10003 int num[1000010]; int main() {int N,C,Q,a,b,value,i;memset(num,0,sizeof(num));scanf("%d%d%d",&N,&C,&Q);for(i=1;i<=C;i++){scanf("%d%d%d",&a,&b,&value);num[a]+=value; // 從a到C的值全部加valuenum[b+1]-=value; // 從b到C的值全部減value}for(i=1;i<=N;i++)num[i]+=num[i-1];for(i=1;i<=N;i++)num[i]=(num[i-1]+num[i])%M;for(i=0;i<Q;i++){scanf("%d%d",&a,&b);printf("%d\n",(num[b]-num[a-1]+M)%M);}return 0; }

總結

以上是生活随笔為你收集整理的NYOJ 228 士兵杀敌(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。