Codevs2038 线段树练习3(分块)

链接

  http://codevs.cn/problem/1082/

题解

  这道题目可以用分块做。

  把原序列分成sqrt(N)块,对于每次修改,直接把两头的块暴力重构,中间的可以打上一个tag。查询时,暴力重构两头的(此时下放tag),中间的直接统计就好。

  至此,这道题的三种做法就全了:

  1.线段树

  2.树状数组(升级版):http://blog.csdn.net/fsahfgsadhsakndas/article/details/52650026

  3.分块:http://blog.csdn.net/fsahfgsadhsakndas/article/details/54772801

代码

//分块
#include 
#include 
#include 
#define maxn 300000
#define ll long long
using namespace std;
ll N, lp[maxn], tag[maxn], size, num[maxn], sum[maxn];
void input()
{
	ll i;
	scanf("%lld",&N);
	size=sqrt(N);
	for(i=0;i


你可能感兴趣的:(莫队分块)