[41] (CSP 集训) CSP-S 模拟 9

news/2024/10/9 3:28:28/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18450591

A.邻面合并

观察到 \(m\) 很小,支持我们 \(mn2^{2m}\)

状压枚举二进制状态, \(f_{i,j,k}\) 表示到第 \(i\) 位的状态为 \(j\),上一位状态为 \(j\) (\(i,j\) 为状压位) 的方案数

考虑转移的时候加了什么

判断这一行与上一行的联通情况,如果这一行的某一个连通块和上一行正好对上了,那么就可以直接扩展矩形,答案不增加,否则对每个连通块,答案加一

我对这个联通情况的设计是不咋好的,还是说一下

\(a\) 是原矩阵第 \(i\) 行,\(b\) 是枚举到的状压状态,我判断连通块是根据

  • 连通块内不存在 \(a_j=0\)\(j\)
  • 连通块内不存在 \(b_j=0\)\(j\)

这么一做就会出很多冗余状态,但是我也不太会设计更好的了,所以就只能这样了

#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.光线追踪

好题,有意思

转化成角度,那么就相当于是在做区间问题

首先射线只会碰到一个矩形的下或左边,因此剩下两个边可以直接忽略

假如射线会遇到多个矩形,那么我们肯定是选横/纵坐标最小的那个(哪个不变就看哪个,对于横线肯定是看纵坐标,竖线就是看横坐标)

所以问题就转化成了区间修改与单点查询最小值

因为询问的是矩形编号,所以应该是单点查询最小值编号

然后是一些小点,比如如果有一个是 \(0\) 应该返回另一个,或者两个最值相等应该返回编号大的(后来的会覆盖先来的),还有当给定的向量存在 \(0\) 时的处理

这个题还卡精度,卡精度我就直接搬有理数类套 map 了,离散化一下还是简单的,注意求斜率分母为 \(0\) 的情况

#include<bits/stdc++.h>
#define int long long
#include"../include/hdk/frac.h"
//https://www.cnblogs.com/HaneDaCafe/articles/18439223using 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))/2void 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';}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809614.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA如何快速定位到当前打开文件所在的目录

前言 我们在使用IDEA开发时,经常需要知道当前打开的文件是在哪个目录,这个可以在上方看到具体的目录。 但是,当我们需要知道这个目录下有哪些文件或者想要复制当前文件的时候,就需要快速定位当前文件的目录了。 那么,我们应该如何操作呢? 如何操作定位当前打开文件目录 首…

Vulnhub 靶机 THE PLANETS: EARTH

0x01信息收集 1.1、nmap扫描 IP段扫描,确定靶机地址 平扫描 nmap 192.168.1.0/24扫描结果(部分) Nmap scan report for earth.local (192.168.1.129) Host is up (0.0015s latency). Not shown: 983 filtered tcp ports (no-response), 14 filtered tcp ports (admin-prohib…

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云监控告警平台(附配置告警至QQ、钉钉)

目录一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa 账号 m…

2024.10.7 鲜花

【UNR #3】百鸽笼【UNR #3】百鸽笼花の塔 君が持ってきた漫画 くれた知らない名前のお花 今日はまだ来ないかな? 初めての感情知ってしまった 窓に飾った絵画をなぞってひとりで宇宙を旅して それだけでいいはずだったのに 君の手を握ってしまったら 孤独を知らないこの街には…

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云平台系统(附配置告警至QQ、钉钉)

目录一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa 账号 m…

软件工程第二次结对作业

软件工程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13281作业目标 基于第一次结对作业项目程序的实现学号 102201127合作伙伴 102201129项目分工: 102201129周鑫: 前端开发: 设计和实现用户界面。 确保界面响…

20241007

sequence 我们会发现,我们每次删的一定是长度最短的那个,所以我们可以最开始按照长的排一下序,然后用线段树维护每一个区间中还有几个数,每次加上答案后在两个端点打上标记即可 #include <bits/stdc++.h> #define _1 (__int128)1using namespace std; using ll = long lo…

软件工程week2课程作业|“物品复活“软件开发

“物品复活”软件开发 作业要求 大学生经常有些物品觉得扔掉可惜,不处理又觉得浪费自己的地方。请你编写一个物品“复活”软件 该程序允许添加物品的信息(物品名称,物品描述,联系人信息),删除物品的信息,显示物品列表,也允许查找物品的信息 你实现的程序可以采用命令行…

[42] (多校联训) A层冲刺NOIP2024模拟赛03

今天的乐子今天的乐子2 昨天晚上做梦 梦见自己被关进戒网瘾学校 里面的老师全和疯子一样 然后我和这帮疯子老师比疯 疯子老师发现他们没我疯 所以就把我放了今天的乐子3 lhx 罗曼蒂克的辟谷A.五彩斑斓 赛时的想法 \(n^4\) 的做法,设 \(f_{i,j,k,l}\) 表示以 \((i,j)\) 为左上角…

Metasploit渗透测试框架学习(一)基本使用教程

1.Metasploit框架结构 1.1总览基础库文件Rex为最底层,实现网络套接字、网络应用协议、客户端服务端交互、数据库支持等 framework-core实现与上层模块交互的接口 framework-base对framework-core的扩展封装,用于提供各种接口供用户调用基于framework-base实现的六大模块Explo…

统计学(十三)——相关分析

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 相关分析是用于研究多个变量之间相互关系的统计方法,最早由英国统计学家卡尔皮尔逊(Karl Pearson)于1896年提出。皮尔逊通过对变量间线性关系的深入研究,…

前端模块化进化史:从全局 function 到 ES Modules

目前,前端开发已经离不开由 CommonJS、ES Modules 和 Webpack 构建的模块化开发环境。无论是 JavaScript、CSS、图片还是其他资源,都可以作为一个模块来处理。那么,模块化究竟是如何发展到今天的呢? 全局函数模式 最初的前端模块化尝试是通过 全局函数来实现的。例如,在一…