麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

[BZOJ1584][Usaco2009 Mar]Cleaning Up 打掃衛生(dp+數學相關優化)

2019-11-14 12:39:09
字體:
來源:轉載
供稿:網友

題目描述

傳送門

題解

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

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

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

pos(j)單調移動,總時間復雜度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]);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: asian裸体佳人pics | 久久亚洲精品久久国产一区二区 | 黄片毛片一级 | 国产成人精品日本亚洲语音 | 在线观看一区二区三区四区 | 午夜视频在线 | 黄色7777| 日日草夜夜草 | 二区三区四区视频 | 日本aⅴ在线 | 91精品免费观看 | a级黄色片视频 | 日韩毛片在线看 | 欧美一级高清片在线 | 伦一区二区三区中文字幕v亚洲 | 欧美成人理论片乱 | 深夜小视频在线观看 | 在线成人免费视频 | 一区二区三区黄色 | 日本高清黄色片 | 国产一区二区免费在线观看 | xx53xx| av在线一区二区三区四区 | 国产精品国产三级国产在线观看 | 亚洲精品一区二区三区在线看 | 中文欧美日韩 | 国产正在播放 | 91精品国产综合久久婷婷香蕉 | 欧美成人黄色小视频 | 99精品视频在线看 | www.com香蕉 | 全黄裸片武则天艳史 | 大胆在线日本aⅴ免费视频 美国黄色毛片女人性生活片 | 日日草夜夜草 | 国产日韩免费观看 | 成人在线视频在线观看 | 国产精品久久av | 国产亚洲在线 | 久久丝袜脚交足黄网站免费 | 久久精品一区二区三 | 国产精品久久久av |