摘要: 数学模型:给定一个整数序列(最多10000000个数),初始化为0,一共有n(最大10000)个操作,其中第i个操作是将某个指定区间内的数赋值为i,求在经过n次操作后,序列中有多少个不同的非0数该题可用线段数来做,保存的关键信息为这段的值,最后的查询只有一次。需要注意的是最多有10000000个数,但n不大,所以可以用离散化处理进行优化。View Code #include <stdio.h>#include <string.h>#include <stdlib.h>#define N 10001#define INF 0x7fffffffint a[N], 阅读全文
posted @ 2012-07-12 16:29 BeatLJ 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 维持一个整数序列,支持2种操作:1、增加一个整数到序列中;2、求序列的第K大的数。思路:建两个堆,一个小堆来保存前K大的数,一个大堆来保存剩余的数,这样的话,就满足小堆中最小的数也会大于等于大堆中最大的数,在插入的过程中,我们仍需维持这种性质,先将插入的数进入大堆,然后比较2个堆顶的数,若不满足上述性质则交换,直到满足为止。建大堆:priority_queue<int> qmax;建小堆:priority_queue<int ,vector<int>,greater<int> >qmin.View Code #include <stdio. 阅读全文
posted @ 2012-07-12 14:51 BeatLJ 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 数学模型:维持一个01序列,支持2种操作:1、将给定区间内的数取反;2、查询给定区间内1的个数。这题就是“暑假集训每日一题0712”的简化版View Code #include <stdio.h>#define N 100001int n,m,ans;int sum[4*N],rev[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x,int y){ int mid=(x+y)>>1, 阅读全文
posted @ 2012-07-12 14:12 BeatLJ 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 维持一个整数序列,支持2种操作:Q a b:查询区间[a,b]内的和;C a b x:将区间[a,b]内的每个数加上x。对于每次查询输出结果。结果可能会超32位。View Code #include <stdio.h>#define N 100001int n,m,a[N];long long ans;long long sum[4*N],inc[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x 阅读全文
posted @ 2012-07-12 13:15 BeatLJ 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 维护一个只有0和1的整数序列,支持以下操作:1 x y v : 将区间[x,y]之间的所有整数都变为v(v为0或1);2 x y : 将区间[x,y]之间所有的1变为0,所有的0变为1;3 x y : 查询区间[x,y]内的1的个数。线段数练习:每段保存3个关键信息:和,修改标记,反转标记。需注意的几点:在更新某段时,之前的反转操作将无效,应将其清零,在下传修改标记时,应将左右儿子的反转标记清零。View Code #include <stdio.h>#define N 100001int n,m,ans;int a[N],sum[4*N],val[4*N],rev[4*N];vo 阅读全文
posted @ 2012-07-12 11:41 BeatLJ 阅读(222) 评论(0) 推荐(0) 编辑