BJOI2017 噴式水戰改

2021-08-18 09:41:44 字數 1553 閱讀 2302

= = 雖然這題並不太難調 可我還是調了一年呀。。

乙個區間dp+平衡樹維護。因為空間不太夠,所以點合併起來(就像noip2017列隊一樣)。

然後用的時候拆開,最多2e5個點。

考慮狀態f[

l][r

][i]

[j] f[l

][r]

[i][

j]

為l-r區間內用了從i到j的方案的最大價值。轉移顯然。。然後就在平衡樹上調就好了= =然後你要注意update時不要寫反,拆點時盡量不要遞迴。。別寫錯點的標號等等等等錯誤。。。

#include

using namespace std;

#define ll long long

#define mp make_pair

typedef pairpar;

const ll maxn=5e5+5;

struct data

}return ans;

}};data operator + (data a,data b)

struct treap

inline ll newnode(ll a,ll b,ll c,ll num)

}return cnt;

}ll merge(ll x,ll y)

if(!y)

if(prio[x]y])

lson[y]=merge(x,lson[y]);pushup(y);return

y; }

par split(ll p,ll x)

else

if(x>=size[l]+si[p])

//par tem=split(l,size[l]);

//par tem2=split(r,size[p]-size[l]-si[p]);

//ll p1=newnode(ai[p],bi[p],ci[p],x-size[l]);

// ll p2=newnode(ai[p],bi[p],ci[p],si[p]-x+size[l]);

ll pre=si[p];si[p]=x-size[l];

d[p].f[0][0]=d[p].f[3][3]=ai[p]*si[p];

d[p].f[1][1]=bi[p]*si[p];d[p].f[2][2]=ci[p]*si[p];

for(ll i=0;i<=3;i++)

}ll p1=newnode(ai[p],bi[p],ci[p],pre-si[p]);p1=merge(p1,r);rson[p]=0;

pushup(p);pushup(p1);

//cout

<":"

}void insert(ll p,ll a,ll b,ll c,ll x)

void debug(ll p)

}t;int main()

return0;}

/*5025

374621

3214163

399778842

4368575

1472

3618

6*/

BJOI2017 魔法咒語

矩陣乘法 ac 自動機 是道很不錯的題了 首先是前六十分,就是乙個 ac 自動機上的套路 dp 設 dp i j 表示匹配出的長度為 i 在自動機上位置為 j 的方案數,轉移的話就列舉下乙個單詞選擇哪個放到自動機上一波匹配就好了 後面 40 分強行變成了另外一道題,l 變成了 1e8 一看就是矩乘的...

BJOI2017 機動訓練

落谷 loj。定義機動路徑為 相同地形序列指路徑上順序經過的地形序列。定義機動路徑的權值為相同地形序列的數量之和。求所有機動路徑的權值之和。同一類機動路徑,他的貢獻就是數量的平方 leftrightarrow 答案即本質不同機動路徑數量的平方和 leftrightarrow 即兩個人走的機動路徑形式...

BJOI2017 魔法咒語

題目鏈結 給 n 個基本詞彙,m 個禁忌詞語。求用基本詞彙 每個詞彙可重複詞彙 拼成長度為 l 的 不包含任何禁忌詞語的字串的方案數。在 資料規模與約定 中,我們發現可以把資料劃分成兩檔 l le 100 的 前 60pts 基本長度不超過 2 的 顯然不包含這個東西判定可以用 ac 自動機,用 m...