博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3468 A Simple Problem with Integers(线段树)
阅读量:5101 次
发布时间:2019-06-13

本文共 2983 字,大约阅读时间需要 9 分钟。

题目链接:

典型的线段树问题,(插线问线)

这题有两个易错点,占存点需要是(long long )WA了好几次,关于选段树数组的大小 一般N*6吧(关于这点我在poj上亲自测试了)

代码:

1 #include 
2 #include
3 4 typedef struct tree 5 { 6 int l,r; 7 long long sum; 8 long long ans; 9 }tree; 10 11 tree tree_list[600010]; 12 int a[100005]; 13 14 void build(int i,int x,int n) 15 { 16 tree_list[i].l = x; 17 tree_list[i].r = n; 18 tree_list[i].ans = 0; 19 if(x == n) 20 { 21 tree_list[i].sum = a[x]; 22 return; 23 } 24 int mid = (x+n)/2; 25 build(i<<1,x,mid); 26 build(i<<1 | 1,mid+1,n); 27 tree_list[i].sum = tree_list[i<<1].sum + tree_list[i<<1 | 1].sum; 28 } 29 30 void print(int i) 31 { 32 printf("i == %d %lld\n",i,tree_list[i].sum); 33 if(tree_list[i].l == tree_list[i].r) 34 return ; 35 print(i<<1); 36 print(i<<1 |1); 37 } 38 void add(int i,int l1,int r1,int x) 39 { 40 if(tree_list[i].l == l1 && tree_list[i].r == r1) 41 { 42 tree_list[i].ans += x; 43 return ; 44 } 45 tree_list[i].sum += x*(r1 - l1+1);//该区间的值 46 int mid = (tree_list[i].l + tree_list[i].r) /2; 47 if(r1 <= mid) 48 add(i<<1,l1,r1,x); 49 else if(l1 > mid) 50 add(i<<1 |1,l1,r1,x); 51 else 52 { 53 add(i<<1,l1,mid,x); 54 add(i<<1 | 1,mid+1,r1,x); 55 } 56 57 } 58 59 long long query(int i,int l1,int r1) 60 { 61 if(tree_list[i].ans != 0) 62 { 63 tree_list[i].sum += (tree_list[i].r - tree_list[i].l +1 )* tree_list[i].ans; 64 tree_list[i<<1].ans += tree_list[i].ans; 65 tree_list[i<<1 | 1].ans += tree_list[i].ans; 66 tree_list[i].ans = 0; 67 } 68 69 if(tree_list[i].l == l1 && tree_list[i].r == r1) 70 { 71 return tree_list[i].sum; 72 } 73 else 74 { 75 int mid = (tree_list[i].l + tree_list[i].r ) /2; 76 if(r1 <= mid) 77 return query(i<<1,l1,r1); 78 else if(l1 > mid) 79 return query(i<<1 |1,l1,r1); 80 else 81 return query(i<<1,l1,mid) + query(i<<1|1,mid+1,r1); 82 } 83 } 84 int main() 85 { 86 int n,m,i,x,y,z; 87 char ch[5]; 88 while(~scanf("%d%d",&n,&m)) 89 { 90 memset(a,0,sizeof(a)); 91 memset(tree_list,0,sizeof(tree_list)); 92 for(i = 1; i <= n; i++) 93 scanf("%d",&a[i]); 94 /*for(i = 1; i <= n; i++) 95 printf("%d ",a[i]); 96 printf("\n");*/ 97 build(1,1,n); 98 // print(1); 99 while(m--)100 {101 scanf("%s",ch);102 if(ch[0] == 'Q')103 {104 scanf("%d%d",&x,&y);105 printf("%lld\n",query(1,x,y));106 }107 else108 {109 scanf("%d%d%d",&x,&y,&z);110 add(1,x,y,z);111 }112 }113 }114 return 0;115 }

 

转载于:https://www.cnblogs.com/yyroom/p/3278664.html

你可能感兴趣的文章
【转载】基于vw等viewport视区相对单位的响应式排版和布局
查看>>
<转>关于MFC的多线程类 CSemaphore,CMutex,CCriticalSection,CEvent
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
backgound-attachment属性学习
查看>>
个人作业——关于K米的产品案例分析
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
java web 中base64传输的坑
查看>>
java 中的线程(一)
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
素数判断BFS之“Prime Path”
查看>>
Activiti入门 -- 环境搭建和核心API简介
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>