摘要: 维护一个整数序列,支持2中操作:1、修改某个指定数的值;2、查询指定区间的最大值。View Code #include <stdio.h>#define MAX(a,b) ((a)>(b)?(a):(b))#define N 200001int n,m,D;int max[4*N];void init(){ int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) max[i]=0; for(i=1;i<=n;i++) scanf("%d",&max[i+D]); for(i=D- 阅读全文
posted @ 2012-07-11 16:56 BeatLJ 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 维护一个整数序列,支持3种操作:1、将指定的数加上一个值;2、将指定的数减去一个值;3、查询指定区间的和。View Code #include <stdio.h>#define N 50001int t,n,D;int sum[4*N];void init(){ int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) sum[i]=0; for(i=1;i<=n;i++) scanf("%d",&sum[i+D]); for(i=D-1;i^1;i--) sum[i]=sum[i< 阅读全文
posted @ 2012-07-11 16:43 BeatLJ 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 这题可以看成是“集训每日一题0711”的简化版,没有修改操作,只需查询最小和最大的。View Code #include <stdio.h>#define MIN(a,b) ((a)<(b)?(a):(b))#define MAX(a,b) ((a)>(b)?(a):(b))#define INF 0x7fffffff#define N 50001int n,m,D;int min[4*N],max[4*N];void init(){ int i,t; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) { min[ 阅读全文
posted @ 2012-07-11 15:33 BeatLJ 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 维护一个整数序列,支持以下操作:1 x v : 将第x个整数的值修改为v;2 x y : 查询区间[x,y]之间的最小值;3 x y : 查询区间[x,y]之间的最大值;4 x y : 查询区间[x,y]内的整数和。数据保证查询结果均在int范围之内,但中间结果是否可能溢出呢?我交的程序没考虑这个也AC了。通过这题还发现一个奇怪的现象,用memset初始化的程序跑了2s多,而用for循环初始化的程序才跑468ms……for循环初始化(468ms)#include <stdio.h>#include <string.h>#define MIN(a,b) ((a)<( 阅读全文
posted @ 2012-07-11 13:32 BeatLJ 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 维护一个整数序列,支持2种操作:1、修改:将给定区间中的每个数增加一个值;2、查询:查询给定区间中所有数的和。View Code #include <stdio.h>#define N 100010#define Node 800000int n,m,x[N];long long sum[N];int left[Node],right[Node];long long incsum[Node],inc[Node];void create(int i,int l,int r){ left[i]=l; right[i]=r; inc[i]=0; incsum[i]=0; ... 阅读全文
posted @ 2012-07-11 11:21 BeatLJ 阅读(234) 评论(0) 推荐(0) 编辑