NYOJ 123 士兵杀敌(四)
http://acm.nyist.net/JudgeOnline/problem.php?pid=123
这题本来交上去就超时了, 然后自己就囧了.... 不知道该用什么更高级的结构了...
然后去百度的题解....
看到的是和我一样的思路, 但怎么就过了呢.. 仔细看了下, 别人的更新都是从当前点更新到0位置.
然而我是从当前点, 更新到数组的结尾, 结果就不行了.
然后自己改了下代码就过了......感觉是数据出的问题,偏向了某一边把....
用线段树是不是会更好呢?
View Code
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 const int maxn = 1000005; 6 int ans[maxn], n; 7 int lowbit(int x) 8 { 9 return x & (-x); 10 } 11 12 int getSum(int x) 13 { 14 int i, sum=0; 15 for(i = x; i<= n; i+=lowbit(i)) 16 sum += ans[i]; 17 return sum; 18 } 19 20 int mod(int x, int num) 21 { 22 int i; 23 for(i = x; i > 0; i-=lowbit(i)) 24 ans[i] += num; 25 } 26 27 int main() 28 { 29 int m, a, b, c; 30 memset(ans,0,sizeof(ans)); 31 scanf("%d%d",&n,&m); 32 char s[20]; 33 while(m--) 34 { 35 scanf("%s",s); 36 if(strcmp(s,"ADD")==0) 37 { 38 scanf("%d%d%d",&a,&b,&c); 39 mod(a-1,-c); 40 mod(b,c); 41 } 42 else 43 { 44 scanf("%d",&a); 45 printf("%d\n",getSum(a)); 46 } 47 } 48 return 0; 49 }