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.pswp.cn/news/271873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271873.shtml
英文地址,請注明出處:http://en.pswp.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;打工…

java獲取用戶地理位置_java web 通過ip獲取當前地理位置

public static void main(String[] args) throws Exception{// A File object pointing to your GeoIP2 or GeoLite2 databaseFile database new File("F:/定位/GeoLite2-City.mmdb");// This creates the DatabaseReader object, which should be reused across// …

IOC和DI是什么?

IoC (Inversion of Control) 控制反轉 什么是控制反轉&#xff1f; 控制反轉是就是應用本身不負責依賴對象的創建和維護,依賴對象的創建及維護是由外部容器負責的,這樣控制權就有應用轉移到了外部容器,控制權的轉移就是控制反轉。 DI (Dependency Injection) 依賴注入 什么…

程序員公司選擇:創業公司、中等規模公司、大公司

作為一名開發人員&#xff0c;選擇不同類型的開發公司你的工作體驗可能會完全不同&#xff0c;不同的公司文化也會深刻的影響著你的工作幸福感、存在感、歸屬感。本篇文章主要給大家分享一下不同類型的公司有什么特點&#xff0c;應該如何進行選擇&#xff0c;希望對大家能帶來…

jsp java注釋_jsp注釋方式

1&#xff0c;HTML的注釋方法說明:使用該注釋方法,其中的注釋內容在客戶端瀏覽中是看不見的。但是查看源代碼時,客戶是可以看到這些注釋內容2&#xff0c;JSP注釋標記JSP 也提供了自己的標記來進行注釋,其使用的格式一般如下:add your comments here--%>說明:使用該注釋方法…

cojs 香蕉 解題報告

啦啦啦&#xff0c;今天的考試題 不過原來考試題的n<10w 由于我有更好的做法&#xff0c;所以我就改成20億辣 本來先說一說考試題的正解做法的 但是復雜度是O(nlogm)&#xff0c;實在是太渣了 所以還是說一說我的做法吧 首先假定都會寫裸的DP 我們考慮A,B&#xff0c;如果B不…

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…

python操作文件和目錄_python文件和目錄操作方法

一、python中對文件、文件夾操作時經常用到的os模塊和shutil模塊常用方法。1.得到當前工作目錄&#xff0c;即當前Python腳本工作的目錄路徑: os.getcwd()2.返回指定目錄下的所有文件和目錄名:os.listdir()3.函數用來刪除一個文件:os.remove()4.刪除多個目錄&#xff1a;os.rem…

[遞推] hihocoder 1239 Fibonacci

題目大意 題目鏈接&#xff0c;給定長度為 \(n\) 的數組\(\{a_i\}\)&#xff0c;問有多少個子序列是斐波那契序列$ {f_i}{1,1,2,3,5,..}$ 的前綴&#xff0c;例如 \(\{1\},\{1,1,2\}\)。取值范圍 $n\leq {10}^6,a_i \leq {10}^5 $。 算法思路 數組 \(a_i\) 取值在前 \(26\) 個斐…

程序員如何高效的學習?

作為一名程序員&#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() 方法