改了三天,提交17次,一定要纪念一下!

1004:Challenge 4

总时间限制: 
10000ms

单个测试点时间限制: 
1000ms

内存限制: 
262144kB
描述

给一个长为N的数列,有M次操作,每次操作时以下三种之一:

(1)修改数列中的一个数

(2)求数列中某连续一段所有数的两两乘积的和 mod 1000000007

(3)求数列中某连续一段所有相邻两数乘积的和 mod 1000000007

输入
第一行两个正整数N和M。
第二行N的整数表示这个数列。
接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的值修改为y;若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示对[x,y]区间做2号询问;若该字符为'A',则表示一个询问操作,接下来两个整数x和y,表示对[x,y]区间做3号询问。
输出
对每一个询问操作单独输出一行,表示答案。
样例输入
5 5
1 2 3 4 5
Q 1 5
A 1 5
M 2 7
Q 1 5
A 1 5
样例输出
85
40
150
60
提示
1<=N<=10^5,1<=M<=10^5,输入保证合法,且所有整数可用带符号32位整型存储。

更新操作其实是很简单的,稍微推一下就可以出来,可是细节很多!还有毒瘤数据有负数!所以所有的mod操作都要模加模!!

还有就是指针池的大小问题...因为过程中一直在开新节点...改了三天的大毒瘤

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std; const int mod = ;
const int N = ; ll a[N];
int n, m; struct node {
node *ls, *rs;
ll sum, num1, num2, lf, rg;
} pool[N*], *tail = pool, *zero, *root;///////////指针池大小 void update ( node *nd, node *ld, node *rd ) {
nd -> sum = ( ld -> sum + rd -> sum + mod ) % mod;
nd -> num1 = ( ld -> sum * rd -> sum % mod + ld -> num1 + rd -> num1 + mod ) % mod;
nd -> num2 = ( ld -> num2 + rd -> num2 + ld -> rg * rd -> lf % mod + mod ) % mod;
nd -> lf = ld -> lf % mod; nd -> rg = rd -> rg % mod;
} node *build ( int l, int r ) {
node *nd = ++ tail;
if ( l == r ) {
ll pp = ( a[l] % mod + mod ) % mod;
nd -> lf = nd -> rg = pp;
nd -> sum = pp; nd -> num1 = nd -> num2 = ;
return nd;
}
int mid = ( l + r ) >> ;
nd -> ls = build ( l, mid );
nd -> rs = build ( mid + , r );
update ( nd, nd -> ls, nd -> rs );
return nd;
} node *query ( node *nd, int l, int r, int L, int R ) {
if ( l >= L && r <= R )
return nd;
int mid = ( l + r ) >> ;
node *nd1 = ++ tail, *nd2 = ++ tail;
if ( mid >= L )
nd1 = query ( nd -> ls, l, mid, L, R );
if ( mid < R )
nd2 = query ( nd -> rs, mid + , r, L, R );
node *st = ++ tail;
update ( st, nd1, nd2 );
return st;
} void modify ( node *nd, int l, int r, int pos, ll d ) {
if ( l == r ) {
nd -> lf = nd -> rg = d;
nd -> sum = d;
return ;
}
int mid = ( l + r ) >> ;
if ( pos <= mid ) modify ( nd -> ls, l, mid, pos, d );
else modify ( nd -> rs, mid + , r, pos, d );
update ( nd, nd -> ls, nd -> rs );
} int main ( ) {
scanf ( "%d%d", &n, &m );
for ( int i = ; i <= n; i ++ )
scanf ( "%lld", &a[i] );
root = build ( , n );
for ( int i = ; i <= m; i ++ ) {
char opt;
scanf ( "\n%c", &opt );
if ( opt == 'Q' ) {
int l, r;
scanf ( "%d%d", &l, &r );
node *ans = query ( root, , n, l, r );
printf ( "%lld\n", ( ans -> num1 + mod ) % mod );
} else if ( opt == 'A' ) {
int l, r;
scanf ( "%d%d", &l, &r );
node *ans = query ( root, , n, l, r );
printf ( "%lld\n", ( ans -> num2 + mod ) % mod );
} else {
int pos; ll r;
scanf ( "%d%lld", &pos, &r );
r = ( r + mod ) % mod;////
modify ( root, , n, pos, r );
}
}
return ;
}

【openjudge】 CDQZ challenge 4的更多相关文章

  1. 【openjudge】【前缀和】P6731啤酒厂选址

    [描述] 海上有一个岛,在环海边上建有一条环岛高速公路,沿着公路有n(5 < n < 10000)个居民点,假设每个居民点有一个编号,从0开始,按顺时针依次从小到大(即,0,1,…,n-1 ...

  2. 【openjudge】【字符串】P6374文字排版

    [描述] 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号).请将短文重新排版,要求如下: 每行不超过80个字符:每个单词居于同一行上:在同一行的单词之间以一个空格分隔:行首和行尾 ...

  3. 【openjudge】【搜索(bfs)】P4980拯救行动

    [描述:] 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫(x). 英勇的骑士(r)决定孤身一人 ...

  4. 【openjudge】【递推】例3.6 过河卒(Noip2002)

    [题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...

  5. 【openjudge】【递推】例3.4 昆虫繁殖

    [题目描述] 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵 ...

  6. 【openjudge】【字符串+模拟】1777:文件结构“图”

    [题目传送门:]戳 [描述:] 在计算机上看到文件系统的结构通常很有用.Microsoft Windows上面的"explorer"程序就是这样的一个例子.但是在有图形界面之前,没 ...

  7. 【openjudge】C15C Rabbit's Festival CDQ分治+并查集

    题目链接:http://poj.openjudge.cn/practice/C15C/ 题意:n 点 m 边 k 天.每条边在某一天会消失(仅仅那一天消失).问每一天有多少对点可以相互到达. 解法:开 ...

  8. 【CodeChef】December Challenge 2019 Div1 解题报告

    点此进入比赛 这次比赛本来想好好打的,但不幸的是,这周先是要认真复习准备月考,考完又是发烧在床上躺了一个周末,所以最终没能打完. 我还是好弱啊. \(T1\):Binary XOR(点此看题面) 大致 ...

  9. 【构造】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) D. Labelling Cities

    考试的时候想的是,将所有的完全子图缩起来,然后如果剩下的是一条链,依次对其进行标号即可. 看了官方题解,发现完全子图这个条件太强了,缩点的条件仅仅需要保证原本两个点的“邻接表”相同即可.(注意这里的“ ...

随机推荐

  1. C#匿名函数与Lambda表达式

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.在C#中的Linq中的大部分就是由扩展方法 ...

  2. Word Ladder I & II

    Word Ladder I Given two words (start and end), and a dictionary, find the length of shortest transfo ...

  3. hibernate的枚举注解@Enumerated

    @Enumerated(value=EnumType.ORDINAL)采用枚举类型的序号值与数据库进行交互, 此时数据库的数据类型需要是数值类型,例如在实际操作中 CatTest ct = new C ...

  4. Flask:cookie 和 session (0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 Cookie是什么?有什么用? 某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常 ...

  5. 关于整型Integer、Int32、Int64、IntPtr、UINT、UInt32、Cardinal、UInt64、UIntPtr、NativeUInt、Pointer、Handle

    知识点1:UIntPtr = NativeUInt = Pointer = Handle 随程序的位数改变而改变.如下: 所以以后再用指针的时候要这样:UintPtr/NativeUInt(实例) = ...

  6. Oracle学习笔记:trunc函数

    在Oracle中可以使用trunc函数进行日期截取和数字截取,具体使用方法如下: 1.trunc(for dates) 日期截取 语法:trunc(date,[fmt]) select trunc(s ...

  7. ****jQuery - 设置HTML内容和属性

    设置内容 - text().html() 以及 val() 我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容( ...

  8. Elasticsearch5.0 安装问题

    使用Elasticsearch5.0 必须安装jdk1.8 [elsearch@vm-mysteel-dc-search01 bin]$ java -version java version &quo ...

  9. 一步一步学习IdentityServer3 (5)

    这篇文章介绍下数据持久化问题,官方例子可能都是缓存数据 Client  User Scope 下面介绍下怎么使用数据库持久化 这里需要导入nuget包 :IdentityServer3.EntityF ...

  10. day7异常处理

    异常处理 下面看一个简单例子: data = {} try: data["name"] except KeyError as e: #e是错误的相信信息,错误的原因 print(& ...