D. Zigzag
time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

The court wizard Zigzag wants to become a famous mathematician. For that, he needs his own theorem, like the Cauchy theorem, or his sum, like the Minkowski sum. But most of all he wants to have his sequence, like the Fibonacci sequence, and his function, like
the Euler's totient function.

The Zigag's sequence with the zigzag factor z is an infinite sequence Siz (i ≥ 1; z ≥ 2),
that is determined as follows:

  • Siz = 2,
    when ;
  • ,
    when ;
  • ,
    when .

Operation  means
taking the remainder from dividing number x by number y.
For example, the beginning of sequence Si3(zigzag
factor 3) looks as follows: 1, 2, 3, 2, 1, 2, 3, 2, 1.

Let's assume that we are given an array a, consisting of n integers.
Let's define element number i (1 ≤ i ≤ n) of
the array as ai.
The Zigzag function is function ,
where l, r, z satisfy the inequalities 1 ≤ l ≤ r ≤ nz ≥ 2.

To become better acquainted with the Zigzag sequence and the Zigzag function, the wizard offers you to implement the following operations on the given array a.

  1. The assignment operation. The operation parameters are (p, v). The operation denotes assigning value v to
    the p-th array element. After the operation is applied, the value of the array element ap equals v.
  2. The Zigzag operation. The operation parameters are (l, r, z). The operation denotes calculating the Zigzag function Z(l, r, z).

Explore the magical powers of zigzags, implement the described operations.

Input

The first line contains integer n (1 ≤ n ≤ 105) —
The number of elements in array a. The second line contains n space-separated
integers: a1, a2, ..., an (1 ≤ ai ≤ 109) —
the elements of the array.

The third line contains integer m (1 ≤ m ≤ 105) —
the number of operations. Next m lines contain the operations' descriptions. An operation's description starts with integer ti (1 ≤ ti ≤ 2) —
the operation type.

  • If ti = 1 (assignment
    operation), then on the line follow two space-separated integers: pi, vi (1 ≤ pi ≤ n; 1 ≤ vi ≤ 109) —
    the parameters of the assigning operation.
  • If ti = 2 (Zigzag
    operation), then on the line follow three space-separated integers: li, ri, zi (1 ≤ li ≤ ri ≤ n; 2 ≤ zi ≤ 6) —
    the parameters of the Zigzag operation.

You should execute the operations in the order, in which they are given in the input.

Output

For each Zigzag operation print the calculated value of the Zigzag function on a single line. Print the values for Zigzag functions in the order, in which they are given in the input.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams
or the %I64dspecifier.

Sample test(s)
input
5
2 3 1 5 5
4
2 2 3 2
2 1 5 3
1 3 5
2 1 5 3
output
5
26
38
Note

Explanation of the sample test:

  • Result of the first operation is Z(2, 3, 2) = 3·1 + 1·2 = 5.
  • Result of the second operation is Z(1, 5, 3) = 2·1 + 3·2 + 1·3 + 5·2 + 5·1 = 26.
  • After the third operation array a is equal to 2, 3, 5, 5, 5.
  • Result of the forth operation is Z(1, 5, 3) = 2·1 + 3·2 + 5·3 + 5·2 + 5·1 = 38.

大致思路:Z从2到6,按循环节分别维护一棵线段树,一共维护30棵线段树。查询复杂度logn的。改动的复杂度是30*logn

时限3s,毕竟codeforces可过

//137924k	1372ms	GNU G++ 4.9.2 2761B
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cstdio>
#include <ctime>
#include <bitset>
#include <algorithm>
#define SZ(x) ((int)(x).size())
#define ALL(v) (v).begin(), (v).end()
#define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i)
#define REP(i,n) for ( int i=1; i<=int(n); i++ )
using namespace std;
typedef long long ll; #define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N = 1e5+100;
ll sum[35][N<<2];
ll val[N],mul[35][N];
int n; inline void pushup(int rt,ll *sum)
{
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt,ll sum[],ll mul[])
{
if(l == r)
{
sum[rt] = val[l]*mul[l];
return ;
}
int m = (l+r)>>1;
build(lson,sum,mul);
build(rson,sum,mul);
pushup(rt,sum);
}
void update(int pos,ll x,int l,int r,int rt,ll sum[],ll mul[])
{
if(l == r)
{
sum[rt] = x*mul[l];
return ;
}
int m = (l+r)>>1;
if(pos <= m) update(pos,x,lson,sum,mul);
else update(pos,x,rson,sum,mul);
pushup(rt,sum);
}
ll query(int L,int R,int l,int r,int rt,ll sum[])
{
if(L <= l && r <= R)
{
return sum[rt];
}
ll ans = 0;
int m = (l+r)>>1;
if(L <= m) ans += query(L,R,lson,sum);
if(R > m) ans += query(L,R,rson,sum);
return ans;
} inline int getid(int l,int z)
{
int buf = 0;
REP(i,z-2) buf += 2*i;
int k = 2*(z-1);
l = (l-1)%k+1;
if(l == 1) return l+buf;
return k-l+2+buf;
} int main()
{
//......................
ll a[15];
a[1] = 1,a[2] = 2;
REP(i,2)REP(j,N-10) mul[i][j] = a[(j-1+i-1)%2+1];
a[3] = 3,a[4] = 2;
REP(i,4)REP(j,N-10) mul[2+i][j] = a[(j-1+i-1)%4+1];
a[4] = 4,a[5] = 3,a[6] = 2;
REP(i,6)REP(j,N-10) mul[6+i][j] = a[(j-1+i-1)%6+1];
a[5] = 5,a[6] = 4,a[7] = 3,a[8] = 2;
REP(i,8)REP(j,N-10) mul[12+i][j] = a[(j-1+i-1)%8+1];
a[6] = 6,a[7] = 5,a[8] = 4,a[9] = 3,a[10] = 2;
REP(i,10)REP(j,N-10) mul[20+i][j] = a[(j-1+i-1)%10+1];
//....................... cin>>n;
REP(i,n) scanf("%I64d",&val[i]);
REP(i,30) build(root,sum[i],mul[i]);
int Q;
cin>>Q;
REP(i,Q)
{
int op;
scanf("%d",&op);
if(op == 1)
{
int pos;ll x;
scanf("%d%I64d",&pos,&x);
REP(i,30) update(pos,x,root,sum[i],mul[i]);
}
else
{
int l,r,z;
scanf("%d%d%d",&l,&r,&z);
int id = getid(l,z);
printf("%I64d\n",query(l,r,root,sum[id]));
}
}
}

CodeForces 228D. Zigzag(线段树暴力)的更多相关文章

  1. CodeForces 438D The Child and Sequence (线段树 暴力)

    传送门 题目大意: 给你一个序列,要求在序列上维护三个操作: 1)区间求和 2)区间取模 3)单点修改 这里的操作二很讨厌,取模必须模到叶子节点上,否则跑出来肯定是错的.没有操作二就是线段树水题了. ...

  2. hdu 4288 线段树 暴力 **

    题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...

  3. 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...

  4. Vasya and a Tree CodeForces - 1076E(线段树+dfs)

    I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...

  5. Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)

    Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...

  6. Codeforces 787D. Legacy 线段树建模+最短路

    D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  7. hdu 6430 线段树 暴力维护

    Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  8. 【Vjudge】P558E A Simple Task(线段树暴力)

    题目链接 这题……太暴力了吧…… 开二十六棵线段树维护l到r字符i出现的次数,然后修改的时候暴力修改,输出的时候暴力输出……就过了…… 然后我还没想到…… qwq #include<cstdio ...

  9. Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)

    Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...

随机推荐

  1. BZOJ 3304: [Shoi2005]带限制的最长公共子序列( LCS )

    求个LCS, 只是有了限制, 多加一维表示匹配到z串的第几个, 然后用滚动数组 ------------------------------------------------------------ ...

  2. 深入浅出—JAVA(8)

    8.接口与抽象类 不是抽象的类就被称为具体类 不同继承树的类也可以实现相同的接口,类可以实现多个接口.

  3. 转: requirejs压缩打包r.js使用示例 2 (~~很详细的教程)

    这一篇来认识下打包工具的paths参数,在入门一中 就介绍了require.config方法的paths参数.用来配置jquery模块的文件名(jQuery作为AMD模块时id为“jquery”, 但 ...

  4. VS2010/MFC对话框三:创建对话框类和添加控件变量

    创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是 ...

  5. Roseonly:互联网轻奢品牌之路-搜狐IT

    Roseonly:互联网轻奢品牌之路-搜狐IT Roseonly:互联网轻奢品牌之路

  6. android编程——百度地图初探

    项目需要,花了一天时间研究了下百度地图的API,其实看起来可能会有点困难,但是将它的DEMO跑起来之后一切都迎刃而解的样子了.百度方面讲地图的接口封装的挺不错的,而且现在能够提供的地图的服务也有将近十 ...

  7. java的JCombobox实现中国省市区三级联动

    源代码下载:点击下载源代码 用xml存储中国各大城市的数据. xml数据太多了就不贴上了,贴个图片: 要解释xml,添加了一个jdom.jar,上面的源代码下载里面有. 解释xml的类: packag ...

  8. python学习(2)

    编码: 需要注意的是:python 没有字符的概念,但是比如a='abcd',当中字母a占用一个字节,通过 方法len我们可以求出这个字符变量a所有字符个数,如:print len(a)显示结果为:4 ...

  9. Tomcat 内存设置

    大型项目或者使用了SSH 的话, Tomcat 可能会报 java.lang.OutOfmemoryError: PermGen Space Windows: 在 bin/catlina.bat 最上 ...

  10. POJ 1041 John's trip 无向图的【欧拉回路】路径输出

    欧拉回路第一题TVT 本题的一个小技巧在于: [建立一个存放点与边关系的邻接矩阵] 1.先判断是否存在欧拉路径 无向图: 欧拉回路:连通 + 所有定点的度为偶数 欧拉路径:连通 + 除源点和终点外都为 ...