1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          [NOI2011]Noi嘉年華

          來源:互聯網轉載 時間:2024-01-29 08:06:29

          題意

          題目鏈接

          給n個區間\((n\leq 200)\),選擇其中一些并分成兩部分,要求兩部分的區間分別并起來之后兩者沒有交集,求此時含區間數量少的一部分數量最大為多少。另外,對于每個區間,求出它必須選時的答案

          思路

          神奇的DP(為什么我有網絡流的思路的題都是DP啊qwq)

          先離散化自不必說,設離散化后最遠覆蓋到了len位置

          \(cnt[i][j]\):完整的處于\([i,j]\)里的區間個數

          \(pre[i][j]\):在區間[1,i]中,A選擇了j個區間時,B最多可以選擇的區間個數

          \(las[i][j]\):在區間[i,len]中,A選擇了j個區間時,B最多可以選擇的區間個數

          對于完整的一塊,我們可以將它扔在A或者B,這就成了我們的決策,于是得到了轉移方程:

          pre[i][j]=max(pre[k][j]+cnt[k][j],pre[k][j-cnt[k][j]])//分別代表將[k,j]這一塊扔到B或者A(las同理)

          于是ans1=max(min(i,pre[len][i]))//前者是A中的區間數,后者是此時的B中的區間數,兩者需要取min

          接下來處理強行選擇c號區間的情況

          對于每一個c,枚舉一個塊[i,j],這個塊必須選,且這個塊包含了c號區間,假設它在A中?,F在還需要知道[1,i]和[j,len]這兩部分怎么選擇,假設在這兩部分中A分別選擇了x,y個區間,于是得到\(n^5\)的方法:

          \(ans=max(min(x+y+cnt[i][j],pre[i][x]+las[j][y]))\)//前為A,后為B

          一個顯然的優化就是,我們這樣做一次就可以把所有的情況處理出來(上面的四重循環與c無關),我們設ans[i][j]表示強制選擇[i,j]時的答案,復雜度降至\(n^4\)

          另外,當x增大時,如果y也隨之增大,此時pre[i][x]+las[j][y]顯然只會變小,此時無法更新答案,所以y只能減小,即y隨著x增大而減小。我們在無法更新答案的時候將y減1即可

          Code

          #include<bits/stdc++.h>#define N 405 #define re register#define Max(x,y) ((x)>(y) ? (x):(y))using namespace std;int n,ccf,l[N],r[N],cnt[N][N];int pre[N][N],las[N][N];//cnt[i][j]表示完全包含在[i,j]的區間個數 //pre[i][j]表示在時間[1,i],A場選擇j個區間時B場選擇最多的區間個數 int ans[N][N];//[i,j]區間必選時的答案 int b[N<<1],len;template <class T>void read(T &x){    char c;int sign=1;    while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;    while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;}int main(){    read(n);    for(re int i=1;i<=n;++i)    {        int t;        read(l[i]);read(t);        r[i]=l[i]+t;        b[++len]=l[i];        b[++len]=r[i];    }    sort(b+1,b+len+1);    len=unique(b+1,b+len+1)-b-1;    for(re int i=1;i<=n;++i)    {        l[i]=lower_bound(b+1,b+len+1,l[i])-b;        r[i]=lower_bound(b+1,b+len+1,r[i])-b;    }    for(re int i=1;i<=len;++i)        for(re int j=i;j<=len;++j)            for(re int k=1;k<=n;++k)                if(i<=l[k]&&r[k]<=j) cnt[i][j]++;    memset(pre,-50,sizeof(pre));    memset(las,-50,sizeof(las));    for(re int i=1;i<=len;++i)    {        pre[i][0]=cnt[1][i];        for(re int j=1;j<=cnt[1][i];++j)            for(re int k=1;k<=i;++k)            {                pre[i][j]=Max(pre[i][j],pre[k][j]+cnt[k][i]);//[k,i]分給B                 if(j>=cnt[k][i]) pre[i][j]=Max(pre[i][j],pre[k][j-cnt[k][i]]);//[k,i]分給A             }    }    for(re int i=len;i>=1;--i)    {        las[i][0]=cnt[i][len];        for(re int j=1;j<=cnt[i][len];++j)            for(re int k=i;k<=len;++k)            {                las[i][j]=Max(las[i][j],las[k][j]+cnt[i][k]);                if(j>=cnt[i][k]) las[i][j]=Max(las[i][j],las[k][j-cnt[i][k]]);            }    }    ccf=0;    for(re int i=0;i<=n;++i) ccf=Max(ccf,min(pre[len][i],i));    printf("%d\n",ccf);    for(re int i=1;i<=len;++i)    {        for(re int j=1;j<=len;++j)        {            ans[i][j]=-10000;            int y=cnt[j][len];            for(re int x=0;x<=cnt[1][i];++x)//A在[1,i]區間選擇了x個             {                int p,q;                for(;y>=0;--y)                {                    p=min(x+y+cnt[i][j],pre[i][x]+las[j][y]);                    if(!y) break;                    q=min(x+y-1+cnt[i][j],pre[i][x]+las[j][y-1]);                    if(q<p) break;                }                ans[i][j]=Max(ans[i][j],p);            }        }    }    for(re int i=1;i<=n;++i)    {        ccf=0;        for(re int j=1;j<=l[i];++j)            for(re int k=r[i];k<=len;++k)                ccf=Max(ccf,ans[j][k]);        printf("%d\n",ccf);    }    return 0;}
          標簽:noi2011-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          怎么解壓tar文件?有三種解壓方法,如下所示:1。最簡單的壓縮命令:winraraasdf.txt.rar文件asdf.txta公司第一個參數是壓縮文件名,后綴是tar,最后一個參數是要壓縮的文件名。2. 最簡單的解壓命令:WinRAR easdf.txt.txt文件意思是減壓。解壓后的文件是后面唯一的參數。但是這個e解壓是將解壓后的文件釋放到當前目錄asdf.txt.rar文件文件并置,因此,更...

          mask是什么牌子的面膜?泰國ele品牌下的美好夜晚。睡眠面膜,面膜品牌,全稱為51Mask,是知名的新概念全效面膜品牌。該面膜品牌采用全球最先進的物理納米原理和電磁真空技術,提出“一片面膜即可全面呵護肌膚”的護膚理念。51Mask翻譯成中文就是“我要一個面膜”,深刻詮釋了對美的熱愛,表達了每個人都應該有對美麗肌膚的追求。mask固體清潔面膜可靠嗎?面膜真的可以去黑頭。持久保濕,滲透力強。使用后可...

          太多HTTP重定向,怎么解決?退出app store,從Apple mobile phone中打開[settings],然后下拉界面找到[iTunes store and app store]選項,點擊open,然后點擊[app store]的personal account選項。然后,在彈出窗口中,單擊[注銷]按鈕。注銷后,長按手機電源按鈕,即可關閉手機并重新啟動。然后輸入設置并再次登錄Appl...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>