一鍵挖礦
#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,接下來...