【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜(树状数组)

本文主要是介绍【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜(树状数组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

这里写图片描述

Input

第一行两个整数n;m 表示电子个数和询问个数.
接下来n 行, 每行两个整数x; y 表示vi.
接下来m 行, 每行形如1 p x y 或2 l r, 分别表示两种操作.

Output

对于每个操作2, 输出一行一个整数表示飘升系数对20170927 取模的值.

Sample Input

9 5
13052925 5757314
9968857 11135327
13860145 3869873
6912189 3461377
2911603 7061332
6334922 7708411
5505379 5915686
6806727 588727
7603043 15687404
2 1 6
1 7 2602783 18398476
1 8 8636316 19923037
2 2 7
2 2 4

Sample Output

18529202
963126
19167545

Data Constraint

这里写图片描述


题解

首先,那个 vivj 其实就是 xiyjxjyi
然后就用完全平方公式展开那个式子,再化简一下:
x2iy2i+xiyi
然后树状数组维护这三个前缀和就好了。
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<vector>
#define ll long long
using namespace std;
inline int read(){int x=0;char ch=' ';int f=1;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')f=-1,ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
const ll p=20170927;
int n,m;
ll x[1000001],y[1000001];
ll x2[1000001],y2[1000001],xy[1000001];
inline void update(int a,ll b,ll c){ll xx=x[a],yy=y[a];int tmp =a;while(a<=n){x2[a]=(x2[a]-(xx*xx)%p+p)%p;y2[a]=(y2[a]-(yy*yy)%p+p)%p;xy[a]=(xy[a]-(xx*yy)%p+p)%p;a+=a&-a;}xx=b;yy=c;a = tmp;while(a<=n){x2[a]=(x2[a]+(xx*xx)%p)%p;y2[a]=(y2[a]+(yy*yy)%p)%p;xy[a]=(xy[a]+(xx*yy)%p)%p;a+=a&-a;}
}
inline ll query(int l,int r){ll sumx2=0,sumy2=0,sumxy=0;while(r){sumx2=(sumx2+x2[r])%p;sumy2=(sumy2+y2[r])%p;sumxy=(sumxy+xy[r])%p;r-=r&-r;}l--;while(l){sumx2=(sumx2-x2[l]+p)%p;sumy2=(sumy2-y2[l]+p)%p;sumxy=(sumxy-xy[l]+p)%p;l-=l&-l;}ll ans=(sumx2*sumy2)%p;ans=(ans-(sumxy*sumxy)%p+p)%p;return ans;
}
int main(){freopen("kurisu.in","r",stdin);freopen("kurisu.out","w",stdout);n=read();m=read();for(int i=1;i<=n;i++){x[i]=read();y[i]=read();int a=i;ll xx=x[i],yy=y[i];while(a<=n){x2[a]=(x2[a]+(xx*xx)%p)%p;y2[a]=(y2[a]+(yy*yy)%p)%p;xy[a]=(xy[a]+(xx*yy)%p)%p;a+=a&-a;}}while(m--){ll opt=read(),a=read(),b=read();if(opt==1){ll c=read();update(a,b,c);x[a]=b;y[a]=c;}else{printf("%lld\n",query(a,b));}}return 0;
}

这篇关于【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜(树状数组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397410

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou