【openjudge】 CDQZ challenge 4
改了三天,提交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的更多相关文章
- 【openjudge】【前缀和】P6731啤酒厂选址
[描述] 海上有一个岛,在环海边上建有一条环岛高速公路,沿着公路有n(5 < n < 10000)个居民点,假设每个居民点有一个编号,从0开始,按顺时针依次从小到大(即,0,1,…,n-1 ...
- 【openjudge】【字符串】P6374文字排版
[描述] 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号).请将短文重新排版,要求如下: 每行不超过80个字符:每个单词居于同一行上:在同一行的单词之间以一个空格分隔:行首和行尾 ...
- 【openjudge】【搜索(bfs)】P4980拯救行动
[描述:] 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫(x). 英勇的骑士(r)决定孤身一人 ...
- 【openjudge】【递推】例3.6 过河卒(Noip2002)
[题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...
- 【openjudge】【递推】例3.4 昆虫繁殖
[题目描述] 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵 ...
- 【openjudge】【字符串+模拟】1777:文件结构“图”
[题目传送门:]戳 [描述:] 在计算机上看到文件系统的结构通常很有用.Microsoft Windows上面的"explorer"程序就是这样的一个例子.但是在有图形界面之前,没 ...
- 【openjudge】C15C Rabbit's Festival CDQ分治+并查集
题目链接:http://poj.openjudge.cn/practice/C15C/ 题意:n 点 m 边 k 天.每条边在某一天会消失(仅仅那一天消失).问每一天有多少对点可以相互到达. 解法:开 ...
- 【CodeChef】December Challenge 2019 Div1 解题报告
点此进入比赛 这次比赛本来想好好打的,但不幸的是,这周先是要认真复习准备月考,考完又是发烧在床上躺了一个周末,所以最终没能打完. 我还是好弱啊. \(T1\):Binary XOR(点此看题面) 大致 ...
- 【构造】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) D. Labelling Cities
考试的时候想的是,将所有的完全子图缩起来,然后如果剩下的是一条链,依次对其进行标号即可. 看了官方题解,发现完全子图这个条件太强了,缩点的条件仅仅需要保证原本两个点的“邻接表”相同即可.(注意这里的“ ...
随机推荐
- 一个简单的爆破 mysql 远程连接脚本(perl6)
sub MAIN(Str $host) { use DBIish; my $file = open 'password.txt'; while $file.get -> $line { my $ ...
- C# WebClient、 jsonp实现跨域
WebClient 无传输数据获取 Uri uri = new Uri(allURL); WebClient wc = new WebClient(); wc.Encoding = System.Te ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- 解决Win7&Win8 64位下Source Insight提示未完整安装的问题[转]
转自:http://www.cnblogs.com/sixiweb/p/3421533.html 网上的破解版的注册表文件都是针对32位系统的,所以在64位系统里运行根本无法破解.下面分别贴出这俩系统 ...
- Monkeyrunner的相关总结
1.1 monkeyrunner API 主要包括三个模块1.MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法.2 ...
- 原生JS实现AJAX、JSONP及DOM加载完成事件
一.JS原生Ajax ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务 ...
- css3在动画完成后执行事件
第一种方法: 用计时器,设定一个和动画时长一样的time,过time事件去执行这个函数. setTimeout(function(){ },time); 第二种方法: 当-webkit-animati ...
- 命令行执行Django脚本
命令行执行Django脚本 - #效仿manage.py加入的环境变量在脚本的文件加入 - #手动注册django所有的APP import sys,os ---------------------- ...
- Codeforces 946D Timetable(预处理+分组背包)
题目链接:http://codeforces.com/problemset/problem/946/D 题目大意:有n个字符串,代表n天的课表,1表示这个时间要上课,0表示不要上课,一天在学校时间为第 ...
- Unix IPC之pipe
pipe创建函数: #include <unistd.h> /* Create a one-way communication channel (pipe). If successful, ...