[41] (CSP 集训) CSP-S 模拟 9
1.Codeforces Round 955 (Div. 2)2.AtCoder Beginner Contest 3633.AtCoder Regular Contest 182(A B C)4.暑假集训CSP提高模拟15.暑假集训CSP提高模拟26.暑假集训CSP提高模拟77.暑假集训CSP提高模拟58.暑假集训 加赛19.暑假集训CSP提高模拟410.暑假集训CSP提高模拟1811.暑假集训CSP提高模拟1712.暑假集训CSP提高模拟 1613.暑假集训CSP提高模拟 ∫[0,6] (x^2)/6 dx14.暑假集训CSP提高模拟1115.暑假集训SCP提高模拟1016.暑假集训PVZ提高模拟917.暑假集训CSP提高模拟818.暑集假训SCP提高拟模2119.[CL-FOOL] CLOI 愚人赛的部分官方题解与小杂谈20.トヨタ自動車プログラミングコンテスト2024#7(ABC 362)21.寒假集训测试2 题目转存22.HEOI2024 题目转存23.高一小学期224.张江蔡25.高一高考集训总结赛26.高一下二调题目转存27.CSP提高组模拟128.Atcoder Beginner Contest 36729.[R18][中国語翻訳]HDKのABC370赛試(ABC370)30.[30] CSP 加赛 131.[33](CSP 集训)CSP-S 模拟 432.[34](CSP 集训)CSP-S 联训模拟 133.[35] (CSP 集训) CSP-S 模拟 534.[36](CSP 集训)CSP-S 模拟 635.AtCoder Beginner Contest 37336.[37](CSP 集训)CSP-S 模拟 737.[39] (多校联训) A层冲刺NOIP2024模拟赛0138.[40](CSP 集训)CSP 联训模拟 239.[42] (多校联训) A层冲刺NOIP2024模拟赛03
40.[41] (CSP 集训) CSP-S 模拟 9
41.[44] (多校联训) A层冲刺NOIP2024模拟赛0442.[45] (多校联训) A层冲刺NOIP2024模拟赛0543.[46] (多校联训) A层冲刺NOIP2024模拟赛0644.パナソニックグループ プログラミングコンテスト2024(ABC 375)45.[47] (CSP 集训) CSP-S 模拟 1146.[49 & 50] (多校联训) A层冲刺NOIP2024模拟赛08 | CSP-S 模拟 1247.[51] (多校联训) A层冲刺NOIP2024模拟赛0948.Atcoder Beginner Contest 37649.Codeforces Round 980 (Div. 2)50.[54] (多校联训) A层冲刺NOIP2024模拟赛1251.[57] (多校联训) A层冲刺NOIP2024模拟赛1552.[61] (多校联训) A层冲刺NOIP2024模拟赛1853.[62] (NOIP 集训) NOIP2024加赛 254.[63] (多校联训) A层冲刺NOIP2024模拟赛1955.[68] (炼石计划) NOIP 模拟赛 #2056.[68] (NOIP集训) NOIP2024 加赛 557.[72] (多校联训) A层冲刺NOIP2024模拟赛2558.[73] (NOIP集训) NOIP2024 加赛 759.[75] (NOIP集训) NOIP2024 加赛 8A.邻面合并
观察到
状压枚举二进制状态,
考虑转移的时候加了什么
判断这一行与上一行的联通情况,如果这一行的某一个连通块和上一行正好对上了,那么就可以直接扩展矩形,答案不增加,否则对每个连通块,答案加一
我对这个联通情况的设计是不咋好的,还是说一下
设
- 连通块内不存在
的 - 连通块内不存在
的
这么一做就会出很多冗余状态,但是我也不太会设计更好的了,所以就只能这样了
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[101][9];
int f[2][(1<<8)+1][(1<<8)+1];
int minn[101][(1<<8)+1];
vector<pair<int,int>>thi,las;
inline void work(int i,int j,vector<pair<int,int>>&ts){
if(i==0) return;
ts.clear();
for(int k=1;k<=m;++k){
int tmp=(j>>(k-1))&1;
int tmplast=(k==1?tmp:(j>>(k-2))&1);
if(a[i][k]==0){
if(!ts.empty() and ts.back().second==0){
ts.back().second=k-1;
}
}
else if(k==1 or tmp!=tmplast or a[i][k-1]==0){
if(!ts.empty() and ts.back().second==0){
ts.back().second=k-1;
}
ts.push_back({k,0});
}
}
if(!ts.empty() and ts.back().second==0){
ts.back().second=m;
}
}
int main(){
freopen("merging.in","r",stdin);
freopen("merging.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%d",&a[i][j]);
}
}
memset(minn,0x3f,sizeof minn);
memset(minn[0],0,sizeof minn[0]);
for(int i=1;i<=n;++i){
memset(f[i&1],0x3f,sizeof f[i&1]);
for(int j=0;j<=(1<<m)-1;++j){
for(int k=0;k<=(1<<m)-1;++k){
work(i,j,thi);
work(i-1,k,las);
int res=0;
for(auto p:thi){
res++;
for(auto q:las){
if(p==q){
res--;
break;
}
}
}
f[i&1][j][k]=min(f[i&1][j][k],minn[i-1][k]+res);
minn[i][j]=min(minn[i][j],f[i&1][j][k]);
}
}
}
int ans=0x7fffffff;
for(int j=0;j<=(1<<m)-1;++j){
ans=min(ans,minn[n][j]);
}
cout<<ans<<'\n';
}
B.光线追踪
好题,有意思
转化成角度,那么就相当于是在做区间问题
首先射线只会碰到一个矩形的下或左边,因此剩下两个边可以直接忽略
假如射线会遇到多个矩形,那么我们肯定是选横/纵坐标最小的那个(哪个不变就看哪个,对于横线肯定是看纵坐标,竖线就是看横坐标)
所以问题就转化成了区间修改与单点查询最小值
因为询问的是矩形编号,所以应该是单点查询最小值编号
然后是一些小点,比如如果有一个是
这个题还卡精度,卡精度我就直接搬有理数类套 map 了,离散化一下还是简单的,注意求斜率分母为
#include<bits/stdc++.h>
#define int long long
#include"../include/hdk/frac.h"
//https://www.cnblogs.com/HaneDaCafe/articles/18439223
using namespace std;
int n;
struct ques{
int op;
int xa,ya,xb,yb;
}q[100001];
hdk::frac a[400001];
int cnt,ree=1;
map<hdk::frac,int>mp;
bool cmp(const hdk::frac &A,const hdk::frac &B){
return B<A;
}
inline int maped(pair<int,int> x){
if(x.second==0) return 1;
return mp[hdk::frac(x.first,x.second)];
}
struct __ans{
int ans,minn;
};
struct stree{
struct tree{
int l,r;
int pos,minn;
}t[1000001];
#define tol (id*2)
#define tor (id*2+1)
#define mid(l,r) mid=((l)+(r))/2
void build(int id,int l,int r){
t[id].l=l;t[id].r=r;
t[id].pos=0;t[id].minn=0;
if(l==r) return;
int mid(l,r);
build(tol,l,mid);
build(tor,mid+1,r);
}
void change(int id,int l,int r,int val,int pos){
if(l<=t[id].l and t[id].r<=r){
if(t[id].pos==0 or t[id].minn>=val){
t[id].pos=pos;
t[id].minn=val;
}
return;
}
if(r<=t[tol].r) change(tol,l,r,val,pos);
else if(l>=t[tor].l) change(tor,l,r,val,pos);
else{
change(tol,l,t[tol].r,val,pos);
change(tor,t[tor].l,r,val,pos);
}
}
__ans ask(int id,int pos){
if(t[id].l==t[id].r){
return {t[id].pos,t[id].minn};
}
__ans res={};
if(pos<=t[tol].r) res=ask(tol,pos);
else res=ask(tor,pos);
if(t[id].pos==0) return res;
if(res.ans==0 or t[id].minn<res.minn) return {t[id].pos,t[id].minn};
else if(t[id].minn==res.minn and t[id].pos>res.ans) return {t[id].pos,t[id].minn};
return res;
}
};
stree x,y;
int cal(__ans x,__ans y,int xx,int yy){
if(x.ans==0) return y.ans;
if(y.ans==0) return x.ans;
if(xx==0){
if(q[x.ans].ya<q[y.ans].ya) return x.ans;
return y.ans;
}
if(yy==0){
if(q[x.ans].xa<q[y.ans].xa) return x.ans;
return y.ans;
}
if(x.minn*xx==y.minn*yy){
if(x.ans>y.ans) return x.ans;
return y.ans;
}
if(x.minn*xx<y.minn*yy){
return x.ans;
}
return y.ans;
}
signed main(){
freopen("raytracing.in","r",stdin);
freopen("raytracing.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&q[i].op);
if(q[i].op==1){
scanf("%lld %lld %lld %lld",&q[i].xa,&q[i].ya,&q[i].xb,&q[i].yb);
if(q[i].xa) a[++cnt]=hdk::frac(q[i].ya,q[i].xa);
if(q[i].xb) a[++cnt]=hdk::frac(q[i].ya,q[i].xb);
if(q[i].xa) a[++cnt]=hdk::frac(q[i].yb,q[i].xa);
}
else{
scanf("%lld %lld",&q[i].xa,&q[i].ya);
if(q[i].xa) a[++cnt]=hdk::frac(q[i].ya,q[i].xa);
}
}
sort(a+1,a+cnt+1,cmp);
for(int i=1;i<=cnt;++i){
if(i==1 or !(a[i]==a[i-1])){
mp[a[i]]=++ree;
}
}
x.build(1,1,ree);
y.build(1,1,ree);
for(int i=1;i<=n;++i){
if(q[i].op==1){
int r1=maped({q[i].yb,q[i].xa});
int r2=maped({q[i].ya,q[i].xb});
int mid=maped({q[i].ya,q[i].xa});
x.change(1,min(r2,mid),max(r2,mid),q[i].ya,i);
y.change(1,min(r1,mid),max(r1,mid),q[i].xa,i);
}
else{
__ans tmp1=x.ask(1,maped({q[i].ya,q[i].xa}));
__ans tmp2=y.ask(1,maped({q[i].ya,q[i].xa}));
cout<<cal(tmp1,tmp2,q[i].xa,q[i].ya)<<'\n';
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!