多校A层冲刺NOIP2024模拟赛02 & csp-s模拟9
1.2024 CSP-S 游记2.高一上十月上旬日记3.冲刺CSP联训模拟2
4.多校A层冲刺NOIP2024模拟赛02 & csp-s模拟9
5.多校A层冲刺NOIP2024模拟赛036.csp-s模拟107.多校A层冲刺NOIP2024模拟赛048.高一上十月中旬日记9.多校A层冲刺NOIP2024模拟赛0510.多校A层冲刺NOIP2024模拟赛0611.Panasonic Programming Contest 2024(AtCoder Beginner Contest 375)12.csp-s模拟1113.多校A层冲刺NOIP2024模拟赛0714.多校A层冲刺NOIP2024模拟赛0815.csp-s模拟1216.【LGR-203-Div.4】洛谷入门赛 #2817.多校A层冲刺NOIP2024模拟赛0918.信友队2024CSP-S第二轮(复赛)模拟赛19.AtCoder Beginner Contest 37620.高一上十月下旬日记21.多校A层冲刺NOIP2024模拟赛1022.多校A层冲刺NOIP2024模拟赛1123.多校A层冲刺NOIP2024模拟赛1224.2024 CSP-S 第二轮多校A层冲刺NOIP2024模拟赛02
四道题因为暑假被拉去当模拟赛 暑假集训CSP提高模拟22 了,遂直接把赛后代码交了上去,然后就被通知换题了。
原 long long
和 int
后达到了
A. 法阵
B. 连通块
C. 军队
D. 棋盘
csp-s模拟9
T1075. 邻面合并
- 部分分
:打表加手摸。- 该代码 仅手摸了
的数据,且不保证正确性。
- 该代码 仅手摸了
- 正解
-
观察到
,考虑状压 。 -
具体地,以每一块的开头作为分割点,并记录作状态,总状态数为
。- 判断是否合法的一个重要标准是原矩阵中的
不可以是分割点,原矩阵的 若本身不是分割点则到前面最近的分割点直接不能有 。
- 判断是否合法的一个重要标准是原矩阵中的
-
转移的时候枚举上一行的状态,计算达成这两行的分割方式需要新创建多少个块。较为简便的做法是拿本行块的总数减去与上一行分割方式相同的块数(可以直接合并的块),建议画图理解。
-
图来自官方题解。
-
-
时间复杂度为
。点击查看代码
int a[120][10],f[110][1<<10],opt[110][10][1<<10]; bool check(int hang,int s,int m) { int last=0; for(int i=0;i<=m-1;i++) { if(((s>>i)&1)&&a[hang][i+1]==0) { return false; } } for(int i=0;i<=m-1;i++) { if((s>>i)&1) { last=1; } if(a[hang][i+1]==0) { last=0; } if(last==0&&a[hang][i+1]==1) { return false; } } return true; } int work(int hang,int lie,int s) { while(a[hang][lie+1]==1&&((s>>(lie-1+1))&1)==0) { lie++; } return lie; } int main() { freopen("merging.in","r",stdin); freopen("merging.out","w",stdout); int n,m,ans=0x7f7f7f7f,sum,i,j,k,h; cin>>n>>m; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>a[i][j]; } } memset(f,0x3f,sizeof(f)); f[0][0]=0; for(i=0;i<=(1<<m)-1;i++) { f[0][i]=0; } for(k=1;k<=n;k++) { for(i=0;i<=(1<<m)-1;i++) { if(check(k,i,m)==true) { for(j=1;j<=m;j++) { opt[k][j][i]=work(k,j,i); } } } } for(k=1;k<=n;k++) { for(i=0;i<=(1<<m)-1;i++) { if(check(k,i,m)==true) { for(j=0;j<=(1<<m)-1;j++) { if(check(k-1,j,m)==true) { sum=__builtin_popcount(i); for(h=0;h<=m-1;h++) { if(((i>>h)&1)&&((j>>h)&1)) { sum-=(opt[k][h+1][i]==opt[k-1][h+1][j]); } } f[k][i]=min(f[k][i],f[k-1][j]+sum); } } } } } for(i=0;i<=(1<<m)-1;i++) { ans=min(ans,f[n][i]); } cout<<ans<<endl; fclose(stdin); fclose(stdout); return 0; }
-
T1076. 光线追踪
-
部分分
-
正解
-
不难发现对于矩阵覆盖对答案有可能产生贡献的只有左高和下底两条边。
-
考虑处理处理出每个矩形左高、下底对应的斜率范围。
-
对横纵坐标各开一棵区间修改、单点查询线段树维护交点即可。若标记下传较为复杂则可以考虑标记永久化;更新答案时需注意高度较小的优先,若高度相等则编号大的优先。
-
离线下来对斜率离散化或使用分式相乘判等减少炸精度的可能。
-
最后需要特判
或 的情况。点击查看代码
ll pd[100010],x[100010],y[100010],xx[100010],yy[100010],cnt=0; double a[400010]; struct SMT { struct SegmentTree { ll l,r,id,lazy; }tree[1600010]; ll lson(ll x) { return x*2; } ll rson(ll x) { return x*2+1; } void build(ll rt,ll l,ll r) { tree[rt].l=l; tree[rt].r=r; tree[rt].id=0; tree[rt].lazy=0x7f7f7f7f; if(l==r) { return; } ll mid=(l+r)/2; build(lson(rt),l,mid); build(rson(rt),mid+1,r); } void update(ll rt,ll x,ll y,ll val,ll id) { if(x<=tree[rt].l&&tree[rt].r<=y) { if(tree[rt].lazy>=val) { tree[rt].id=id; tree[rt].lazy=val; } return; } ll mid=(tree[rt].l+tree[rt].r)/2; if(x<=mid) { update(lson(rt),x,y,val,id); } if(y>mid) { update(rson(rt),x,y,val,id); } } pair<ll,ll> query(ll rt,ll pos) { if(tree[rt].l==tree[rt].r) { return make_pair(tree[rt].id,tree[rt].lazy); } ll mid=(tree[rt].l+tree[rt].r)/2; pair<ll,ll>ans; if(pos<=mid) { ans=query(lson(rt),pos); } else { ans=query(rson(rt),pos); } if(ans.first==0||(tree[rt].id!=0&&tree[rt].lazy<ans.second)) { return make_pair(tree[rt].id,tree[rt].lazy); } if(tree[rt].id!=0&&tree[rt].lazy==ans.second) { return make_pair(max(tree[rt].id,ans.first),ans.second); } return ans; } }hang,lie; void add(ll x,ll y) { cnt++; a[cnt]=(x==0)?0x7f7f7f7f:1.0*y/x; } bool cmp(pair<ll,ll>hang,pair<ll,ll>lie,ll id) { if(x[id]==0) { return y[hang.first]<y[lie.first]; } if(y[id]==0) { return x[hang.first]<x[lie.first]; } if(hang.second*x[id]==lie.second*y[id]) { return hang.first>lie.first; } else { return hang.second*x[id]<lie.second*y[id]; } } int main() { freopen("raytracing.in","r",stdin); freopen("raytracing.out","w",stdout); ll q,n,pos1,pos2,pos3,i; pair<ll,ll>tmp1,tmp2; cin>>q; for(i=1;i<=q;i++) { cin>>pd[i]>>x[i]>>y[i]; if(pd[i]==1) { cin>>xx[i]>>yy[i]; add(xx[i],y[i]); add(x[i],y[i]); add(x[i],yy[i]); } else { add(x[i],y[i]); } } sort(a+1,a+1+cnt); n=unique(a+1,a+1+cnt)-(a+1); hang.build(1,1,n); lie.build(1,1,n); for(i=1;i<=q;i++) { if(pd[i]==1) { pos1=lower_bound(a+1,a+1+n,(xx[i]==0)?0x7f7f7f7f:1.0*y[i]/xx[i])-a; pos2=lower_bound(a+1,a+1+n,(x[i]==0)?0x7f7f7f7f:1.0*y[i]/x[i])-a; pos3=lower_bound(a+1,a+1+n,(x[i]==0)?0x7f7f7f7f:1.0*yy[i]/x[i])-a; hang.update(1,pos1,pos2,y[i],i); lie.update(1,pos2,pos3,x[i],i); } else { pos1=lower_bound(a+1,a+1+n,(x[i]==0)?0x7f7f7f7f:1.0*y[i]/x[i])-a; tmp1=hang.query(1,pos1); tmp2=lie.query(1,pos1); if(tmp1.first==0||tmp2.first==0) { cout<<tmp1.first+tmp2.first<<endl; } else { if(cmp(tmp1,tmp2,i)==true) { cout<<tmp1.first<<endl; } else { cout<<tmp2.first<<endl; } } } } fclose(stdin); fclose(stdout); return 0; }
-
T2186. 百鸽笼
-
部分分
-
:爆搜。点击查看代码
const ll p=998244353; ll a[50],aa[50],pos[50],inv[50],f[50]; ll qpow(ll a,ll b,ll p) { ll ans=1; while(b) { if(b&1) { ans=ans*a%p; } b>>=1; a=a*a%p; } return ans; } void dfs(ll len,ll n,ll sum,ll mul,ll cnt) { if(len==sum) { for(ll i=1;i<=n;i++) { if(a[i]==1) { f[i]=(f[i]+mul)%p; return; } } } else { for(ll i=1;i<=n;i++) { if(a[i]>=1) { a[i]--; dfs(len+1,n,sum,mul*inv[cnt]%p,cnt-(a[i]==0)); a[i]++; } } } } int main() { freopen("c.in","r",stdin); freopen("c.out","w",stdout); ll n,sum=-1,i; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; inv[i]=qpow(i,p-2,p); } dfs(0,n,sum,1,n); for(i=1;i<=n;i++) { cout<<f[i]<<" "; } fclose(stdin); fclose(stdout); return 0; }
-
详见 UOJ NOI Round #3 Day2 题解 百鸽笼 。
-
-
正解
T2188. 滑稽树下你和我
- 原题: UOJ 371. 【UR #17】滑稽树下你和我
- 部分分
-
:输出 在图上的距离。点击查看代码
struct node { int nxt,to; }e[2010]; int head[2010],du[2010],cnt=0; double x[2010],y[2010]; void add(int u,int v) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; head[u]=cnt; } double work(double x1,double y1,double x2,double y2) { return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } int main() { freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); int n,u,v,stx,sty,i; double ans=0x7f7f7f7f; cin>>n>>stx>>sty; for(i=1;i<=n;i++) { cin>>x[i]>>y[i]; } for(i=1;i<=n-1;i++) { cin>>u>>v; add(u,v); add(v,u); du[u]++; du[v]++; } printf("%.8lf\n",work(x[stx],y[stx],x[sty],y[sty])); fclose(stdin); fclose(stdout); return 0; }
-
-
- 正解
总结
- 期初只在
里下发了 的题面(没有数据范围和样例),过了 后才陆续上传了全部题面(截图);全程没有看见除 大样例外的下发文件。 不会写爆搜,打表程序出的结果都是手动判断的。- 做法假了,把矩形覆盖当成了点的覆盖(只枚举横坐标为整数的情况),询问直接死掉,从一开始的暴力到
map
套动态开点线段树、珂朵莉树都 了。 把数据点中的一个点作为大样例下发了,但做数据点配置文件时把输入、输出文件写反了。
- 做法假了,把矩形覆盖当成了点的覆盖(只枚举横坐标为整数的情况),询问直接死掉,从一开始的暴力到
两点间距离公式炸int
了,挂了 。
后记
- 下发
题解时还额外下发了一道题 新的世界 。 下发的题解 渲染不正常,像是早年的 文档造成。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18449371,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2023-10-06 CF131D Subway 题解
2023-10-06 CF1010C Border 题解