【codevs 1369】题解
2016-04-05 20:35
288 查看
#include <iostream> #include <stdio.h> using namespace std; int n , m; int a[200000 + 2]; int i; int l , r; struct Node { int l , r; int value; Node * left , * right; }; int merge( int a , int b ) { return a + b; } void modify( int x , Node * cur ) { if( cur -> l == cur -> r ) { cur -> value = 0; return; } int mid = ( cur -> l + cur -> r ) / 2; if( x > mid ) modify( x , cur -> right ); else modify( x , cur -> left ); cur -> value = merge( cur -> left -> value , cur -> right -> value ); return; } int find( int l , int r , Node * cur ) { if( cur -> l == l && cur -> r == r ) return cur -> value; int mid = ( cur -> l + cur -> r ) / 2; if( l > mid ) return find( l , r , cur -> right ); else if( mid >= r ) return find( l , r , cur -> left ); else return merge( find( l , mid , cur -> left ) , find( mid + 1 , r , cur -> right ) ); } Node * build( int l , int r ) { Node * cur = new Node(); cur -> l = l; cur -> r = r; if( cur -> l == cur -> r ) { cur -> value = a[l]; return cur; } int mid = ( cur -> l + cur -> r ) / 2; cur -> left = build( l , mid ); cur -> right = build( mid + 1 , r ); cur -> value = merge( cur -> left -> value , cur -> right -> value ); return cur; } Node * root; int main() { scanf( "%d" , &n ); for( i = 1 ; i <= n ; i++ ) scanf( "%d" , &a[i] ); root = build( 1 , n ); scanf( "%d" , &m ); for( i = 0 ; i < m ; i++ ) { scanf( "%d %d" , &l , &r ); printf( "%.2f\n" , 3.14 * find( l , r , root ) ); modify( ( l + r ) / 2 , root ); } return 0; }
相关文章推荐
- 第六周项目二带武器角色类
- View的工作原理
- 监听CollaspingToolbarLayout折叠完成事件
- SystemParametersInfo API学习(128个中文参数解释,215个实际值)
- notifier chain — 内核通知链【转】
- 销售订单行上行号LINE_SHIPMENT_OPTION_NUMBER
- NodeJS 模块开发及发布详解
- php提高效率
- [国嵌攻略][180][加密传输优化]
- 命令模式
- 使用spm构建seajs项目
- 【poj 1182】食物链 并查集应用
- 投影问题:带号求解,及中央子午线计算
- oop的特征
- 注册Dev的帮助文件
- hdu2044java递推
- asp.net中的<% %>,<%= %>,><%#eval("") %><%$ %>的使用 - Hackerman
- mysql创建自定义函数
- java实现栈数据结构
- GreenHandX1h 2016.4.5 (第一章告一段落)