鹹魚選手發現本身好久不作cf了,晚節不保。c++
A.Curriculum Vitaedom
枚舉一下間斷點的位置。spa
#include<bits/stdc++.h> using namespace std; const int N=110; int cnt,n,a[N],mx,cur; inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read(); for(int i=1;i<=n;i++)a[i]=read(); int flag=0; for(int i=1;i<=n;i++){ cur=0;for(int j=1;j<=i;j++)if(a[j]==0)cur++; for(int j=i;j<=n;j++)if(a[j]==1)cur++; mx=max(mx,cur); } printf("%d\n",mx); }
B. Math Showcode
枚舉完成了哪些套裝,而後剩下的貪心算就好。blog
#include<bits/stdc++.h> const int N=50; typedef long long ll; using namespace std; int n,m; ll a[N],cur,tot,ans,qwq,k; int vis[N]; inline ll read(){ ll f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read();k=read();m=read(); for(int i=1;i<=k;i++)a[i]=read(),tot+=a[i]; sort(a+1,a+k+1); if(m>=tot*n){ ans=1LL*n*(k+1);cout<<ans<<endl;return 0; } for(int i=0;i<=n;i++){ ll res=m-1LL*i*tot; if(res<0)continue; ll cur=0;cur+=1LL*i*(k+1);ll qwq=n-i; if(res==0){ans=max(ans,cur);continue;} for(int j=1;j<=k;j++){ if(qwq*a[j]<=res){res-=qwq*a[j];cur+=qwq;if(res<=0)break;continue;} if(res<=0)break; ll q=res/a[j];cur+=q;break; } ans=max(ans,cur); } cout<<ans<<endl; }
老年選手晚節不保,一開始還覺得儘可能多作整套。排序
我是傻逼。get
C. Four Segmentsit
化簡一下式子,而後就能夠枚舉了。io
#include<bits/stdc++.h> typedef long long ll; const int N=1000010; using namespace std; ll s[N],n,ans,x,y,z; inline ll read(){ ll f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read(); for(int i=1;i<=n;i++)s[i]=s[i-1]+read(); for(int i=0;i<=n;i++){ ll cur=s[i],now=i; for(int j=i;j<=n;j++){ if(s[j]<cur)cur=s[j],now=j; if(s[i]-s[now]+s[j]>ans)ans=s[i]-s[now]+s[j],x=i,y=now,z=j; } } printf("%I64d %I64d %I64d\n",x,y,z); }
D. Monitorclass
維護一個二維的前綴和。而後作k次拓展,這樣每一個點管的就是一個向上k的矩形。
剩下的就是橫向的區間max,500的範圍老年選手選擇失去夢想的n^3暴力。
#include<bits/stdc++.h> const int N=610; using namespace std; int n,m,k,q,inf; int a[N][N]; struct Point{int x,y,t;}p[10000010]; inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } inline int querymax(int o,int l,int r){ int ans=0; for(int i=l;i<=r;i++)ans=max(a[o][i],ans); return ans; } int ans=0; int main(){ n=read();m=read();k=read();q=read(); memset(a,127,sizeof(a));inf=a[1][1];ans=inf; for(int i=1;i<=q;i++){ p[i].x=read();p[i].y=read();p[i].t=read(); a[p[i].x][p[i].y]=p[i].t; } for(int qwq=1;qwq<k;qwq++) for(int i=1;i<n;i++)for(int j=1;j<=m;j++)a[i][j]=max(a[i][j],a[i+1][j]); for(int i=1;i+k-1<=n;i++)for(int j=1;j+k-1<=m;j++) ans=min(ans,querymax(i,j,j+k-1)); if(ans==inf)puts("-1");else printf("%d\n",ans); }
E. Chemistry in Berland
關係會造成一棵樹,這很顯然。
而後就是考慮節點之間的關係,這個關係其實就是樹的拓撲序,一邊對樹拓撲排序一邊dp一下,從下面開始先試圖用父親節點知足子節點
多餘的上傳到父親節點便可。
#include<bits/stdc++.h> const int N=100005; typedef long long ll; const ll inf=(1LL<<60)-1; using namespace std; ll a[N],b[N],dp[N]; int n,m,tot,head[N]; struct Edge{int u,v,next;ll w;}G[N<<1]; inline void addedge(int u,int v,ll w){ G[++tot].u=u;G[tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot; G[++tot].u=v;G[tot].v=u;G[tot].w=w;G[tot].next=head[v];head[v]=tot; } inline void dfs(int u,int f){ dp[u]=b[u]-a[u]; for(int i=head[u];i;i=G[i].next){ int v=G[i].v;ll w=G[i].w; if(v==f)continue; dfs(v,u); if(dp[v]<0){ if(-dp[v]<inf/w)dp[u]+=dp[v]*w; else dp[u]=-inf; if(dp[u]<-inf)dp[u]=-inf; } else dp[u]+=dp[v]; } } inline ll read(){ ll f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read(); for(int i=1;i<=n;i++)b[i]=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=2;i<=n;i++){ int x=read();ll k=read(); addedge(i,x,k); } dfs(1,0); puts(dp[1]>=0?"YES":"NO"); }
F. Random Query
這種題棟老師怕不是隨便秒。
考慮一個數對區間的貢獻,重複的數記錄最後一次出現的位置,最後除全部可能便可。
#include<bits/stdc++.h> const int N=1000010; typedef long long ll; using namespace std; int n,m,a[N],b[N]; ll ans=0; inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read(); for(int i=1;i<=n;i++)a[i]=read(); ll ans=0,t=0; for(int i=1;i<=n;i++){ t+=i-b[a[i]];ans+=t;b[a[i]]=i; } printf("%.6lf\n",(ans*2-n)/(double)(1LL*n*n)); }
總結:
1.注意想清楚特判,在提交以前想清楚全部可能狀況以及特殊、極端的狀況,不要想固然,防止晚節不保
2.看清楚數據範圍,作屢次確認。