@(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. R-data.table

    data.table可以扩展和增强data.frame的功能,在分组操作和组合时访问速度更快. require(data.table) theDT = data.table(A=1:10, B=let ...

  2. static 的三个作用

    1).用于声明函数体内的变量为静态局部变量,存储在静态数据存储区,在函数被调用过程中维持其值保持不变 2).在文件内(函数体外)被声明为静态的变量,可以被文件内的所有函数访问,但不能被其他文件的函数访 ...

  3. Servlet注意事项

    注意事项 1.对于Servlet的应用程序的目录结构来说,若想让有些文件Servlet可以访问,而用户不能访问的时候,可以将其放置在WEB-INF目录下 2.ServletResponse中getwr ...

  4. Linux学习-备份的种类、频率与工具的选择

    完整备份之累积备份 (Incremental backup) 还原的考虑 如果是完整备份的话.若硬件出问题导致系统损毁时,只要将完整备份拿出来,整个给他倾倒回去硬盘, 所有事情就搞定了!有些时候 (例 ...

  5. 《鸟哥的Linux私房菜》学习笔记(2)——Bash特性

    一.shell的基本概念:                               shell 意思是外壳,它是离用户最近的程序.shell提供用户操作系统的接口,我们通过shell将输入的命令与 ...

  6. 1507: [NOI2003]Editor(块状链表)

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4157  Solved: 1677[Submit][Stat ...

  7. Pycharm Django开发(一)设置开发环境

    一 由于我是一个对开发环境有强迫症的人,在装完PYTHON 2.6 3.3  3.4中,在创建Django工程的时候,会出现N个版本的python,那么在这里可以设置你喜欢和要使用的版本.

  8. zuul sample

    https://github.com/kakawait/uaa-behind-zuul-sample/ 1.参考资料 项目:https://github.com/kakawait/uaa-behind ...

  9. ip 核生成 rom 及questasim仿真时需要注意的问题

    IP 核生成 ROM 步骤1:Tools --> MegaWizard Plug-In Manager 步骤2:Create a new custom megafuction variation ...

  10. BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法

    发现转移矩阵是一个循环矩阵. 然后循环矩阵乘以循环矩阵还是循环矩阵. 据说还有FFT并且更优的做法. 之后再看吧 #include <map> #include <cmath> ...