【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
考试的时候想的是,将所有的完全子图缩起来,然后如果剩下的是一条链,依次对其进行标号即可. 看了官方题解,发现完全子图这个条件太强了,缩点的条件仅仅需要保证原本两个点的“邻接表”相同即可.(注意这里的“ ...
随机推荐
- rollup&&cube
group by 擴展 rollup&&cube --按job分組計算不同job的匯總工資 SELECT job, SUM (sal) FROM emp GROUP BY ...
- 基于Netty4.1.29.Final的helloworld实现.使用idea
服务端: //服务端 public class Server { public static void main(String[] args) { //创建两个线程组 EventLoopGroup c ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day4
第四天. 动态规划专题,讲师:闫神 讲了一些DP优化技巧,然而思想难度好大啊……根本没想到能优化那地步,连DP方程都没有呢. 不过有几题我还是想明白了. 讲了单调队列,决策单调性,四边形不等式,斜率优 ...
- 【Python学习笔记】使用python进行kmeans聚类
使用python进行kmeans聚类 假设我们要解决一个这样的问题. 以下是一些同学,大萌是一个学霸,而我们想要找到这些人中的潜在学霸,所以我们要把这些人分为两类--学霸与非学霸. 高数 英语 Pyt ...
- Git的安装和使用(Linux)【转】
转自:http://my.oschina.net/fhd/blog/354685 Git诞生于Linux平台并作为版本控制系统率先服务于Linux内核,因此在Linux上安装Git是非常方便的.可以通 ...
- Mysql中truncate table和delete语句的区别
Mysql中的truncate table和delete语句都可以删除表里面所有数据,但是在一些情况下有些不同! 例子: truncate table gag; (1)truncate table删除 ...
- MySQL权限操作:Grant、Revoke
数据库操作: 创建数据库.创建表——CREATE 删除数据库.删除表——DROP 删除表内容——TRUNCATE.DELETE(后者效率低.一行一行地删除记录) 查询数据库.查询表——SELECT 插 ...
- 金融数据分析 - 利用 Tushare Pro 平台 获取金融数据
Tushare金融大数据开放社区 免费提供各类金融数据和区块链数据 , 助力智能投资与创新型投资. 详见 https://tushare.pro/
- CNN Architectures(AlexNet,VGG,GoogleNet,ResNet,DenseNet)
AlexNet (2012) The network had a very similar architecture as LeNet by Yann LeCun et al but was deep ...
- python之assert断言
assert只是一个检查,为真不做任何事,不为真时,抛出异常,并包含错误信息 1.根据布尔值判断 2.判断是否相等 3.返回值是否为空 4.是否包含某值 x in y 其他方法,可以参考http:// ...