【BZOJ4262】Sum 單調棧+線段樹

【BZOJ4262】Sum

Description

Input

第一行一個數 t,表示詢問組數。
第一行一個數 t,表示詢問組數。
接下來 t 行,每行四個數 l_1, r_1, l_2, r_2。

Output

一共 t 行,每行一個數 Sum。

Sample Input

4
1 3 5 7
2 4 6 8
1 1 9 9
9 9 1 1

Sample Output

9322587654
9025304064
1065645568
0

HINT

1<=t<=40000,1<=L1<R1<=10^5,1<=L2<=R2<=10^5

題解:我們分開考慮max和pre的情況。我們將max(i...j)視為二維平面上點(i,j)的權值,處理出每個數左邊第一個比它大的數,然后這個數的貢獻區間可以就看成一個矩形(或三角形),而詢問就變成了求平面上一個矩形區域的權值和。可以用線段樹來搞。

不過線段樹維護歷史總和還真是不容易,打標記的部分還是好好說說吧。

維護三個值:v代表當前的區間和,s代表歷史的v之和,l代表區間長度。
維護四個標記:a,b,c,d,代表標記生效后,v=a*v+b*l,s=s+c*v+d*l。

關鍵在于標記如何合并。假如我們要將x和y的標記合并成z。

a:顯然z.a=x.a*y.a即可。
b:先要*=y.a,還要+=y.b。
c:+=x.a*y.c。
d:先要+=y.d,還要+=x.b*y.c。

?

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=100010;
typedef long long ll;
struct Tag
{ll a,b,c,d;Tag () {a=1,b=c=d=0;}Tag (ll A,ll B,ll C,ll D) {a=A,b=B,c=C,d=D;}Tag operator + (const Tag &x) const {return Tag(a*x.a,b*x.a+x.b,a*x.c+c,d+b*x.c+x.d);}
};
struct node
{ll v,s,l;Tag t;node () {v=s=l=0,t=Tag();}node (ll a,ll b,ll c,Tag d) {v=a,s=b,l=c,t=d;}inline void add(Tag x){s=s+v*x.c+l*x.d,v=v*x.a+l*x.b,t=t+x;}node operator + (const node &a) const{return node(v+a.v,s+a.s,l+a.l,Tag());}
}s[maxn<<2];
int m,n,top;
ll ans[maxn],v[maxn];
int st[maxn],pre[maxn];
struct QUERY
{int x,l,r,org,k;
}q[maxn];
bool cmp(const QUERY &a,const QUERY &b)
{return a.x<b.x;
}
inline void pushdown(int x)
{if(s[x].t.a!=1||s[x].t.b||s[x].t.c||s[x].t.d)	s[lson].add(s[x].t),s[rson].add(s[x].t),s[x].t=Tag();
}
void build(int l,int r,int x)
{if(l==r){s[x]=node(),s[x].l=1;return ;}int mid=(l+r)>>1;build(l,mid,lson),build(mid+1,r,rson);s[x]=s[lson]+s[rson];
}
void updata(int l,int r,int x,int a,int b,Tag t)
{if(a>b)	return ;if(a<=l&&r<=b){s[x].add(t);return ;}pushdown(x);int mid=(l+r)>>1;if(a<=mid)	updata(l,mid,lson,a,b,t);if(b>mid)	updata(mid+1,r,rson,a,b,t);s[x]=s[lson]+s[rson];
}
node query(int l,int r,int x,int a,int b)
{if(a<=l&&r<=b)	return s[x];pushdown(x);int mid=(l+r)>>1;if(b<=mid)	return query(l,mid,lson,a,b);if(a>mid)	return query(mid+1,r,rson,a,b);return query(l,mid,lson,a,b)+query(mid+1,r,rson,a,b);
}
void work(ll flag)
{int i,j;build(1,n,1);for(j=1;j<=2*m&&!q[j].x;j++);for(i=1;i<=n;i++){updata(1,n,1,pre[i],i,Tag(0,v[i],0,0)),s[1].add(Tag(1,0,1,0));for(;j<=2*m&&q[j].x==i;j++)	ans[q[j].org]+=flag*q[j].k*query(1,n,1,q[j].l,q[j].r).s;}
}
inline int rd()
{int ret=0,f=1;	char gc=getchar();while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
int main()
{m=rd();int i;ll t1=1,t2=1;for(i=1;i<=m;i++)	q[i].l=q[i+m].l=rd(),q[i].r=q[i+m].r=rd(),q[i].x=rd()-1,q[i+m].x=rd(),n=max(n,q[i+m].x),q[i].k=-1,q[i+m].k=1,q[i].org=q[i+m].org=i;for(i=1;i<=n;i++)	t1=t1*1023%1000000000,t2=t2*1025%1000000000,v[i]=t1^t2;sort(q+1,q+2*m+1,cmp);for(i=1;i<=n;i++){while(top&&v[st[top]]>=v[i])	top--;pre[i]=st[top]+1,st[++top]=i;}work(-1);for(top=0,i=1;i<=n;i++){while(top&&v[st[top]]<=v[i])	top--;pre[i]=st[top]+1,st[++top]=i;}work(1);for(i=1;i<=m;i++)	printf("%lld\n",ans[i]);return 0;
}

?

轉載于:https://www.cnblogs.com/CQzhangyu/p/7749437.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370807.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

父類一實現serializable_我的java基礎學習易錯點和易忘點總結(一)

一.繼承A:子類只能繼承父類所有非私有的成員(成員方法和成員變量)B:子類不能繼承父類的構造方法&#xff0c;但是可以通過super關鍵字去訪問父類構造方法。二.繼承中構造方法的關系A:子類中所有的構造方法默認都會訪問父類中空參數的構造方法B:為什么呢?因為子類會繼承父類中的…

Avocado 安裝和簡單測試

1.Avocado 安裝 1.1 通過包安裝 像Fedora可以通過rpm包進行安裝&#xff0c;其他通過RPM管理的發行版需要自己制作相關包。Avocado同樣支持DEP包的安裝可以在contrib/packages/debian找到。 Fedora 首先通過下面的命令獲取倉庫配置文件。 sudo curl https://repos-avocadoproje…

html文檔主體的根標簽,2 HTML簡介標簽嵌套和并列關系文檔聲明

HTML&#xff1a;Hyper Text Markup Language 超文本標簽語言(hyper&#xff1a;精力旺盛的 markup:標記 n noun)HTML不是編程語言&#xff0c;而是一種標記語言(就是一套標記標簽)&#xff0c;用于描述網頁&#xff0c;是網頁制作必備的。超文本是指頁面內可以包含圖片、鏈接…

深入克隆

在繼續克隆概念之前&#xff0c;讓我們用對象創建概念刷新基礎知識。 使用new運算符創建對象時&#xff0c;對象將在堆中獲取內存分配。 堆中的對象創建 在Java中&#xff0c;理想情況下僅通過引用變量修改對象&#xff0c;即僅復制對象的內存地址&#xff0c;因此原始對象中…

c# 口口亂碼_c# 亂碼解決方法

1 設置web.configrequestEncoding"utf-8"responseEncoding"utf-8"fileEncoding"utf-8"/>如果相應使用gb2312 &#xff0c;則html頁面也要設置相同&#xff0c;解決亂碼。如果為 utf-8 &#xff0c;則相應的html文件的屬性要轉換成utf-8保存&a…

《你的燈亮著嗎?》個人總結

我要如何去解決問題 搞清楚問題是什么 問題就是我們的體驗和期待的所產生的差異 * 問題的本質 * 問題的定義 * 問題的產生 * 問題的表述誰需要解決問題要多維的看待問題問題來自哪里問題的解決方法在特定的層面上去解決問題問題的解決是要交給能解決問題的人--誰能解決問題別輕…

html文檔的文件頭的主要作用是什么,文件頭

本詞條缺少概述圖&#xff0c;補充相關內容使詞條更完整&#xff0c;還能快速升級&#xff0c;趕緊來編輯吧&#xff01;文件頭是位于文件開頭的一段承擔一定任務的數據&#xff0c;一般都在開頭的部分。中文名文件頭位 置位于文件開頭任 務承擔一定任務的數據類 別文…

索引和未索引執行計劃的比較_詳解Oracle復合索引+實例說明

復合索引復合索引顧名思義&#xff0c;區別于單列索引&#xff0c;是由兩個或多個列一起構成的索引。其在B樹上的數據結構是什么樣&#xff1f;如下圖&#xff0c;是一個包含兩列的復合索引。如果你觀察仔細&#xff0c;還會發現它的葉子節點是ASC遞增排序的。現根據第一個值排…

Datables使用總結

本文共四部分&#xff1a;官網 | 基本使用|遇到的問題|屬性表 一&#xff1a;官方網站&#xff1a;[http://www.datatables.net/] 二&#xff1a;基本使用&#xff1a;[http://www.guoxk.com/node/jquery-datatables] 1、DataTables的默認配置 $(document).ready(function() { …

python面向窗體的開發_Python高級進階#019 pyqt5菜單menu應用,新建多窗體

知識回顧&#xff1a;1.掌握的是QCalendarWidget日歷控件2.click點擊事件(信號)觸發3.掌握日期的格式化QDate本節知識視頻教程以下開始文字講解&#xff1a;一、案例&#xff1a;菜單1.新建第一個窗體2.一級菜單的配置3.二級菜單的配置4.利用菜單功能實現界面跳轉&#xff0c;實…

用方面清理代碼

在我以前的文章中&#xff0c;我描述了字母轉換&#xff0c;并且提到了我們使用AspectJ解決了該任務&#xff0c;但是我沒有提及AspectJ的工作原理以及一般性的方面。 因此&#xff0c;在接下來的幾行中&#xff0c;我將解釋&#xff1a; 什么是面向方面的編程&#xff0c;為什…

java前三章總結

Java前三章總結 第一章&#xff1a;1.Java都有什么東西&#xff1f; Jdk&#xff08;java開發工具包&#xff09;包括 Jre&#xff08;Java運行環境&#xff09;---------->jvm&#xff08;Java虛擬機&#xff09; 應用&#xff08;javac&#xff09; Java API和一些常用的j…

原型 - 實現自己的jQuery

每個第一次使用jq的開發者都感到驚嘆,jq的$太神奇了,究竟是怎么做到的使用$控制dom 贊嘆前人之余,探究其本源才是前端開發者應該做的事,社區常常說,不要重復造輪子, 可是啊,連輪子都造不出來,又怎么去了解在什么環境下用什么輪子,怎么樣才可以造成更加優秀的輪子, 不同階段對…

html 用svg縮放拉伸,html – 拉伸SVG以適應其父級的100%高度和寬度

如果您對另一種選擇開放,您可以使用純CSS創建形狀.它不會像SVG那樣整潔,但它會響應&#xff1a;* {box-sizing:border-box;}.box {margin:40px;padding:0 10px;max-width:200px;display:inline-block;vertical-align:top;border-right:2px solid green;border-left:2px solid g…

server.transfer 無法跳轉頁面_H5 騰訊地圖無法導航

uni-app 打包H5騰訊地圖無法導航前言&#xff1a;最近幾天用uni-app開發安卓和iOS應用&#xff0c;打包成APP安裝包后&#xff0c;APP內做地圖導航沒有問題&#xff0c;APP內使用的是高德地圖&#xff1b;但是打包成為H5頁面后&#xff0c;運行在微信內置瀏覽器或者運行在第三方…

打破PermGen神話

在我的最新文章中&#xff0c;我解釋了可能導致java.lang.OutOfMemoryError&#xff1a;PermGen空間崩潰的原因 。 現在該討論該問題的可能解決方案了。 或者&#xff0c;更確切地說&#xff0c;是關于互聯網對可能解決方案的建議。 不幸的是&#xff0c;我只能說&#xff0c;我…

Linux獲取當前年月日后綴精確到微秒,例如2017-05-06T23:57:07.713171

代碼如下&#xff1a;詳細見注釋 #include <stdio.h> #include <string.h> #include <time.h> #include <sys/time.h>int main() {struct timeval start;struct tm *local_time NULL;static char str_time[100];char ms[16];gettimeofday( &start…

PhiloGL學習(5)——神說要有光,便有了光

前言 上一篇文章中介紹了如何創建三維對象及加載皮膚&#xff0c;本文為大家介紹如何為場景添加光源。 一、 原理分析 光在任何地方都是非常重要的&#xff0c;無論在哪里都說是要發光發熱&#xff0c;光和熱也是分不開的。光線分為點光源和線光源&#xff0c;所謂點光源和線光…

android 彈出彈框2秒消失_基于HTML5 Canvas 實現彈出框

前言用戶鼠標移入時&#xff0c;有彈出框出現&#xff0c;這樣的需求很常見。這在處理 HTML 元素實現時簡單&#xff0c;但是如果是對 HTML5 Canvas 構成的圖形進行處理&#xff0c;這種方法不再適用&#xff0c;因為 Canvas 使用的是另外一套機制&#xff0c;無論在 Canvas 上…

【CSS】小妙招,各種問題總結方法處理

1.實現div文字溢出自動省略號截取 overflow:hidden; /*超過部分不顯示*/       text-overflow:ellipsis; /*超過部分用點點表示*/       white-space:nowrap;/*不換行*/ 2.規定行數的截取效果 text-overflow: ellipsis; /*有些示例里需要定義該屬性&#xff0c…