@(XSY)[分塊]

Hint: 題目原文是英文的, 寫得很難看, 因此翻譯為中文.

Input Format

First Line is the size of the array i.e. \(N\)

Next Line contains N space separated numbers \(A_i\) denoting the array

Next N line follows denoting \(Li\) and \(Ri\) for each functions.

Next Line contains an integer \(Q\) , number of queries to follow.

Next \(Q\) line follows , each line containing a query of Type 1 or Type 2.

1 x y : denotes a type 1 query,where x and y are integers

2 m n : denotes a type 2 query where m and n are integers

Output Format

For each query of type 2 , output as asked above.

Constraints

\(1 ≤ N ≤ 10^5\)

\(1 ≤ A i ≤ 10^9\)

\(1 ≤ L i ≤ N\)

$L i ≤ R i ≤ N $

\(1 ≤ Q ≤ 10^5\)

$1 ≤ x ≤ N $

\(1 ≤ y ≤ 10^9\)

$1 ≤ m ≤ N \(
\)m ≤ n ≤ N$

Subtask

Subtask \(1\): \(N ≤ 1000 , Q ≤ 1000\) , \(10\) points

Subtask \(2\): \(R-L ≤ 10\) , all x will be distinct ,\(10\) points

Subtask \(3\): Refer to constraints above , \(80\) points

Sample Input

5
1 2 3 4 5
1 3
2 5
4 5
3 5
1 2
4
2 1 4
1 3 7
2 1 4
2 3 5

Sample Output

41
53
28

Explanation

Functions values initially :

$F[1] = 1+ 2 + 3 = 6 \(
\)F[2] = 2 + 3 + 4 + 5 = 14 \(
\)F[3] = 4+5 = 9 \(
\)F[4] = 3+4+5 = 12 \(
\)F[5] = 1+2 = 3 $

Query \(1\): $F[1] + F[2] + F[3] + F[4] = 41 \(
After Update , the Functions are :
\)F[1] = 10 , F[2] = 18 , F[3] = 9 , F[4] = 16 , F[5] = 3 $

Query \(3\): $F[1] + F[2] + F[3] + F[4] = 53 $

Query \(4\): \(F[3]+F[4]+F[5] = 28\)

Solution

对\(a\)数组建立树状数组维护前缀和;

对函数进行分块处理. 维护两个数组, 其中\(sum[i]\)表示第\(i\)个块中的函数值的总和; \(cnt[i][j]\)表示第\(i\)个块中\(a[j]\)被累加的次数. \(cnt\)数组在预处理时可以通过累加前缀和的方法, \(O \left( n * sqrt(n) \right)\)完成. 而对于每次修改\(a[i]\)的值, 也可以在\(O \left(sqrt(n) * log(n) \right)\)的时间复杂度内完成维护.

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std; inline long long read()
{
long long x = 0, flag = 1;
char c;
while(! isdigit(c = getchar()))
if(c == '-')
flag *= - 1;
while(isdigit(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
} void println(long long x)
{
if(x < 0)
putchar('-'), x *= - 1;
if(x == 0)
putchar('0');
long long ans[1 << 5], top = 0;
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
} const long long N = 1 << 17; long long n; long long a[N];
long long L[N], R[N];
long long T[N]; inline void modify(long long u, long long x)
{
for(; u <= n; u += u & - u)
T[u] += (long long)x;
} long long unit, num; long long cnt[1 << 9][N];
long long sum[1 << 9]; void update(long long x, long long y)
{
for(long long i = 0; i < num; i ++)
sum[i] += (long long)cnt[i][x] * (y - a[x]); modify(x, y - a[x]);
a[x] = y;
} inline long long query(long long u)
{
long long ret = 0; for(; u; u -= u & - u)
ret += T[u]; return ret;
} long long ask(long long _L, long long _R)
{
long long lBlock = _L / unit, rBlock = _R / unit;
long long ret = 0; if(lBlock == rBlock)
for(long long i = _L; i <= _R; i ++)
ret += query(R[i]) - query(L[i] - 1);
else
{
for(long long i = lBlock + 1; i < rBlock; i ++)
ret += sum[i]; for(long long i = _L; i < (lBlock + 1) * unit; i ++)
ret += query(R[i]) - query(L[i] - 1); for(long long i = unit * rBlock; i <= _R; i ++)
ret += query(R[i]) - query(L[i] - 1);
} return ret;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("chefAndChurus.in", "r", stdin);
freopen("chefAndChurus.out", "w", stdout);
#endif n = read();
memset(T, 0, sizeof(T)); for(long long i = 1; i <= n; i ++)
modify(i, a[i] = read()); for(long long i = 0; i < n; i ++)
L[i] = read(), R[i] = read(); unit = (long long)sqrt(n);
long long cur = - 1; memset(cnt, 0, sizeof(cnt)); for(long long i = 0; i < n; i ++)
{
if(i % unit == 0)
cur ++; cnt[cur][L[i]] ++, cnt[cur][R[i] + 1] --;
} num = cur + 1; memset(sum, 0, sizeof(sum)); for(long long i = 0; i < num; i ++)
for(long long j = 1; j <= n; j ++)
{
cnt[i][j] += cnt[i][j - 1];
sum[i] += (long long)cnt[i][j] * a[j];
} long long m = read(); for(long long i = 0; i < m; i ++)
{
long long opt = read(), x = read(), y = read(); if(opt == 1)
update(x, y);
else
println(ask(x - 1, y - 1));
}
}

CODECHEF Nov. Challenge 2014 Chef & Churu的更多相关文章

  1. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  2. Codechef December Challenge 2014 Chef and Apple Trees 水题

    Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...

  3. CodeChef November Challenge 2014

    重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...

  4. Codechef March Challenge 2014——The Street

    The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...

  5. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries

    https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...

  6. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef and Hamming Distance of arrays

    https://www.codechef.com/DEC17/problems/CHEFHAM #include<cstdio> #include<cstring> #incl ...

  7. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And his Cake

    https://www.codechef.com/DEC17/problems/GIT01 #include<cstdio> #include<algorithm> using ...

  8. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  9. 刷漆(Codechef October Challenge 2014:Remy paints the fence)

    [问题描述] Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏, ...

随机推荐

  1. JAVA基础篇—多态

    class ColaEmployee父类 package com.cola; public class ColaEmployee { private String name; private int ...

  2. Linux异常处理体系结构

    arm11处理器裸机的异常与中断处理参考: [OK6410裸机程序]异常处理 [OK6410裸机程序]按键中断 另外参考一篇:Linux中断体系结构 在ARM V4及V4T以后的大部分处理器中,中断向 ...

  3. stm32L0系列学习(一)

    开发用到的具体芯片是stm32L011F3 stm32L0总体特性,定位: 可见容量是比较少的,功耗很低,adc12位,7种低功耗模式 jlink和sdk的引脚关系图: HAL的库框图 官方给出的HA ...

  4. poj-1011 sticks(搜索题)

    George took sticks of the same length and cut them randomly until all parts became at most 50 units ...

  5. POJ:2109-Power of Cryptography(关于double的误差)

    Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Description Current work in cryptograp ...

  6. PHP-redis命令之 列表(lists)

    三.列表(lists) 1.lpush:将所有指定的值插入到存于 key 的列表的头部.如果 key 不存在,那么在进行 push 操作前会创建一个空列表. 如果 key 对应的值不是一个 list ...

  7. golang连接orcale

    使用glang有一段时间了,最开始其实并不太喜欢他的语法,但是后来熟悉之后发现用起来还挺爽的.之前数据库一直使用mysql,连接起来没有什么问题,github上有很多完善的驱动,所以以为连接其他数据库 ...

  8. react技术栈实践(1)

    本文来自网易云社区 作者:汪洋 背景 最近开发一个全新AB测试平台,思考了下正好可以使用react技术开发. 实践前技术准备 首先遇到一个概念,redux.这货还真不好理解,大体的理解:Store包含 ...

  9. WebApp开发入门

    web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...

  10. 【转】基于 Apache 在本地配置多个虚拟主机

    如何使用 Apache 在本地配置出多个虚拟主机呢?而且使用不同的“域名”来访问本地不同的站点呢? 一般情况下,咱们都使用 localhost 来访问本机上的服务器,在我们的 C:/WINDOWS/s ...