日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P7078-[CSP-S2020]贪吃蛇【贪心,队列】

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P7078-[CSP-S2020]贪吃蛇【贪心,队列】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P7078


題目大意

nnn條貪吃蛇,第iii條長度為aia_iai?,每次最長的那條蛇可以選擇吃掉最短的那條蛇,然后自己的長度減去其長度,也可以不吃然后結束游戲。

現在詢問在所有蛇都希望吃的蛇最多且自己不會被吃的情況下最后會留下多少條蛇。

TTT次每次修改kkk個值,保證修改前后aaa單調不降。

3≤n≤106,1≤T≤10,0≤k≤1053\leq n\leq 10^6,1\leq T\leq 10,0\leq k\leq 10^53n106,1T10,0k105


解題思路

考慮一條蛇什么時候會選擇不吃。

首先如果一條蛇吃掉別的蛇之后它不是最小的蛇,那么它一定會去吃這條蛇。假設最大的和次大的蛇長度為a,ba,ba,b,最小和次小的為c,dc,dc,d,由于a?c>da-c>da?c>d又有b?d<a?cb-d<a-cb?d<a?c那么顯然如果bbb蛇吃了肯定會比aaa蛇先死,那么如果bbb會死那么它肯定不吃ddd那么aaa蛇顯然也不會被吃。

如果一條蛇吃了別的蛇后它是最小的蛇會發生什么。記蛇從大到小排序為a,b,c,...a,b,c,...a,b,c,...,那么如果蛇aaa吃了最小的后它成最小的了且bbb會吃,那么aaa肯定不吃。此時我們就需要判斷bbb是否吃了,同理的,如果bbb吃了最小的之后它也是最小的那么就需要考慮ccc吃不吃最小的。

此時遞歸下去直到一條吃了之后不是最小的或者只剩兩條蛇時就結束了。

然后用類似于合并果子那樣的方法用兩個隊列維護即可。

時間復雜度:O(Tn)O(Tn)O(Tn)


code

#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> using namespace std; const int N=1e6+10; int T,n,a[N],w[N],q1[N],q2[N]; int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; } bool cmp(int x,int y) {return (w[x]==w[y])?x<y:w[x]<w[y];} void solve(){int h1=1,t1=n,h2=1,t2=0,v,p;T--;for(int i=1;i<=n;i++)w[q1[n-i+1]=i]=a[i];while(1){if(t1-h1+1+t2-h2+1==2){printf("%d\n",1);return;}if(t2-h2+1<=0||t1-h1+1>0&&cmp(q2[h2],q1[h1])){v=w[p=q1[h1]];p=q1[h1];h1++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}else{v=w[p=q2[h2]];h2++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}w[p]=v;if((t2-h2+1<=0||cmp(p,q2[t2]))&&(t1-h1+1<=0||cmp(p,q1[t1]))){q2[++t2]=p;break;}q2[++t2]=p;}int cnt=0,f=t2-h2+1+t1-h1+1;while(1){cnt++;if(t1-h1+1+t2-h2+1==2){printf("%d\n",f+(cnt&1));return;}if(t2-h2+1<=0||t1-h1+1>0&&cmp(q2[h2],q1[h1])){v=w[p=q1[h1]];p=q1[h1];h1++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}else{v=w[p=q2[h2]];h2++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}w[p]=v;if((t2-h2+1<=0||cmp(p,q2[t2]))&&(t1-h1+1<=0||cmp(p,q1[t1]))){q2[++t2]=p;continue;}printf("%d\n",f+(cnt&1));return;}return; } int main() {T=read();n=read();for(int i=1;i<=n;i++)a[i]=read();solve();while(T){int k=read();while(k--){int x=read(),w=read();a[x]=w;}solve();}return 0; }

總結

以上是生活随笔為你收集整理的P7078-[CSP-S2020]贪吃蛇【贪心,队列】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。