線段樹練習

2022-06-03 09:54:06 字數 1481 閱讀 7731

一鍵挖礦

#includeusing namespace std;

#define n 2000010

#define int long long

#define f(x) (x==1||x==3)

int n,m,tg[n],x[n],y[n],tx[4]=,ty[4]=,ans;

vectorv[n];

struct vac[n];

va operator +(va x,va y);

if(z.x==x.x)

z.c+=x.c;

if(z.x==y.x)

z.c+=y.c;

return z;

}void pd(int o)

}void up(int o)

void ad(int o,int l,int r,int x,int y,int z)

int qu(int o,int l,int r,int x,int y)

}sg[4];

void ad(int x,int y)

signed main()

for(int i=0;i<4;i++)

for(int j=0;j<=r;j++){

sg[i].rt[j+1]=sg[i].rt[j];

int le=v[i][j].size();

for(int k=0;k掃除

小球進洞

乙個和網上題解不同,個人認為比較巧妙的理解方式:

把洞看為(,把小球看為),則問題轉化成:

設乙個小球的位置為\(a_i\),它匹配的位置為\(b_i\),則詢問

緋色ioi(懸念)

題目的\(min(j-a_i,a_i-j)\)中,\(j-a_i\)和\(a_i-j\)互為相反數。設為\(b_i\)和\(n-b_i\)

題目要求匹配的限制:

\(j-a_i=b_i\)就是\(j=a_i+b_i\)

\(a_i-j=b_i\)就是\(j=a_i-b_i\)

\(j-a_i=-b_i\)就是\(j=a_i-b_i\)

\(a_i-j=-b_i\)就是\(j=a_i+b_i\)

綜上,\(j\)最多只有\(2\)種取值。

把這兩種取值在右邊連一條邊,則每個二分圖左邊點最多會產生1條邊的貢獻。

根據hall定理,二分圖左邊每個集合\(s\)覆蓋右邊的集合\(r(s)\),\(card(r(s))>=card(s)\)。所以右邊的每個連通塊都是樹或者基環樹。

每個左邊的點最多和乙個右邊點進行匹配。假設乙個左邊的點連線右邊的第一種權值的點\(a\)獲得權值\(v1\),連線\(b\)獲得\(v2\)。

則再把\(a\to b\)連線邊權為\(v1\)的邊,\(b\to a\)連線邊權為\(v2\)的邊。

這兩條邊能選且只能選一條。選了以後獲得權值的收益。

且在新圖中,每個點的入度最多為1。

題目要求收益最大。

考慮對樹/基環樹分類討論。

一棵樹

線段樹練習四(線段樹)

description 在平面內有一條長度為n的線段 不計入答案 可以對進行以下2種操作 1 把從x到y的再加一條線段 2 查詢從x到x 1有多少條線段 input 第一行輸入n,m 第2 m 1行,每行2個數x,y,表示從x到y再加一條線段 最後一行輸入2個數,為x和x 1,查詢x到x 1的線段數...

1080 線段樹練習

一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數m 10000條。輸入描述 inpu...

線段樹練習4

線段樹練習4 codevs題號 4919 時間限制 1 s 空間限制 128000 kb 題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 內的所有數都增加x 2 詢問區間 a,b 能被7整除的個數 輸入描述 input description 第一行乙個正整數n,接下來...