= = 雖然這題並不太難調 可我還是調了一年呀。。
乙個區間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...