BZOJ_1798__Codevs_2216_[AHOI_2009]_行星序列_(线段树)

描述


BZOJ: http://www.lydsy.com/JudgeOnline/problem.php?id=1798

Codevs: http://codevs.cn/problem/2216/

给出n和行星的质量,进行m次操作:

1.将[l,r]区间内所有行星质量*c.

2.将[l,r]区间内所有行星质量+c.

3.询问[l,r]区间内行星质量和.

 

分析


双标记线段树,多加一个乘法的标记.a[k]位置的标记表示的是要传给a[k]的子节点的值,乘法位置为a[k].f,加法为a[k].p,表示的是先乘后加.按照先乘后加的规定,当跟新值时,ax+b变为(ax+b)*c1+c2=axc1+bc1+c2=(axc1)+(bc1+c2),也就是标记向下传递(push_down)的时候,乘法位置要乘,加法位置要先乘后加.

之前一直wa,最后才发现数组没开够...

感觉好像把乘法转化为加法也能做...但没尝试.

注意:

1.最好在确保扔给函数的参数都是取过模的,这样不容易出错.

2.可以不用long long定义,在乘法的时候强制转换一下就好了.

 

  1 #include<cstdio>
  2 #include<algorithm>
  3 #define ll long long
  4 #define lson 2*k
  5 #define rson 2*k+1
  6 
  7 const int maxn=1e5+5;
  8 int n,m,mod;
  9 int w[maxn];
 10 struct node { int l,r,x,f,p; }a[3*maxn];
 11 
 12 void build_tree(int l,int r,int k)
 13 {
 14     a[k].l=l; a[k].r=r; a[k].f=1; a[k].p=0;
 15     if(l==r)
 16     {
 17         a[k].x=w[l]; 
 18         return; 
 19     }    
 20     int mid=l+(r-l)/2;
 21     build_tree(l,mid,lson);
 22     build_tree(mid+1,r,rson);
 23     a[k].x=(a[lson].x+a[rson].x)%mod;
 24 }
 25 
 26 inline void cal(int k,int f,int p)
 27 {
 28     a[k].x=(int)((((ll)a[k].x*(ll)f)%mod+((ll)(a[k].r-a[k].l+1)%mod)*(ll)p)%mod);
 29     a[k].f=(int)(((ll)a[k].f*(ll)f)%mod);
 30     a[k].p=(int)((((ll)a[k].p*(ll)f)%mod+p)%mod);
 31 }
 32 
 33 inline void push_down(int k)
 34 {
 35     cal(lson,a[k].f,a[k].p);
 36     cal(rson,a[k].f,a[k].p);
 37     a[k].f=1;
 38     a[k].p=0;
 39 }
 40 
 41 void update(int l,int r,int k,int f,int p)
 42 {
 43     if(a[k].l==l&&a[k].r==r)
 44     {
 45         cal(k,f,p);
 46         return;
 47     }
 48     if(a[k].f!=1||a[k].p)
 49     {
 50         push_down(k);
 51     }
 52     int mid=a[k].l+(a[k].r-a[k].l)/2;
 53     if(r<=mid)
 54     {
 55         update(l,r,lson,f,p);
 56     }
 57     else if(l>mid)
 58     {
 59         update(l,r,rson,f,p);
 60     }
 61     else
 62     {
 63         update(l,mid,lson,f,p);
 64         update(mid+1,r,rson,f,p);
 65     }
 66     a[k].x=(a[lson].x+a[rson].x)%mod;
 67 }
 68 
 69 int search(int l,int r,int k)
 70 {
 71     if(a[k].l==l&&a[k].r==r)
 72     {
 73         return a[k].x;
 74     }
 75     if(a[k].f!=1||a[k].p)
 76     {
 77         push_down(k);
 78     }
 79     int mid=a[k].l+(a[k].r-a[k].l)/2;
 80     if(r<=mid)
 81     {
 82         return (search(l,r,lson)%mod);
 83     }
 84     else if(l>mid)
 85     {
 86         return (search(l,r,rson)%mod);
 87     }
 88     else
 89     {
 90         return ((search(l,mid,lson)+search(mid+1,r,rson))%mod);
 91     }
 92 }
 93 
 94 int main()
 95 {
 96 #ifndef ONLINE_JUDGE
 97     freopen("star.in","r",stdin);
 98     freopen("star.out","w",stdout);
 99 #endif
100     scanf("%d%d",&n,&mod);
101     
102     for(int i=1;i<=n;i++)
103     {
104         scanf("%d",&w[i]);
105     }
106     build_tree(1,n,1);
107     scanf("%d",&m);
108     int qry,l,r,c;
109     for(int i=1;i<=m;i++)
110     {
111         scanf("%d%d%d",&qry,&l,&r);
112         switch(qry)
113         {
114             case 1:
115                 scanf("%d",&c);
116                 c%=mod;
117                 update(l,r,1,c,0);
118                 break;
119             case 2:
120                 scanf("%d",&c);
121                 c%=mod;
122                 update(l,r,1,1,c);
123                 break;
124             case 3:
125                 printf("%d\n",search(l,r,1));
126                 break;
127         }
128     }
129 #ifndef ONLINE_JUDGE
130     fclose(stdin);
131     fclose(stdout);
132     system("star.out");
133 #endif
134     return 0;
135 }
View Code

 

转载于:https://www.cnblogs.com/Sunnie69/p/5436371.html

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

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

相关文章

Java中三种Set的实现类的用法和区别

Java为开发者提供了大量的工具类&#xff0c;这给开发人员带来了很大方便&#xff0c;但是选择多了也有困扰&#xff0c;究竟用哪个类&#xff1b;我想选择什么&#xff0c;一是看自己具体需求&#xff0c;二是类本身的性能和用法&#xff1b;Java中提供了HashSet、TreeSet、Li…

程序员的职业选择:打工者、独立开发者、创业者

当你励志成为一名程序员的时候&#xff0c;你是否有对自己的职业生涯进行规划&#xff0c;作为一名开发人员你的理想是什么&#xff0c;希望成为一名什么样的开发者&#xff0c;这些都是不可逃避的问题&#xff0c;本篇文章给大家简单介绍一下程序员的职业选择&#xff1a;打工…

程序员公司选择:创业公司、中等规模公司、大公司

作为一名开发人员&#xff0c;选择不同类型的开发公司你的工作体验可能会完全不同&#xff0c;不同的公司文化也会深刻的影响着你的工作幸福感、存在感、归属感。本篇文章主要给大家分享一下不同类型的公司有什么特点&#xff0c;应该如何进行选择&#xff0c;希望对大家能带来…

Cannot access repo1 (http://repo1.maven.org/maven2) in offline mode and the

我在maven打包的时候出现问题&#xff0c;报错如下&#xff1a; 解决方法&#xff1a; 方法一&#xff1a;如果你出现了如上错误,是因为你的离线模式而导致的依赖的jar包或者需要的插件不能够联网下载 箭头处按钮不能点&#xff0c;点击后表示离线模式 方法二&#xff1a;idea…

作为程序员如何成为专业人士?

1、什么是专业人士&#xff1f;专业人士通常会严肃对待自己的责任和事业&#xff0c;并且愿意作出艰难的选择&#xff0c;然后去做自己认为是正确的事情&#xff0c;当然往往还要自己承担对应的代价。2、专业人士的特点1、恪尽职守、精益求精、不会曲意逢迎。专业人士会让你知道…

linux安装mysql8依赖的环境_CentOS Linux release 8 安装mysql8.

删除用户userdel username删除用户组groupdel groupname查看操作系统信息cat /proc/version操作系统版本信息:Linux version 4.18.0-80.11.2.el8_0.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC)) #1 SMP Tue Sep 24 11:32…

jsonp 跨域原理详解

JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中&#xff0c;有一个很重要的安全性限制&#xff0c;被称为“Same-Origin Policy”&#xff08;同源策略&#xff09;。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制&#xff0c;即Jav…

程序员远程办公需要面临哪些挑战?

当今&#xff0c;越来越多的软件开发团队允许他们的开发人员在家里远程工作。甚至有些团队完全是虚拟团队&#xff0c;他们没有真正的办公环境。另外如果你是一名自由软件工作者&#xff0c;也是属于远程办公的一种形式的体现。大家可能认为远程工作是那么美好和令人向往。你也…

启动项目出现com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException异常解决方法

启动SpringBoot项目失败mysql连接错误 2020-03-21 20:16:25.193 INFO 8204 --- [ main] com.cnadmart.ApiApplication : Starting ApiApplication on DESKTOP-NFT332E with PID 8204 (D:\gunangpinhui\gphProject\cnadmart-api1.1\target\classes sta…

程序员如何高效的学习?

作为一名程序员&#xff0c;技术的日新月异的发展、行业竞争也是愈演愈烈。你如果想让自己立于不败之地。自学是必不可少的。如何能够高效的自学呢&#xff1f;本篇文章给大家简单梳理一下对应的方法流程&#xff0c;希望能对大家能有一些帮助。1、要有全局观&#xff0c;做到心…

BeanFactory与FactoryBean的区别

spring不允许我们直接操作 BeanFactory bean工厂&#xff0c;所以为我们提供ApplicationContext 这个接口 此接口继承BeanFactory 接口&#xff0c;ApplicationContext包含BeanFactory的所有功能,同时还进行更多的扩展。 BeanFactory是个Factory&#xff0c;也就是IOC容器或对…

MyBatis入门教程(基于Mybatis3.2)

MyBatis和Hibernate一样都是基于ORM的关系型数据库框架 ORM工具的基本思想&#xff1a; 1.从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session。 5.在java对象…

程序员效率:画流程图常用的工具

1、VisioVisio是Windows操作系统下运行的流程图和矢量绘图软件&#xff0c;它属于Office办公软件的一部分。特点&#xff1a;内置大量的模板方便使用&#xff0c;界面简洁操作方便&#xff0c;功能十分全面&#xff0c;因为属于office系列可以很方便和word办公软件结合起来使用…

如何实现数组和 List 之间的转换?

数组转 List&#xff1a;使用 Arrays. asList() 进行转换。 List 转数组&#xff1a;使用 List 自带的 toArray() 方法

程序员职场:拥有一个学位将会在你的职业生涯中更加顺利!

1、作为程序员为什么要拥有学位&#xff1f;很多情况下&#xff0c;作为程序员&#xff0c;学位是进入大公司的敲门砖。现在很多大的科技公司&#xff0c;学位是硬性要求。一般都是本科以上的学历&#xff0c;甚至有的必须是硕士以上学历。如果你的学历达不到&#xff0c;基本上…

程序员常见的职业病有哪些?

程序员是一个久坐的行业&#xff0c;基本上一天有十几个小时需要坐在电脑旁边&#xff0c;随之而来会给我们这些广大的程序员朋友们身体健康带来了很大的隐患。作为一名优秀的程序员&#xff0c;爱护自己的身体也是非常重要的&#xff0c;毕竟身体是革命的本钱嘛。今天主要给大…

java文件流null_JAVA 获取资源文件对象为NULL

今天&#xff0c;写一个添加背景音乐的方法时&#xff0c;在导入当前文件夹下的音乐时中始终出现,以下的异常&#xff0c;Exception in thread "main" java.lang.NullPointerException文件存储位置存放在当前的modlue目录下,格式为wav.源代码private void playBGM(){…

程序员如何快速消除自己的知识短板?

在程序员的职业生涯当中&#xff0c;知识短板将会是你职业生涯发展的瓶颈。只要你能够消除这些短板&#xff0c;这对你的职业发展会大有裨益。本篇文章主要给大家分享一下如何解决自己工作当中的知识短板。希望对大家能有些帮助。1、关于知识短板的概念理解我个人认为所谓的知识…

HashMap默认大小和扩容后的大小

put添加的元素Entry就是数组中的元素&#xff0c;每个Map.Entry其实就是一个key-value对&#xff0c;它持有一个指向下一个元素的引用&#xff0c;这就构成了链表。 创建HashMap对象默认情况下&#xff0c;数组大小为16。 开始扩容的大小原来的数组大小*loadFactor。 扩容后…

程序员效率:职业倦怠的理解

作为程序员保持高效的工作效率最大的挑战之一就是身体和心理上产生的倦怠。这个是非常常见的&#xff0c;比如刚开始你自己做一个新项目的时候&#xff0c;项目刚开始&#xff0c;我们总是充满激情、精力旺盛。大多数情况随着时间的推移&#xff0c;我们的激情慢慢减退&#xf…