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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

Codeforces940(A-F)

發(fā)布時(shí)間:2023/12/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces940(A-F) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

A:給數(shù)組a,sort后求最長(zhǎng)區(qū)間[l,r]使區(qū)間內(nèi)max-min<=d,輸出n-最長(zhǎng)區(qū)間長(zhǎng)度。

題解:暴力。。。

#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> #define mp make_pair using namespace std; typedef long long LL; typedef pair<int,int> pa; const int N=1001; //struct E{int to,nxt;}e[N<<1]; int n,a[N]; int Write[20],WRI; void judge(){freopen(".in","r",stdin);freopen(".out","w",stdout);} int read(){int d=0,f=1; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') d=d*10+c-48,c=getchar(); return d*f;} void write(int x){if (!x){putchar('0'); return;}if (x<0) putchar('-'),x=-x;for (WRI=1;x;x/=10,WRI++) Write[WRI]=x%10;for (int i=WRI-1;i;i--) putchar((char)(Write[i]+48));} //void add(LL x,LL y){e[++cnt]=(E){y,head[x]}; head[x]=cnt;} //void Add(LL x,LL y){add(x,y); add(y,x);} int main() {//judge();n=read(); int d=read();for (int i=1;i<=n;i++) a[i]=read();int ans=1000000;sort(a+1,a+1+n);for (int i=1,j=1;i<=n;i++){while (j<n&&a[j+1]-a[i]<=d) j++;ans=min(ans,n-(j-i+1));}printf("%d",ans);return 0; } View Code

B:有一個(gè)數(shù)x=n,可以用A的金幣使x--,或在x%k==0時(shí)用B的金幣使x/=k,求將它變?yōu)?的最小代價(jià)。

題解:貪心,先使x%=k,然后比較用A和B那個(gè)優(yōu),注意一些細(xì)節(jié),沒(méi)開(kāi)long long爆了4發(fā),┭┮﹏┭┮

#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> #define mp make_pair using namespace std; typedef long long LL; typedef pair<int,int> pa; //struct E{int to,nxt;}e[N<<1]; LL n,A,B,k,x; int Write[20],WRI; void judge(){freopen(".in","r",stdin);freopen(".out","w",stdout);} LL read(){LL d=0,f=1; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') d=d*10+c-48,c=getchar(); return d*f;} void write(int x){if (!x){putchar('0'); return;}if (x<0) putchar('-'),x=-x;for (WRI=1;x;x/=10,WRI++) Write[WRI]=x%10;for (int i=WRI-1;i;i--) putchar((char)(Write[i]+48));} //void add(LL x,LL y){e[++cnt]=(E){y,head[x]}; head[x]=cnt;} //void Add(LL x,LL y){add(x,y); add(y,x);} int main() {//judge();n=read(); k=read(); A=read(); B=read();if (k==1){printf("%lld",(n-1)*A);return 0;}x=n;LL ans=0;while (x!=1){if (x<k) {ans+=(x-1)*A; break;}ans+=x%k*A;x-=x%k;if ((x-x/k)*A>B) ans+=B; else ans+=(x-x/k)*A;x/=k;}printf("%lld",ans);return 0; } View Code

C:給一個(gè)字符串s,求字典序最小的字符串a(chǎn),使a的長(zhǎng)度為k,且a的字典序大于s,且a的字符集是s的子集

題解:k>n時(shí),在原串后加上k-n個(gè)s中最小字母即可,k<=n時(shí),用類似進(jìn)制加1的方法,使最后一位變?yōu)楸人蟮淖钚∽址?#xff0c;如果它已經(jīng)是最大的,就“進(jìn)位”上去。

#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> #define mp make_pair using namespace std; typedef long long LL; typedef pair<int,int> pa; const int N=100010; //struct E{int to,nxt;}e[N<<1]; int n,k,t,b[26]; char s[N],f[26]; int Write[20],WRI; void judge(){freopen(".in","r",stdin);freopen(".out","w",stdout);} int read(){int d=0,f=1; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') d=d*10+c-48,c=getchar(); return d*f;} void write(int x){if (!x){putchar('0'); return;}if (x<0) putchar('-'),x=-x;for (WRI=1;x;x/=10,WRI++) Write[WRI]=x%10;for (int i=WRI-1;i;i--) putchar((char)(Write[i]+48));} //void add(LL x,LL y){e[++cnt]=(E){y,head[x]}; head[x]=cnt;} //void Add(LL x,LL y){add(x,y); add(y,x);} int main() {//judge();n=read(); k=read();scanf("%s",s+1);for (int i=1;i<=n;i++) b[s[i]-'a']=1;for (int i=0;i<26;i++)if (b[i])f[++t]=(char)(i+'a');if (n==k){int x=n;while (s[x]==f[t]) s[x]=f[1],x--;for (int i=1;i<=t;i++)if (f[i]==s[x]){s[x]=f[i+1];break;}for (int i=1;i<=n;i++) printf("%c",s[i]);}else if (n<k){for (int i=1;i<=n;i++) printf("%c",s[i]);for (int i=1;i<=k-n;i++) printf("%c",f[1]);}else{int x=k;while (s[x]==f[t]) s[x]=f[1],x--;for (int i=1;i<=t;i++)if (f[i]==s[x]){s[x]=f[i+1];break;}for (int i=1;i<=k;i++) printf("%c",s[i]);}return 0; } View Code

D:有兩個(gè)數(shù)組a,b,b的生成規(guī)則如下:

b1?=?b2?=?b3?=?b4?=?0.

For all?5?≤?i?≤?n:

  • bi?=?0?if?ai,?ai?-?1,?ai?-?2,?ai?-?3,?ai?-?4?>?r?and?bi?-?1?=?bi?-?2?=?bi?-?3?=?bi?-?4?=?1
  • bi?=?1?if?ai,?ai?-?1,?ai?-?2,?ai?-?3,?ai?-?4?<?l?and?bi?-?1?=?bi?-?2?=?bi?-?3?=?bi?-?4?=?0
  • bi?=?bi?-?1?otherwise

求一組滿足條件的l,r

題解:直接暴力求解即可。。。

#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> #define mp make_pair using namespace std; typedef long long LL; typedef pair<int,int> pa; const int N=100010; //struct E{int to,nxt;}e[N<<1]; int n,b[N],l,r; char a[N]; int Write[20],WRI; void judge(){freopen(".in","r",stdin);freopen(".out","w",stdout);} int read(){int d=0,f=1; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') d=d*10+c-48,c=getchar(); return d*f;} void write(int x){if (!x){putchar('0'); return;}if (x<0) putchar('-'),x=-x;for (WRI=1;x;x/=10,WRI++) Write[WRI]=x%10;for (int i=WRI-1;i;i--) putchar((char)(Write[i]+48));} //void add(LL x,LL y){e[++cnt]=(E){y,head[x]}; head[x]=cnt;} //void Add(LL x,LL y){add(x,y); add(y,x);} int main() {//judge();n=read();l=-1000000000; r=1000000000;for (int i=1;i<=n;i++) b[i]=read();scanf("%s",a+1);for (int i=5;i<=n;i++)if (a[i]!=a[i-1]&&a[i-1]==a[i-2]&&a[i-2]==a[i-3]&&a[i-3]==a[i-4])if (a[i]=='1'){for (int j=i-4;j<=i;j++)l=max(l,b[j]+1);}else{for (int j=i-4;j<=i;j++)r=min(r,b[j]-1);}printf("%d %d",l,r);return 0; } View Code

E:將數(shù)組a劃分成若干段,使每段的f值之和最小,其中f值是區(qū)間內(nèi)元素和減去前k/c(下取整)小的數(shù)。

題解:考慮去掉2個(gè)數(shù),也就是2c<=段長(zhǎng)<3c時(shí),將它拆成兩段肯定不會(huì)變劣,這應(yīng)該比較顯然吧,然后取c肯定不會(huì)劣于c+1,那么我們?cè)贒P時(shí)只要從i-c和i-1轉(zhuǎn)移過(guò)來(lái)即可,同時(shí)要維護(hù)[i-c+1,i]的最小值,我是用單調(diào)隊(duì)列的。

#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> #define mp make_pair using namespace std; typedef long long LL; typedef pair<int,int> pa; const int N=100010; //struct E{int to,nxt;}e[N<<1]; #define int LL int n,a[N],c,q[N],h,t; LL s[N],f[N]; int Write[20],WRI; void judge(){freopen(".in","r",stdin);freopen(".out","w",stdout);} int read(){int d=0,f=1; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') d=d*10+c-48,c=getchar(); return d*f;} void write(int x){if (!x){putchar('0'); return;}if (x<0) putchar('-'),x=-x;for (WRI=1;x;x/=10,WRI++) Write[WRI]=x%10;for (int i=WRI-1;i;i--) putchar((char)(Write[i]+48));} //void add(LL x,LL y){e[++cnt]=(E){y,head[x]}; head[x]=cnt;} //void Add(LL x,LL y){add(x,y); add(y,x);} signed main() {//judge();n=read(); c=read();for (int i=1;i<=n;i++) a[i]=read(),s[i]=s[i-1]+a[i];h=1;for (int i=1;i<=n;i++){f[i]=f[i-1]+a[i];while (h<=t&&q[h]<i-c+1) h++;while (h<=t&&a[q[t]]>a[i]) t--;q[++t]=i;//for (int j=h;j<=t;j++) printf("%d ",q[j]); puts("");if (i>=c) f[i]=min(f[i],f[i-c]+s[i]-s[i-c]-a[q[h]]);}printf("%lld",f[n]);return 0; } View Code

F:給數(shù)組a,有兩種操作,1 l r查詢[l,r]中每個(gè)數(shù)出現(xiàn)次數(shù)的mex,注意是出現(xiàn)次數(shù),mex是最小未出現(xiàn)的自然數(shù),2 x y將a[x]修改為y。

題解:帶修改莫隊(duì)可以解決此題。帶修改莫隊(duì)不會(huì)的同學(xué)可以先去做下BZOJ2120,然后mex+莫隊(duì)可以參考BZOJ3585。帶修改莫隊(duì)就是加入了第三關(guān)鍵字time,然后按(左端點(diǎn)所在塊,右端點(diǎn)所在塊,時(shí)間)排序,其中時(shí)間指的是在第幾次修改操作后。注意修改時(shí)要記下原來(lái)的數(shù),以便還原回去。維護(hù)mex可以對(duì)權(quán)值分塊,如果某塊中數(shù)的個(gè)數(shù)==R-L+1,那么這塊所有數(shù)都出現(xiàn)了,否則暴力掃,我有個(gè)同學(xué)直接暴力維護(hù)也過(guò)了。。。

#include<cstdio> #include<cmath> #include<map> #include<cstdlib> #include<algorithm> using namespace std; const int N=200010; struct node{int l,r,id,ans,tim;}q[N]; struct nodee{int x,y,z;}b[N]; int n,m,pos[N],L[N],R[N],a[N],qn,f[N],h[N],g[N],l,r,cnt,c[N]; int read(){int d=0,f=1; char c=getchar(); while (c<'0'||c>'9'){if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') d=d*10+c-48,c=getchar(); return d*f;} bool cmp1(node a,node b){return pos[a.l]<pos[b.l]||pos[a.l]==pos[b.l]&&pos[a.r]<pos[b.r]||pos[a.l]==pos[b.l]&&pos[a.r]==pos[b.r]&&a.tim<b.tim;} bool cmp2(node a,node b){return a.id<b.id;} void add(int x) {if (--f[h[a[x]]]==0) g[pos[h[a[x]]]]--;h[a[x]]++;if (++f[h[a[x]]]==1) g[pos[h[a[x]]]]++; } void del(int x) {if (--f[h[a[x]]]==0) g[pos[h[a[x]]]]--;h[a[x]]--;if (++f[h[a[x]]]==1) g[pos[h[a[x]]]]++; } void add_time(int k) {int x=b[k].x,y=b[k].y,z=b[k].z;if (x>=l&&x<=r) del(x);b[k].z=a[x];a[x]=y;if (x>=l&&x<=r) add(x); } void del_time(int k) {int x=b[k].x,y=b[k].y,z=b[k].z;if (x>=l&&x<=r) del(x);a[x]=z;if (x>=l&&x<=r) add(x); } int query() {int i=1;for (int i=1;i<=pos[n];i++)if (g[i]!=R[i]-L[i]+1) break;for (int j=L[i];j<=R[i];j++)if (!f[j]) return j; } int main() {n=read(); m=read();int blo=pow(n,2.0/3);for (int i=1;i<=n;i++){pos[i]=(i-1)/blo+1;if (!L[pos[i]]) L[pos[i]]=i;R[pos[i]]=i;}for (int i=1;i<=n;i++) a[i]=read(),c[++cnt]=a[i];int now=0;for (int i=1;i<=m;i++){int op=read(),l=read(),r=read();if (op==1) q[++qn]=(node){l,r,i,0,now};else b[++now]=(nodee){l,r,0},c[++cnt]=b[now].y;}sort(c+1,c+1+cnt);cnt=unique(c+1,c+cnt+1)-c-1;//for (int i=1;i<=cnt;i++) printf("%d ",c[i]); puts("");for (int i=1;i<=n;i++) a[i]=lower_bound(c+1,c+1+cnt,a[i])-c;for (int i=1;i<=now;i++) b[i].y=lower_bound(c+1,c+1+cnt,b[i].y)-c;//for (int i=1;i<=n;i++) printf("%d ",a[i]); puts("");sort(q+1,q+1+qn,cmp1);l=1; r=0; now=0;for (int i=1;i<=qn;i++){while (r<q[i].r) add(++r);while (r>q[i].r) del(r--);while (l>q[i].l) add(--l);while (l<q[i].l) del(l++);while (now<q[i].tim) add_time(++now);while (now>q[i].tim) del_time(now--);q[i].ans=query();}sort(q+1,q+1+qn,cmp2);for (int i=1;i<=qn;i++) printf("%d\n",q[i].ans);return 0; } View Code

轉(zhuǎn)載于:https://www.cnblogs.com/lujiaju6555/p/8468709.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Codeforces940(A-F)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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