@(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. CRC点滴

    研究了一个晚上,大致看懂了crc校验的方法.这里记录一下,因为can总线中需要用到crc校验的. 举例说明CRC校验码的求法:(此例子摘自百度百科:CRC校验码) 信息字段代码为: 1011001:对 ...

  2. hdu 4565

    Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...

  3. Linux学习-什么是例行性工作排程

    那么 Linux 的例行性工作是如何进行排程的呢?所谓的排程就是将这些工作安排执行的流程之意! 咱们的 Linux 排程就是透过 crontab 与 at 这两个东西! Linux 工作排程的种类: ...

  4. Linux学习-软件磁盘阵列 (Software RAID)

    什么是 RAID 磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列.RAID 可以透过一个技术(软件或硬 ...

  5. holtek编程注意事项

    1.holtek单片机中断服务函数中函数调用里的参数不能传递地址,不然程序就会跑飞 2.holtek单片机尽量不要函数嵌套很多层,嵌套过多,会导致单片机复位

  6. SAS描述统计量

    MEANS过程 MEAN过程默认输出的统计量有:观测总数.均值.标准差.最大值和最小值.如果要计算其他统计量或其中的某一些统计量,则可在PROC语句中指定统计量的关键字. BY语句规定了分组变量,要求 ...

  7. BugBash活动分享

    此文已由作者夏君授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. BugBash源至微软概念,翻译为<缺陷大扫除>,顾名思义是集中大家力量全面清扫Bug,确保产品质 ...

  8. adb devices 找不到夜神模拟器解决方法

    先打开命令行窗口,输入adb devices,查看连接信息,大致意思是sdk的adb版本与夜神的adb版本不一致,导致. C:\Users\cz9025>adb devices List of ...

  9. python之路 --- python基础

    一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  10. MongoDB 3.6 安装详解

    在ubuntu和多数linux发行版的包安装源中MongoDB默认的版本是2.4,但2.4所使用的存储引擎不支持collecitons级别的锁,只支持database级别的,所以在开发中2.4版本的m ...