NYOJ -123 士兵杀敌(四)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ -123 士兵杀敌(四)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
士兵殺敵(四)
時間限制:2000 ms ?|? 內存限制:65535 KB 難度:5 描述南將軍麾下有百萬精兵,現已知共有M個士兵,編號為1~M,每次有任務的時候,總會有一批編號連在一起人請戰(編號相近的人經常在一塊,相互之間比較熟悉),最終他們獲得的軍功,也將會平分到每個人身上,這樣,有時候,計算他們中的哪一個人到底有多少軍功就是一個比較困難的事情,軍師小工的任務就是在南將軍詢問他某個人的軍功的時候,快速的報出此人的軍功,請你編寫一個程序來幫助小工吧。
假設起始時所有人的軍功都是0.
每一行是兩個整數T和M表示共有T條指令,M個士兵。(1<=T,M<=1000000)
隨后的T行,每行是一個指令。
指令分為兩種:
一種形如
ADD 100 500 55 表示,第100個人到第500個人請戰,最終每人平均獲得了55軍功,每次每人獲得的軍功數不會超過100,不會低于-100。
第二種形如:
QUERY 300 表示南將軍在詢問第300個人的軍功是多少。
?
?
1 //代碼二: 2 //-----線段樹(超時了----應該是代碼寫的大材小用了,本題只用查詢一個點, 3 //自己寫的插入函數可以把線段都更新了,適用于查詢任意區間的軍工總和,把查詢函數稍加改進就能查線段了) 4 #include<stdio.h> 5 #include<malloc.h> 6 7 struct node 8 { 9 int lc,rc; 10 int sum; 11 }*tree; 12 13 void build(int s,int t,int T) 14 { 15 int mid=(s+t)>>1; 16 tree[T].lc=s; 17 tree[T].rc=t; 18 tree[T].sum=0; 19 if(s==t) 20 return ; 21 build(s,mid,T<<1); 22 build(mid+1,t,(T<<1)|1); 23 } 24 25 void insert(int s,int t,int add,int T) 26 { 27 if(tree[T].lc>t||tree[T].rc<s) 28 return ; 29 else if(s<tree[T].lc&&t<=tree[T].rc) 30 tree[T].sum+=add*(t-tree[T].lc+1); 31 else if(s>=tree[T].lc&&t<=tree[T].rc) 32 tree[T].sum+=add*(t-s+1); 33 else if(s>=tree[T].lc&&t>tree[T].rc) 34 tree[T].sum+=add*(tree[T].rc-s+1); 35 else 36 tree[T].sum+=add*(tree[T].rc-tree[T].lc+1); 37 if(tree[T].lc==tree[T].rc) 38 return ; 39 insert(s,t,add,T<<1); 40 insert(s,t,add,(T<<1)|1); 41 } 42 43 int qurry(int k,int T) 44 { 45 int mid=(tree[T].lc+tree[T].rc)>>1; 46 if(k<tree[T].lc||k>tree[T].rc) //不在此范圍內直接跳出 47 return 0; 48 if(tree[T].lc==tree[T].rc) 49 return tree[T].sum; 50 if(k<=mid) 51 return qurry(k,T<<1); 52 else 53 return qurry(k,(T<<1)|1); 54 } 55 56 int main() 57 { 58 int T,st,end,k,i,M; 59 char cmd[10]; 60 scanf("%d%d",&T,&M); 61 tree=(struct node *)malloc(M*3*sizeof(struct node)); 62 build(1,M,1); 63 for(i=0;i<T;++i) 64 { 65 scanf("%s",cmd); 66 if(cmd[0]=='A') 67 { 68 scanf("%d%d%d",&st,&end,&k); 69 insert(st,end,k,1); 70 } 71 else 72 { 73 scanf("%d",&k); 74 printf("%d\n",qurry(k,1)); //輸出第k個人的軍工 75 } 76 } 77 return 0; 78 }?
總結
以上是生活随笔為你收集整理的NYOJ -123 士兵杀敌(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何搭建一个指标体系
- 下一篇: 下载 infoq 网站视频