生活随笔
收集整理的這篇文章主要介紹了
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 士兵杀敌(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。