ZR 集训 Day12 - 模拟赛

笔记

2026 暑假 C 班 Day2 之学废离去 二进制与一 IV 想不到吧,T1也能挂,还是没加 long long,简直唐飞了。 代码: C++ #include using namespace std; #define int long long const int N=45; int T,x,idx,ans; bool a[N]; signed main(){ cin>>T; while(T--){ cin>>x; ans=idx=0; while(x) a[++idx]=x&1,x>>=1; for(int i=idx,j=1;i>(idx>>1);i--,j++) ans+=((a[i]^a[j]) `#include using namespace std; #define int long long const int N=45; int T,x,idx,ans; bool a[N]; signed main(){ cin>>T; while(T--){ cin>>x; ans=idx=0; while(x) a[++idx]=x&1,x>>=1; for(int i=idx,j=1;i>(idx>>1);i--,j++) ans+=((a[i]^a[j])(j-1)); coutans"\n"; } return 0; } ` 小 L 涂色 糖糖题,还好没挂。 C++ #include using namespace std; #define int long long const int N=1e6+5; int n,m,ans; int a[N],fa[N],mn[N],vis[N],eg[N],tag[N],siz[N]; int find(int x){ if(x==fa[x]) return x; else return fa[x]=find(fa[x]); } signed main(){ scanf("%lld%lld",&n,&m); for(int i=1;i>u>>v; int x=find(u),y=find(v); if(x==y){ eg[x]++; continue; } if(siz[x]>siz[y]) swap(x,y); fa[x]=y,siz[y]+=siz[x]; vis[y]+=vis[x],mn[y]=min(mn[y],mn[x]),eg[y]+=eg[x]+1; } for(int i=1;i=siz[x]) ans-=vis[x]; else ans-=(vis[x]-mn[x]); } printf("%lld",ans); return 0; } `#include using namespace std; #define int long long const int N=1e6+5; int n,m,ans; int a[N],fa[N],mn[N],vis[N],eg[N],tag[N],siz[N]; int find(int x){ if(x==fa[x]) return x; else return fa[x]=find(fa[x]); } signed main(){ scanf("%lld%lld",&n,&m); for(int i=1;in;i++){ scanf("%lld=",&a[i]); fa[i]=i,mn[i]=a[i],vis[i]=a[i],siz[i]=1; ans+=a[i]; } for(int i=1;im;i++){ int u,v; cin>>u>>v; int x=find(u),y=find(v); if(x==y){ eg[x]++; continue; } if(siz[x]>siz[y]) swap(x,y); fa[x]=y,siz[y]+=siz[x]; vis[y]+=vis[x],mn[y]=min(mn[y],mn[x]),eg[y]+=eg[x]+1; } for(int i=1;in;i++){ int x=find(fa[i]); if(tag[x]) continue; tag[x]=1; if(eg[x]>=siz[x]) ans-=vis[x]; else ans-=(vis[x]-mn[x]); } printf("%lld",ans); return 0; }` 删除滚木 巨糖之题,想到了二位偏序,于是直接用上树状数组了,复杂度对但需要离散化啥的被卡常了。 赛后重构写了个最长不下降子序列就过了。。。 C++ #include using namespace std; const int N=5e5+5; int n,k; int a[N]; long double d[N]; struct node{ long double x,y; bool operatorb.x; return y=d[len]) d[++len]=b[i].y; else *lower_bound(d+1,d+1+len,b[i].y)=b[i].y; } return len>=n-k; } signed main(){ scanf("%d%d",&n,&k); for(int i=1;i `#include using namespace std; const int N=5e5+5; int n,k; int a[N]; long double d[N]; struct node{ long double x,y; bool operatorconst node b)const{ if(x!=b.x) return x>b.x; return yb.y; } }b[N]; bool check(long double x){ for(int i=1;in;i++) b[i]={a[i]-i*x,a[i]+i*x}; sort(b+1,b+1+n); int len=0; for(int i=1;in;i++){ if(!len||b[i].y>=d[len]) d[++len]=b[i].y; else *lower_bound(d+1,d+1+len,b[i].y)=b[i].y; } return len>=n-k; } signed main(){ scanf("%d%d",&n,&k); for(int i=1;in;i++) scanf("%d",a+i); long double l=0,r=2e9,ans; for(int i=1;i70;i++){ long double mid=(l+r)/2.0; if(check(mid)) r=ans=mid; else l=mid; } printf("%0.10Lf",ans); return 0; }` 午安。 神中神中神中神之题,毫无想写的欲望,把官方题解放这了:

Read more · Journal