国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

[BZOJ1584][Usaco2009 Mar]Cleaning Up 打掃衛(wèi)生(dp+數(shù)學(xué)相關(guān)優(yōu)化)

2019-11-14 12:39:09
字體:
供稿:網(wǎng)友

題目描述

傳送門

題解

這題n2的暴力非常好想,預(yù)處理[l,r]有多少種食物sum(l,r),然后f(i)=min{f(j)+sum(j+1,i)2}(1<=j<i) 然后利用一點(diǎn)數(shù)學(xué)知識(shí)就有一個(gè)非常巧妙的優(yōu)化 這道題的答案是不會(huì)超過n的,所以要想最優(yōu)的話,枚舉的sum(l,r)不能超過n√

預(yù)處理PRe(i),nxt(i)表示與位置i食物相同的前一個(gè)/下一個(gè)的位置 pos(j)表示[pos(j)+1,i]一共有j種不同的食物 那么f(i)=min{f(pos(j))+j?j}(0<=j<=n√)

如何維護(hù)pos(j)呢? 記cnt(j)表示[pos(j),i]一共有多少種顏色 當(dāng)i從i-1轉(zhuǎn)移來時(shí)可以通過判斷位置i的食物的pre來計(jì)算cnt(j) 如果cnt(j)>j即不合法,那么pos(j)要向后移動(dòng),直到把某一種顏色在區(qū)間中完全刪除,這中間可以用nxt來判斷

pos(j)單調(diào)移動(dòng),總時(shí)間復(fù)雜度O(nn√)

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 50005int n,m;int food[N],head[N],pre[N],tail[N],nxt[N],pos[N],cnt[N],f[N];int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) scanf("%d",&food[i]); for (int i=1;i<=n;++i) pre[i]=-1,nxt[i]=n+1; for (int i=n;i>=1;--i) { if (head[food[i]]) pre[head[food[i]]]=i; head[food[i]]=i; } for (int i=1;i<=n;++i) { if (tail[food[i]]) nxt[tail[food[i]]]=i; tail[food[i]]=i; } memset(f,127,sizeof(f));f[0]=0; for (int i=1;i<=n;++i) { for (int j=1;j*j<=n;++j) if (pre[i]<=pos[j]) ++cnt[j]; for (int j=1;j*j<=n;++j) if (cnt[j]>j) { ++pos[j]; while (nxt[pos[j]]<=i) ++pos[j]; --cnt[j]; } for (int j=1;j*j<=n;++j) f[i]=min(f[i],f[pos[j]]+j*j); } printf("%d/n",f[n]);}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 夹江县| 四平市| 迁安市| 墨脱县| 靖宇县| 长兴县| 新沂市| 西盟| 视频| 永定县| 惠东县| 巨鹿县| 齐齐哈尔市| 县级市| 平果县| 措勤县| 安龙县| 项城市| 天门市| 万年县| 绩溪县| 临湘市| 苏尼特右旗| 樟树市| 海淀区| 蕲春县| 吴旗县| 甘南县| 金川县| 丁青县| 门头沟区| 金坛市| 鄯善县| 邵东县| 邳州市| 木里| 芜湖县| 玉溪市| 武夷山市| 古浪县| 文昌市|