2020計蒜之道初賽一 染色 (dp 線段樹)

2021-10-09 10:21:46 字數 1777 閱讀 7921

題意:對乙個長度為n的條染色,只能黑或者白,對第i塊染色染成黑或白分別加分arr[i]和brr[i],給出m條線段,對這些線段同時染成某種顏色有額外的加分,求最大的加分數。

解析:比賽時用著明顯錯誤的假演算法衝過了中等難度,感覺題目的資料有點過水,不能保證**完全正確 (⊙﹏⊙)

現在想來中等難度的o(n+m^2)的正確演算法應該是:把黑白區間分別按照右邊界從小到大排列,之後在dp的過程中到達右邊界時進行dp,狀態轉移方程就是dp[i]=max(dp[i],dp[j-1]+pre[i]-pre[j-1]+sum),其中j是每乙個(需要o(m)次)之前跑過的線段的左邊界,sum是跑過的左邊界大於等於j的線段加分和,右邊那項代表的意思是把j到i全塗成某個顏色的最右解。

而當m到達3e5時,還是對黑白區間分別進行處理,但每次還是乙個個線段來求就會超時,所以應該把取每一線段對結果的加分用線段樹來表示體現,這裡使用的線段樹意義不好理解,是乙個隨著i的變化而不斷更新的線段樹,線段樹第k個節點的值代表把k到i之間全部塗成顏色id時,從1到i的加分最大值,id只有0和1兩種狀態,代表全染成黑色和全染成白色兩棵線段樹。

一直覺得dp題看狀態轉移方程和題解解析很難看懂,還是直接看**比較好理解轉換邏輯。。。。

**:

#include #define x first

#define y second

#define mid (l+r>>1)

#define lo (o<<1)

#define ro (o<<1|1)

using namespace std;

typedef long long ll;

typedef vectorvi;

typedef pairpii;

struct tri;

const int inf=0x3f3f3f3f;

const ll linf=0x3f3f3f3f3f3f3f3f;

const int maxn=3e5+10;

const ll mod=1e9+7;

const double pi=acos(0)*2;

bool cmp(tri a,tri b)

build(lo,l,mid);

build(ro,mid+1,r);

}void pushdown(int id,int o,int l,int )

void add(int id,int ql,int qr,ll v,int o=1,int l=1,int r=n)

pushdown(id,o,l,r);

if(ql<=mid)add(id,ql,qr,v,lo,l,mid);

if(qr>mid)add(id,ql,qr,v,ro,mid+1,r);

ma[id][o]=max(ma[id][lo],ma[id][ro]);

}int main()

); else sb.push_back();

}sa.push_back();

sb.push_back();//方便邊界處理

sort(sa.begin(),sa.end(),cmp);

sort(sb.begin(),sb.end(),cmp);

auto a=sa.begin(),b=sb.begin();

ll ans=0;

for(int i=1;i<=n;i++)

while(b->y==i)

ans=max(ma[0][1],ma[1][1]);//ans代表到i的最右解,相當與dp[i]

}cout

}

2016計蒜之道初賽

官方題解 另外搜尋題解的時候看到乙個很有意思的部落格.大一進省賽的妹子otz 畫出以頂點 o 為公共頂點的 夾角為 的兩條線段l1和l2,其中l1作為圓 c1的直徑,l2作為圓 c2的直徑。兩個圓需要畫在同乙個圓形的塑料板上。請算出這個塑料板最小的面積是多少。字串處理 很坑的是oj 測試 只是測試能...

2017 計蒜之道 初賽 第五場

ucloud 機房的網路搭建 ucloud 剛剛建立乙個新機房,近日正在進行網路搭建。機房內有 n n 臺伺服器和 m m 個分線器,整個機房只有乙個網線出口。分線器的作用是將一根網線轉換成多根網線。蒜頭君也知道每個分線器輸出的最大網線根數 不一定要將分線器輸出的每根線都用上 問你至少需要使用多少個...

2017 計蒜之道 初賽 第五場

a.ucloud 機房的網路搭建 ucloud 剛剛建立乙個新機房,近日正在進行網路搭建。機房內有 nn 臺伺服器和 mm 個分線器,整個機房只有乙個網線出口。分線器的作用是將一根網線轉換成多根網線。蒜頭君也知道每個分線器輸出的最大網線根數 不一定要將分線器輸出的每根線都用上 問你至少需要使用多少個...