清華集訓2014 玄學 二進位制分組

2021-09-03 01:52:55 字數 1784 閱讀 5929

鏈結

考慮對操作二進位制分組。每個塊內維護這個區間的操作把整個序列分成的段數(每一段有兩個值a,b

a,ba,

b代表這一段的真實值為ax+

bax+b

ax+b

)。比如相交的兩個操作會形成3段,分別為a1x

+b

a_1x+b

a1​x+b

,a 1a

2x+a

2b1+

b2,a

2x+b

2a_1a_2x+a_2b_1+b_2,a_2x+b_2

a1​a2​

x+a2

​b1​

+b2​

,a2​

x+b2

​由於運算元是o(n

)o(n)

o(n)

的,所以序列分成的段數也是o(n

)o(n)

o(n)

的。合併時計算新的段即可。

#include

using

namespace std;

typedef

long

long lint;

const

int maxn =

600005

;int t, n, mod, q;

int val[maxn]

, tot, id[maxn]

, l[maxn *4]

, r[maxn *4]

;struct node

t[maxn *30]

;int cnt;

inline

intgi()

#define lch (s << 1)

#define rch (s << 1 | 1)

#define mid ((l + r) >> 1)

void

build

(int s,

int l,

int r)

void

insert

(int l,

int r,

int a,

int b)

; t[

++cnt]

=(node);if

(r < n) t[

++cnt]

=(node)

; r[id[tot]

]= cnt;

int s = id[tot]

, i, j, n1, n2;

while

((s &1)

&& s >1)

;if(t[i]

.p == t[j]

.p)++i,

++j;

else

if(t[i]

.p < t[j]

.p)++i;

else

++j;

} r[s]

= cnt;}}

void

calc

(int s,

int x,

int&v)

v =((lint)t[l]

.a * v + t[l]

.b)% mod;

}void

query

(int s,

int l,

int r,

int x,

int y,

int p,

int&v)

intmain()

else

}return0;

}

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...

mysql二進位制 MySql二進位制連線方式詳解

使用mysql二進位制方式連線 您可以使用mysql二進位制方式進入到mysql命令提示符下來連線mysql資料庫。例項以下是從命令列中連線mysql伺服器的簡單例項 root host mysql u root p enter password 在登入成功後會出現 mysql 命令提示視窗,你可以...