改了三天,提交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. [Ubuntu 14.04] 创建可以用于Android的WIFI热点

    Ubuntu的网络管理为创建Wifi热点提供了方便,可是因为它用了ad-hoc网络,所以其创建的Wifi又不能让Android系统使用.这篇文字就是为了解决这个问题 1.Install AP-Host ...

  2. springCloud全实战超详细代码demo+笔记

    码云: https://gitee.com/houzheng1216/springcloud

  3. PyTorch快速入门教程七(RNN做自然语言处理)

    以下内容均来自: https://ptorch.com/news/11.html word embedding也叫做word2vec简单来说就是语料中每一个单词对应的其相应的词向量,目前训练词向量的方 ...

  4. perl6 Net::HTTP 不能发送https请求

    如下命安装必要的包: sudo apt install libssl1.0.0 libssl-dev zef install IO::Socket::SSL zef install Net::HTTP

  5. 为什么使用do{}while(0)来进行宏定义

    最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因:   1,空的宏定义避 ...

  6. aarch64_l3

    librdmacm-utils-1.1.0-4.fc26.aarch64.rpm 2017-02-12 07:12 87K fedora Mirroring Project libreadline-j ...

  7. 一张图教会CSS3倒影

    分享 示例图片 在CSS3之前,想要实现示例图片这样的一个倒影效果一般只能通过处理图片的方式,而CSS3问世之后,想要实现这样的效果变得非常简单,只需一个CSS3属性就可以轻松实现了. 这就是今天所要 ...

  8. (一)问候 HtmlUnit

    第一节: HtmlUnit 简介 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实 ...

  9. RobotCraft 2017 第二届国际机器人学暑期学校 2nd Edition of International Robotics Summer School

    原文网址:http://www.ros.org/news/2017/02/2nd-edition-of-international-robotics-summer-school-robotcraft- ...

  10. Linux 系统目录结构和常用指令

    一.系统目录结构 /bin 经常使用的命令 /etc 所有系统管理所需的配置文件和子目录 /home 用户主目录 /usr 应用程序目录 /usr/bin 系统用户使用的应用程序 /usr/sbin ...