hdu 3074 线段树 OR 树状数组

比较基础的线段树,1A。

线段树:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 using namespace std;
  5 
  6 typedef long long ll;
  7 const int N = 50001;
  8 const int MOD = 1000000007;
  9 int a[N];
 10 
 11 struct Node
 12 {
 13     int l, r, s;
 14 } node[N << 2];
 15 
 16 void pushup( int i )
 17 {
 18     node[i].s = ( ll ) node[i << 1].s * node[i << 1 | 1].s % MOD;
 19 }
 20 
 21 void build( int i, int l, int r )
 22 {
 23     node[i].l = l, node[i].r = r;
 24     if ( l == r )
 25     {
 26         node[i].s = a[l];
 27         return ;
 28     }
 29     int mid = ( l + r ) >> 1;
 30     build( i << 1, l, mid );
 31     build( i << 1 | 1, mid + 1, r );
 32     pushup(i);
 33 }
 34 
 35 void update( int i, int pos, int val )
 36 {
 37     if ( node[i].l == pos && node[i].r == pos )
 38     {
 39         node[i].s = val;
 40         return ;
 41     }
 42     int mid = ( node[i].l + node[i].r ) >> 1;
 43     if ( pos <= mid )
 44     {
 45         update( i << 1, pos, val );
 46     }
 47     else
 48     {
 49         update( i << 1 | 1, pos, val );
 50     }
 51     pushup(i);
 52 }
 53 
 54 int query( int i, int l, int r )
 55 {
 56     if ( node[i].l == l && node[i].r == r ) return node[i].s;
 57     int mid = ( node[i].l + node[i].r ) >> 1;
 58     if ( r <= mid )
 59     {
 60         return query( i << 1, l, r );
 61     }
 62     else if ( l > mid )
 63     {
 64         return query( i << 1 | 1, l, r );
 65     }
 66     else
 67     {
 68         return ( ll ) query( i << 1, l, mid ) * query( i << 1 | 1, mid + 1, r ) % MOD;
 69     }
 70 }
 71 
 72 int main ()
 73 {
 74     int t;
 75     scanf("%d", &t);
 76     while ( t-- )
 77     {
 78         int n, m;
 79         scanf("%d", &n);
 80         for ( int i = 1; i <= n; i++ )
 81         {
 82             scanf("%d", a + i);
 83         }
 84         build( 1, 1, n );
 85         scanf("%d", &m);
 86         while ( m-- )
 87         {
 88             int op, a, b;
 89             scanf("%d%d%d", &op, &a, &b );
 90             if ( op == 0 )
 91             {
 92                 printf("%d\n", query( 1, a, b ));
 93             }
 94             else
 95             {
 96                 update( 1, a, b );
 97             }
 98         }
 99     }
100     return 0;
101 }

 

当然,对于这种单点修改和查询区间“前缀和”的问题,我们自然也可以用树状数组来做,不过要用到乘法逆元。

对于这道题来说,树状数组反而难写,并且时间上也没有什么优势。

不过这是一种思想,将“加法”扩展到了“乘法”。

也可以考虑用log把乘法变成加法,不过可能会有精度问题。

树状数组:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 typedef long long ll;
 7 const int N = 50001;
 8 const int MOD = 1000000007;
 9 int a[N];
10 int c[N];
11 
12 void extgcd( int a, int mod, int &x, int &y )
13 {
14     if ( !mod )
15     {
16         x = 1, y = 0;
17     }
18     else
19     {
20         extgcd( mod, a % mod, y, x );
21         y -= x * ( a / mod );
22     }
23 }
24 
25 int lb( int i )
26 {
27     return i & -i;
28 }
29 
30 void update( int i, int x )
31 {
32     while ( i < N )
33     {
34         c[i] = ( ll ) c[i] * x % MOD;
35         i += lb(i);
36     }
37 }
38 
39 int get( int i )
40 {
41     int ans = 1;
42     while ( i )
43     {
44         ans = ( ll ) ans * c[i] % MOD;
45         i -= lb(i);
46     }
47     return ans;
48 }
49 
50 int main ()
51 {
52     int t;
53     scanf("%d", &t);
54     while ( t-- )
55     {
56         int n, m;
57         scanf("%d", &n);
58         for ( int i = 1; i <= n; i++ )
59         {
60             c[i] = 1;
61         }
62         for ( int i = 1; i <= n; i++ )
63         {
64             scanf("%d", a + i);
65             update( i, a[i] );
66         }
67         scanf("%d", &m);
68         while ( m-- )
69         {
70             int op, x, y, inv, useless;
71             scanf("%d%d%d", &op, &x, &y );
72             if ( op == 0 )
73             {
74                 extgcd( get( x - 1 ), MOD, inv, useless );
75                 inv = ( inv + MOD ) % MOD;
76                 int tmp = ( ll ) inv * get(y) % MOD;
77                 printf("%d\n", tmp);
78             }
79             else
80             {
81                 extgcd( a[x], MOD, inv, useless );
82                 inv = ( inv + MOD ) % MOD;
83                 inv = ( ll ) inv * y % MOD;
84                 a[x] = ( ll ) a[x] * inv % MOD;
85                 update( x, inv );
86             }
87         }
88     }
89     return 0;
90 }

 

转载于:https://www.cnblogs.com/huoxiayu/p/4692270.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握shell编程中数组的常见用法及示例

From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2386.html 给大家分享下数组的用法小例子&#xff0c;希望能给大家一点帮助。其实SHELL的数组很简单&#xff0c;好用。我们学习都应该遵循简单、易用的原则。 shell编程中数组的简单用法及示例 新版本的B…

QT tr与Qstring的差别

在论坛中漂&#xff0c;经常遇到有人遇到tr相关的问题。用tr的有两类人&#xff1a; (1)因为发现中文老出问题&#xff0c;然后搜索&#xff0c;发现很多人用tr&#xff0c;于是他也开始用tr(2)另一类人&#xff0c;确实是出于国际化的需要&#xff0c;将需要在界面上显示的文…

printf的扩展

#define printf(format , ...) printf("FILE[%s] LINE[%d]" format , __FILE__ , __LINE__ , ##__VA_ARGS__)这个宏应用好几个技巧&#xff1a;1、使用printf宏&#xff0c;和原来的printf相同。这样我们不需要修改源码&#xff0c;直接替换原来的printf的函数。2、…

[react] contextType是什么?它有什么用?

[react] contextType是什么&#xff1f;它有什么用&#xff1f; 定义当前组件要使用哪一个context const MyContext React.createContext(defaultValue);class MyClass extends React.Component {componentDidMount() {let value this.context;/* perform a side-effect at…

shell 基本知识

shell--脚本基础知识 ****shell 脚本基础知识**** 一、基本脚本编译 知识内容&#xff1a; # 构建脚本 # 将命令串联起来 # 存储变量 # 数学计算 # 重定向输出 # 检查代码shell不像高级语言需要编译后执行&#xff0c;而是直接处理每一条命令&#xff0c;可以将多条命令连接起来…

Lombok(1.14.8) - @Log

Log Logs&#xff0c;生成一个日志对象。 package com.huey.lombok;import lombok.extern.java.Log;Log public class LogExample {public static void main(String[] args) {log.info("This is an info message."); }} 除了&#xff0c;Log还有其他annotatio…

让LwIP拥有PING其他设备的能力

LwIP是个很不错的协议栈&#xff0c;但是由于其体积过于小巧&#xff0c;使其只能支持ICMP的ECHO类型。 因为在“icmp.c”中的“void icmp_input(struct pbuf *p, struct netif *inp)”函数里有个很长的switch case语句&#xff08;大约80行的位置&#xff09;。 而这个语句只…

[react] 在React怎么使用Context?

[react] 在React怎么使用Context&#xff1f; context : Context提供了一种方式&#xff0c;能够让数据在组件树中传递&#xff0c;而不必一级一级手动传递。 API : createContext(defaultValue?)。 使用方法&#xff1a; 首先要引入createContext import React, { Component…

H.264详解

From: http://netliuwei.blog.163.com/blog/static/93642191201111721931583/ H.264 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&…

使用UDP

基本UDP客户端 #!/usr/bin/env python # UDP Example - Chapter 2 import socket, sys, time host sys.argv[1] textport sys.argv[2] s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: port int(textport) except ValueError: # That didnt work. Look it up in…

QT中的MessageBox设置自动关闭退出

一、概述 由于弹出的MessageBox需要手动操作&#xff0c;点击相关操作程序才会进一步执行&#xff0c;所以有时程序使用了MessageBox会阻塞相关功能代码执行。例如&#xff0c;在串口编程中&#xff0c;接收到数据或某项配置成功后弹出一个MessageBox&#xff0c;由于没有及时…

(剑指Offer)面试题54:表示数值的字符串

题目&#xff1a; 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14"…

Loopback Address

ping 127.0.0.1 是你本地的回环地址&#xff01; 实际上只要是127.0.0.1到127.255.255.255都是回环地址&#xff01;都是可以PING检查的&#xff01; 它能ping通&#xff0c;说明你的TCP/IP协议栈没问题&#xff01;如果有问题&#xff0c;你就得检查TCP/IP协议栈&#xff0c;或…

[react] Consumer向上找不到Provider的时候怎么办?

[react] Consumer向上找不到Provider的时候怎么办&#xff1f; 当consumer向上层找不到provider时&#xff0c;此时就会取创建context时传给createContext的那个值&#xff0c;也就是当前context对象的默认值&#xff0c;在定义provider时的value中的值不是默认值&#xff0c;…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…

赵丽词汇速记5500幻星笔记 (0、1)

赵丽词汇速记<5500>幻星笔记00-1开场白自我介绍http://teacherzhaoli.nease.net/上课要求:需要准备一个笔记本able adj.enable v.ability n.如何记笔记&#xff1a;把笔记打成三格单词中文助记方法搜索引擎&#xff1a;赵丽词汇词汇重要性词汇当先1.阅读离不开单…

matlab 数据是否符合正态分布的判断方法

一、问题描述 给定序列X(x1,x2,x3,...,xn)&#xff0c;判断是否该数据序列X符合正态分布。 二、方法 常见已知分布的检验方法&#xff1a;kstest、jbtest、lillietest、chi2gof等&#xff0c;这里使用使用Lilliefors检验进行描述。 语法&#xff1a; 1&#xff1a;h lillie…

什么是CIF/4CIF/QCIF/D1?

From: http://www.c-ps.net/trade/content/2008/8/8009.html QCIF全称Quarter common intermediate format。QCIF是常用的标准化图像格式。在H.323协议簇中&#xff0c;规定了视频采集设备的标准采集分辨率。QCIF 176144像素。 CIF是常用的标准化图像格式&#xff08;Commo…

字符串string和内存流MemoryStream及比特数组byte[]互转

定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 (1)byte[] btSystem.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] btConvert.FromBase64String("字符串"); 2.字符串转流 (1)MemoryStream msnew MemoryStream(System.Text.…

Lwip使用经验

LWIP使用经验 一 LWIP内存管理 数据包管理 设置内存大小 宏编译开关 二 LWIP启动时序 三 LWIP运行逻辑 接收数据包 SequentialAPI函数调用 四 TCPIP核心知识点 滑动窗口 三次握手 断开连接 TCP状态转换 同时打开 同时关闭 五正确使用LWIP 六 LWIP常见问题 网卡驱动程序 内存…