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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021 年百度之星·程序设计大赛 - 初赛一、二

發(fā)布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021 年百度之星·程序设计大赛 - 初赛一、二 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

感覺難度比去年大,也可能是我變菜了

第一場

1001迷失

傳送門

1003 鴿子

傳送門

1004 萌新

void solve(){ll a=read,b=read;if(b>a) swap(a,b);ll tmp=a-b;ll res_max=a-b,res_min=0;if(!tmp) res_max=a,res_min=2;rep(i,2,tmp/i){if(tmp%i==0){res_min=i;break;}}if(!res_min) res_min=tmp;if(res_min<=1||res_max<=1){printf("-1 -1\n");return ;}printf("%lld %lld\n",res_min,res_max); }int main(){int _=read;while(_--) solve();return 0; }

1006 毒瘤數(shù)據(jù)結(jié)構(gòu)題

  • 思路:
    首先對于查詢操作,是滿足單調(diào)性的,我們可以二分答案,那么怎么checkcheckcheck呢,如果對于當(dāng)前的midmidmid[1,mid?1][1,mid-1][1,mid?1]的和為mid?1mid-1mid?1,說明該點(diǎn)符合題意,還可以更大,lll指針右移。
    對于修改操作,相當(dāng)于單點(diǎn)修改。
    大體思路就是對答案進(jìn)行二分,借用某數(shù)據(jù)結(jié)構(gòu)維護(hù)單點(diǎn)修改和區(qū)間求和。
    容易想到的是線段樹跟樹狀數(shù)組,賽時是用樹狀數(shù)組寫的,復(fù)雜度O(nlog2n)O(nlog^{2}n)O(nlog2n)
    交了后宇巨說第二個查詢的答案一定是單調(diào)遞增的,所以應(yīng)該有O(n)O(n)O(n)的寫法。

    然后hduojhduojhduoj評測機(jī)的問題導(dǎo)致O(n)O(n)O(n)的寫法都會TLETLETLE,知道思想就好了。
  • 代碼:
const int maxn=5e6+7,maxm=210000;ll n,a[maxn],tr[maxn];ll lowbit(ll x){return x&-x; }void update(ll pos,ll val){while(pos<=n){tr[pos]+=val;pos+=lowbit(pos);} }ll query(ll pos){ll res=0;while(pos){res+=tr[pos];pos-=lowbit(pos);}return res; }bool check(int x){int t=query(x-1);if(t!=x-1) return 0;return 1; }int main(){n=read; rep(i,1,n){int op=read,x=read;if(op==1&&a[x]!=1) a[x]=1,update(x,1);else if(op==2){//rep(j,1,n){// cout<<a[j]<<" ";//}//puts("");if(a[x]!=1) update(x,1);int l=1,r=n,res;while(l<=r){int mid=(l+r)/2;if(check(mid)){res=mid;l=mid+1;}else r=mid-1;}//cout<<i<<"******";printf("%d\n",res);if(a[x]!=1) update(x,-1);}} return 0; }

1008 獵人殺

  • 思路:
    模擬;要注意的點(diǎn)為:
    1.1.1.狼人可以殺死自己,獵人不可以殺死自己
    2.2.2.注意每次殺人的時候都是選擇最靠前并且未死亡的,所以每次要從111開始遍歷
  • 代碼:
int a[55],now[55],st[55]; int w[55][55]; int main(){int _=read;while(_--){int n=read,pos;rep(i,1,n){a[i]=read;if(a[i]) pos=i;now[i]=1;st[i]=0;}rep(i,1,n){rep(j,1,n){w[i][j]=read;}}int cnt=n;int id=pos,flag=0;while(1){now[id]=1;while(now[id]<=n&&st[w[id][now[id]]]) now[id]++;st[w[id][now[id]]]=1;// dieint t=w[id][now[id]];//cout<<now[id]<<"*****"<<t<<endl;if(t==pos){flag=1;break;}else{id=t;cnt--;}if(cnt<=2){flag=0;break;}}if(flag) puts("lieren");else puts("langren");}return 0; }

第二場

1001 簽到

  • 思路
    找規(guī)律,寫出前777項(xiàng)就好了
項(xiàng)數(shù)ab
0ab
1a+ba-b
22a2b
32a+2b2a-2b
44a4b
54a+4b4a-4b
68a8b
78a+8b8a-8b

分奇偶討論一下就好了,注意取模。

  • 代碼:
const ll mod=998244353 ; int main(){int _=read;while(_--){ll a=read,b=read,k=read;if(k%2==0){int t=k/2;ll tmp=ksm(2,t,mod);printf("%lld %lld\n",tmp*a%mod,tmp*b%mod);}else{int t=(k-1)/2;ll tmp=ksm(2,t,mod);ll x=(a-b+mod)%mod;printf("%lld %lld\n",tmp*(a+b)%mod,tmp*x%mod);}} return 0; }

1002 隨機(jī)題意

  • 思路:
    對于每個b[i]b[i]b[i]的范圍為[ai?k,ai+k][a_{i}-k,a_{i}+k][ai??k,ai?+k]
    排序后從頭開始掃,貪心的選擇。
    每次都盡量選擇每個區(qū)間最左邊的。
  • 代碼:
int n,a[maxn],k; struct node{int l,r; }b[maxn]; bool cmp(node a,node b){if(a.l==b.l) return a.r<b.r;return a.l<b.l; } int main(){int _=read;while(_--){n=read,k=read;rep(i,1,n){a[i]=read;b[i].l=a[i]-k,b[i].r=a[i]+k;}sort(b+1,b+1+n,cmp);int res=1,now=b[1].l+1;rep(i,2,n){if(now<=b[i].r){now=max(now+1,b[i].l+1);res++;}}printf("%d\n",res);}return 0; }

1003 魔怔

傳送門

1004 凈化

  • 思路:
    首先,盡量找到分界點(diǎn),在分界點(diǎn)之后,所有的負(fù)數(shù)都不會使得遍歷完的答案減少,也就是說,分界點(diǎn)之后的每次的變化都是固定的,設(shè)為cntcntcnt
    其次,如果這時候已經(jīng)滿足x>=mx>=mx>=m,就輸出答案;不滿足的話,就計算出每次增加cntcntcnt,直至x>=mx>=mx>=m的次數(shù)。
    但是這樣會出現(xiàn)一個問題,有可能在某次遍歷的過程中,x>=mx>=mx>=m已經(jīng)滿足了,但是后面有負(fù)數(shù),就導(dǎo)致了這次遍歷完成后,x>=mx>=mx>=m又不滿足了,這樣就使得答案增大。
    解決方案是提前記錄前綴和的最大值,在計算每次增加cntcntcnt增加多少次能夠滿足x>=mx>=mx>=m的時候,提前將最大值減去。
  • 代碼:
const int maxn=1e5+7,maxm=210000; ll n,m,a[maxn]; int main(){int _=read;while(_--){n=read,m=read;ll sum=0,maxx=-inf;rep(i,1,n) a[i]=read,sum+=a[i],maxx=max(maxx,sum);ll x=0,res=0,lasx=0,cnt=0,lascnt=-1;while(1){rep(i,1,n){x=max(0ll,x+a[i]);if(x>=m) break;}res++;if(x>=m) break;cnt=x-lasx;if(lascnt==cnt) break;lascnt=cnt,lasx=x;}if(x>=m) printf("%lld\n",res);else{if(cnt==0){puts("-1");continue;}if(maxx==cnt){ll t=m-x;res+=t/cnt;if(t%cnt) res++;printf("%lld\n",res);}else{ll t=m-x-maxx;//cout<<t<<" "<<cnt<<" "<<res<<endl;res+=t/cnt+1;//cout<<t/cnt<<endl;if(t%cnt) res++;printf("%lld\n",res);}}} return 0; }

總結(jié)

以上是生活随笔為你收集整理的2021 年百度之星·程序设计大赛 - 初赛一、二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。