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

Solution

  • 首先,我们要知道向量的叉积,如何计算:

  • 对于两个平面向量 (x1,y1)(x1,y1) 和 (x2,y2)(x2,y2) ,根据定义,其叉积即为:x1∗y2−x2∗y1x1*y2-x2*y1

  • 而题目需要求:

    ∑l≤i<j≤r|vi∗vj|2=∑l≤i<j≤r(ai∗bj−aj∗bi)2

    \sum_{l\leq i

  • 经过加减的转化,上式可以化为:

    (∑i=1na2i)(∑i=1nb2i)−(∑i=1naibi)2

    (\sum_{i=1}^{n}a_i^2)(\sum_{i=1}^{n}b_i^2)-(\sum_{i=1}^{n}a_ib_i)^2

  • 这样每个值都只与自己有关,于是就可以用线段树维护。

  • 每个点存储 a2ia_i^2 、 b2ib_i^2 、 aibia_ib_i 这三种值,再区间分别维护这三种值的和即可。

  • 当修改单个向量时,就在线段树中单点修改即可。

  • 时间复杂度为 O((N+M) log N)O((N+M)\ log\ N) 。

Code

#include<cstdio>
using namespace std;
const int N=1e6+1,mo=20170927;
struct data{long long x,y,z;}a[N],z;
data operator +(data x,data y)
{z.x=(x.x+y.x)%mo;z.y=(x.y+y.y)%mo;z.z=(x.z+y.z)%mo;return z;
}
struct Stream
{inline int read(){int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;}inline void write(int x){if(x>9) write(x/10);putchar(x%10+'0');}
}Std;
struct Segment_Tree
{data f[N<<2];inline void make(int v,int l,int r){if(l==r){f[v].x=a[l].x*a[l].x%mo;f[v].y=a[l].y*a[l].y%mo;f[v].z=a[l].x*a[l].y%mo;return;}int mid=(l+r)>>1;make(v<<1,l,mid);make(v<<1|1,mid+1,r);f[v]=f[v<<1]+f[v<<1|1];}inline void change(int v,int l,int r,int x,long long y,long long z){if(l==r){f[v].x=y*y%mo;f[v].y=z*z%mo;f[v].z=y*z%mo;return;}int mid=(l+r)>>1;if(x<=mid) change(v<<1,l,mid,x,y,z); else change(v<<1|1,mid+1,r,x,y,z);f[v]=f[v<<1]+f[v<<1|1];}inline data find(int v,int l,int r,int x,int y){if(l>=x && r<=y) return f[v];int mid=(l+r)>>1;if(y<=mid) return find(v<<1,l,mid,x,y);if(x>mid) return find(v<<1|1,mid+1,r,x,y);return find(v<<1,l,mid,x,mid)+find(v<<1|1,mid+1,r,mid+1,y);}
}Tree;
int main()
{int n=Std.read(),m=Std.read();for(int i=1;i<=n;i++) a[i].x=Std.read(),a[i].y=Std.read();Tree.make(1,1,n);while(m--){int type=Std.read(),l=Std.read();if(type==1){long long x=Std.read(),y=Std.read();Tree.change(1,1,n,l,x,y);}else{data t=Tree.find(1,1,n,l,Std.read());Std.write((t.x*t.y%mo+mo-t.z*t.z%mo)%mo);putchar('\n');}}return 0;
}

JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜相关推荐

  1. JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  2. JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜

    Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...

  3. JZOJ 5425. 【NOIP2017提高A组集训10.25】数论

    Description 聪明的0v0正在学习莫比乌斯反演. 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵-- 剩下的题面,聪明的0v0不记得了.但是,她通过自己高超的数论技巧,给出了一个转 ...

  4. 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  5. JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    Description Input Output Sample Input 5 1 4 2 5 1 4 1 1 2 4 Sample Output 2 1 4 Data Constraint Solu ...

  6. 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    这是一道DP题,然后做的时候发现,DP式子死活推不出来. 题目大意(本人实在是不想复制了呵-- 给出A,B序列 找出他们的最长公共严格递增子序列 明确,这是一道DP 所以设状态fi,jf_{i,j}f ...

  7. JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    题解 题目的意思是求两个序列的最长公共上升子序列. 就此可以联想到求两个序列的最长公共子序列: 设fi,jf_{i,j}表示a序列处理到i,b序列处理j的最长公共子序列, 转移很简单. 现在要满足公共 ...

  8. 【NOIP2017提高A组集训10.25】摘Galo (树形dp)

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  9. JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

最新文章

  1. FastSpeech语音合成系统技术升级,微软联合浙大提出FastSpeech2
  2. 使用verdaccio 搭建npm私有仓库
  3. javaweb分页的后端实现
  4. (第二篇)Vue计算属性、侦听器、过滤器
  5. 系统测试分类和测试常用方法
  6. 2019年 ICPC亚洲区预赛(上海赛区)总结
  7. anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
  8. mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解
  9. mac java版本 不一致_mac实现不同版本的jdk切换
  10. Flex的事件(十四)
  11. Vue还有这种骚操作?浅析几个新手常常忽略的API
  12. as 怎么将多个cpp文件代码编译成so_你编写的Java代码是咋跑起来的?
  13. Git常用命令(持续更新)
  14. 读取ANSYS结果文件中的数据C语言,[转载][转载]如何在ANSYS中读入txt文件的数据
  15. 联想y7000笔记本触摸板开启快捷键_关闭笔记本触摸板四种方法【图文教程】
  16. Node.js升级或降低版本
  17. 机器学习(ML)、深度学习(DL)和图像处理(opencv)专用英语词典
  18. IBM笔记本使用法语输入法,如何键入法语特殊字符?
  19. 苹果电脑常用的计算机英语怎么说,史上最强苹果电脑Mac Pro发布 有啥亮点(中英文)...
  20. 计算机类研究生双证,想要报考计算机专业来攻读双证在职研究生最终是不是可以获得双证...

热门文章

  1. 奇异值分解讨论及其实现的计算步骤
  2. 计算机游戏的英语怎么写,电脑游戏英语怎么写
  3. php mysql explain_Mysql分析-explain的详细介绍
  4. softmax代价函数的导数计算
  5. [云炬创业基础笔记]第一章创业环境测试2
  6. [云炬创业基础笔记] 第三章测试10~12
  7. 第02课:深度学习 Python 必备知识点
  8. jsp可以使用iframe_使用 JavaScript object URLs,可以处理图像、音频和视频
  9. [java进阶]4.关键字throws和throw
  10. VTK修炼之道10:可视化管道的连接与执行