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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

NYOJ -123 士兵杀敌(四)

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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個人的軍功是多少。
輸出
對于每次查詢輸出此人的軍功,每個查詢的輸出占一行。
樣例輸入
4 10 ADD 1 3 10 QUERY 3 ADD 2 6 50 QUERY 3
樣例輸出
10 60 1 /* 功能Function Description: NYOJ-123 士兵殺敵四------樹樁數組--插線問點 2 開發環境Environment: DEV C++ 4.9.9.1 3 技術特點Technique: 4 版本Version: 5 作者Author: 可笑癡狂 6 日期Date: 20120807 7 備注Notes: 8 */ 9 10 // 代碼一:----樹狀數組(插線問點) 11 #include<stdio.h> 12 #include<string.h> 13 int a[1000001]; 14 int M; 15 16 int lowbit(int i) 17 { 18 return i&(-i); 19 } 20 21 void update(int i,int num) 22 { 23 while(i<=M) 24 { 25 a[i]+=num; 26 i+=lowbit(i); 27 } 28 } 29 30 int getsum(int i) 31 { 32 int sum=0; 33 while(i>0) 34 { 35 sum+=a[i]; 36 i-=lowbit(i); 37 } 38 return sum; 39 } 40 41 int main() 42 { 43 int T,st,end,k,i; 44 char cmd[10]; 45 scanf("%d%d",&T,&M); 46 for(i=0;i<T;++i) 47 { 48 scanf("%s",cmd); 49 if(cmd[0]=='A') 50 { 51 scanf("%d%d%d",&st,&end,&k); 52 update(st,k); 53 update(end+1,-k); 54 } 55 else 56 { 57 scanf("%d",&k); 58 printf("%d\n",getsum(k)); //輸出第k個人的軍工 59 } 60 } 61 return 0; 62 }

?

?

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 士兵杀敌(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

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