[49 50] (多校联训) A层冲刺NOIP2024模拟赛08 | CSP-S 模拟 12

news/2024/10/18 18:14:26/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18472795

一小孩在奶茶店玩封盖机被绞断四根手指

记者:你现在感觉怎么样
小孩:👍

不是哥们 P 的,你可以自己去 hdk吧 找

我左手中指指甲里莫名其妙卡了个木刺

医生 1:(打手电筒)
医生 2:(尝试把刺弄出来)

医生 2:诶呀,断了

医生 2:你就这么想拔这个刺吗
我:这不拔能行?
医生 2:你看你这个也不深,长一周自己就掉了
我:不会发炎吗
医生 1:发炎了那不更好弄出来了吗,而且到时候发炎我们就能处理了,你现在这玩意我们也处理不了啊
医生 2:你让它自求多福去就行了
我:???

Ciallo~(∠・ω< )⌒★

咱们集资,到秦皇岛给 CTH 买条裙子,意下如何

[48] C.距离

补一下式子

\[\begin{aligned}\max(|a_i-a_j|,|b_i-b_j|)&=|\frac{a_i+b_i}{2}-\frac{a_j+b_j}{2}|+|\frac{a_i-b_i}{2}-\frac{a_j-b_j}{2}|\\&=|\frac{(a_i-a_j)+(b_i-b_j)}{2}|+|\frac{(a_i-a_j)-(b_i-b_j)}{2}|\\&=\begin{cases}\frac{(a_i-a_j)+(b_i-b_j)}{2}+\frac{(a_i-a_j)-(b_i-b_j)}{2}=a_i-a_j&{a_i-a_j\ge b_i-b_j}\\\frac{(a_i-a_j)+(b_i-b_j)}{2}+\frac{(b_i-b_j)-(a_i-a_j)}{2}=b_i-b_j&{\text{otherwise}}\end{cases}\end{aligned} \]

\[\begin{aligned}\min(|a_i-a_j|,|b_i-b_j|)&=|a_i-a_j|+|b_i-b_j|-\max(|a_i-a_j|,|b_i-b_j|)\\&=a_i-a_j|+|b_i-b_j|-|\frac{a_i+b_i}{2}-\frac{a_j+b_j}{2}|-|\frac{a_i-b_i}{2}-\frac{a_j-b_j}{2}|\end{aligned} \]

[49] A.传送

首先发现横坐标或纵坐标相等的点之间移动不需要费用,因此考虑对横纵坐标拉出来建虚点

然后发现其实不用对横纵坐标建虚点,只需要把横坐标或纵坐标相邻的点连边即可

所以排序后直接连

正常边正常连即可

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{int to,w;
};
vector<edge>e[200001];
int x[200001],y[200001];
int id[200001];
inline static int cal(int i,int j)noexcept{return min(abs(x[i]-x[j]),abs(y[i]-y[j]));
}
int dis[200001];
bool vis[200001];
struct node{int id,dis;bool operator <(const node &A)const{return dis>A.dis;}
};
priority_queue<node>q;
inline void dij(int s){memset(dis,0x3f,sizeof dis);memset(vis,0,sizeof vis);dis[s]=0;q.push({s,dis[s]});while(!q.empty()){node u=q.top();q.pop();if(vis[u.id]) continue;vis[u.id]=true;for(edge i:e[u.id]){if(dis[i.to]>dis[u.id]+i.w){dis[i.to]=dis[u.id]+i.w;q.push({i.to,dis[i.to]});    }}}
}
int main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;++i){scanf("%d %d",&x[i],&y[i]);}iota(id+1,id+n+1,1);sort(id+1,id+n+1,[](int a,int b){return x[a]<x[b];});for(int i=2;i<=n;++i){e[id[i-1]].push_back({id[i],cal(id[i],id[i-1])});e[id[i]].push_back({id[i-1],cal(id[i],id[i-1])});}sort(id+1,id+n+1,[](int a,int b){return y[a]<y[b];});for(int i=2;i<=n;++i){e[id[i-1]].push_back({id[i],cal(id[i],id[i-1])});e[id[i]].push_back({id[i-1],cal(id[i],id[i-1])});}for(int i=1;i<=m;++i){int x,y,z;scanf("%d %d %d",&x,&y,&z);e[x].push_back({y,z});e[y].push_back({x,z});}dij(1);for(int i=2;i<=n;++i) cout<<dis[i]<<" ";
}

[49] B.排列

如果两个数 \(a,b\) 满足 \(\gcd(a,b)=k\),则一定会有 \(a=m_1k,b=m_2k,\ (m_1,m_2\in Z)\)

所以只有 \(i\mid k\)\(\frac{n}{k}\)\(i\) 对答案有用,而题目保证 \(\frac{n}{k}\le 10\)

因此状压,\(f_{i,j,k}\) 设选到 \(i\),当前在 \(\frac{n}{k}\) 个数中的的选数状态为 \(j\),上一个选了 \(k\) 的方案数(注意到选不在 \(\frac{n}{k}\) 中的数的本质都是一样的,因此统一视作 \(0\)

或者记搜亦可

#include<bits/stdc++.h>
using namespace std;
const int p=998244353;
int f[3001][1<<10][11];
int n,k,tot;
int maxn;
long long dfs(int now,int choose,int lastchoose){if(now>n) return (choose==maxn);if(f[now][choose][lastchoose]!=-1) return f[now][choose][lastchoose];int tmp=__builtin_popcount(choose);if(n-now+1<tot-tmp) return 0;long long res=0;for(int i=0;i<=tot-1;++i){if((choose&(1<<i))==0){if(lastchoose==0 or __gcd(k*lastchoose,k*(i+1))!=k){res+=dfs(now+1,choose|(1<<i),i+1);            res%=p;}}}res+=dfs(now+1,choose,0);res%=p;return f[now][choose][lastchoose]=res;
}
long long fact(long long n){long long ans=1;for(int i=2;i<=n;++i) ans=ans*i%p;return ans;
}
signed main(){memset(f,-1,sizeof f);cin>>n>>k;tot=n/k;maxn=(1<<tot)-1;cout<<dfs(1,0,0)*fact(n-tot)%p;
}

[49] C.战场模拟器

  • 护盾与死亡不会太多,只要遇到直接暴力处理即可

  • 线段树维护当前区间最小非负血量及其数量(濒死的计数时用),护盾总数,死亡总数

  • 扣血:只要遇到存在护盾或者即将有人死亡的区间(可以通过区间最小值判断)就暴力递归,否则区间减

  • 回血:直接区间加即可

  • 加护盾:线段树单点修改

  • 查询死亡:直接区间查询

  • 查询濒死:即查询最小值为 \(0\) 的区间计数总和,仍然是区间查询

  • 注意人死后直接赋成极大值,不能太小,防止整体扣血之后再死一次,也不能太大,防止回血回炸了

从昨天下午调到现在,以为线段树错了,但是线段树一点错没有,错在极大值了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
int a[200001];
struct tree{int l,r;int deadcnt;int minn,minncnt;int lazy;int safe;
}t[800001];
#define tol (id*2)
#define tor (id*2+1)
#define mid(l,r) mid=((l)+(r))/2
void update(int id){if(t[tol].minn==t[tor].minn){t[id].minn=t[tol].minn;t[id].minncnt=t[tol].minncnt+t[tor].minncnt;}else if(t[tol].minn<t[tor].minn){t[id].minn=t[tol].minn;t[id].minncnt=t[tol].minncnt;}else{t[id].minn=t[tor].minn;t[id].minncnt=t[tor].minncnt;}t[id].deadcnt=t[tol].deadcnt+t[tor].deadcnt;t[id].safe=t[tol].safe+t[tor].safe;
}
void build(int id,int l,int r){t[id].l=l;t[id].r=r;if(l==r){t[id].minn=a[l];t[id].minncnt=1;return;}int mid(l,r);build(tol,l,mid);build(tor,mid+1,r);update(id);
}
void pushdown(int id){if(t[id].lazy){t[tol].lazy+=t[id].lazy;t[tor].lazy+=t[id].lazy;t[tol].minn+=t[id].lazy;t[tor].minn+=t[id].lazy;t[id].lazy=0;}
}
void change(int,int,int,int);
void bl_change(int id,int l,int r,int val){if(t[id].l==t[id].r){if(t[id].deadcnt);else if(val<0 and t[id].safe) t[id].safe--;else{t[id].minn+=val;if(t[id].minn<0){t[id].deadcnt=1;t[id].minn=1e18;t[id].minncnt=0;}}return;}pushdown(id);if(t[tol].safe or t[tol].minn+val<0) bl_change(tol,l,t[tol].r,val);else change(tol,l,t[tol].r,val);if(t[tor].safe or t[tor].minn+val<0) bl_change(tor,t[tor].l,r,val);else change(tor,t[tor].l,r,val);update(id);
}
void change(int id,int l,int r,int val){if(l<=t[id].l and t[id].r<=r){if(val>=0 or (t[id].safe==0 and t[id].minn+val>=0)){t[id].lazy+=val;t[id].minn+=val;return;}bl_change(id,l,r,val);return;}pushdown(id);if(r<=t[tol].r) change(tol,l,r,val);else if(l>=t[tor].l) change(tor,l,r,val);else{change(tol,l,t[tol].r,val);change(tor,t[tor].l,r,val);}update(id);
}
void change_safe(int id,int p,int val){if(t[id].l==t[id].r){if(!t[id].deadcnt){t[id].safe++;}return;}pushdown(id);if(p<=t[tol].r) change_safe(tol,p,val);else change_safe(tor,p,val);update(id);
}
int askdead(int id,int l,int r){if(l<=t[id].l and t[id].r<=r){return t[id].deadcnt;}pushdown(id);if(r<=t[tol].r) return askdead(tol,l,r);else if(l>=t[tor].l) return askdead(tor,l,r);else return askdead(tol,l,t[tol].r)+askdead(tor,t[tor].l,r);
}
int askdying(int id,int l,int r){if(l<=t[id].l and t[id].r<=r){if(t[id].minn==0){return t[id].minncnt;}return 0;}pushdown(id);if(r<=t[tol].r) return askdying(tol,l,r);else if(l>=t[tor].l) return askdying(tor,l,r);else return askdying(tol,l,t[tol].r)+askdying(tor,t[tor].l,r);
}
signed main(){freopen("simulator.in","r",stdin);freopen("simulator.out","w",stdout);scanf("%lld",&n);for(int i=1;i<=n;++i){scanf("%lld",&a[i]);}build(1,1,n);scanf("%lld",&q);while(q--){int opt;scanf("%lld",&opt);if(opt==1){int l,r,x;scanf("%lld %lld %lld",&l,&r,&x);change(1,l,r,-x);}if(opt==2){int l,r,x;scanf("%lld %lld %lld",&l,&r,&x);change(1,l,r,x);}if(opt==3){int h;scanf("%lld",&h);change_safe(1,h,1);}if(opt==4){int l,r;scanf("%lld %lld",&l,&r);printf("%lld\n",askdead(1,l,r));}if(opt==5){int l,r;scanf("%lld %lld",&l,&r);printf("%lld\n",askdying(1,l,r));}}
}

[50] A.小 h 的几何

  • 三角形三边的中点、三条高的垂足、三角形三个顶点与垂心连线的中点共九个点共圆

  • 三角形 \(\{(x_1,y_1),(x_2,y_2),(x_3,y_3)\}\) 唯一确定的符合上述要求的圆的圆心为 \((\frac{x_1+x_2+x_3}{2},\frac{y_1+y_2+y_3}{2})\)

第一条挺神奇的,先不证明了,晚上有空补

第二条的证明:

对不起,脑子锈住了,不会几何,只能这么证了

设中点 \(D(\frac{x_1+x_2}{2},\frac{y_1+y_2}{2}),E(\frac{x_1+x_3}{2},\frac{y_1+y_3}{2}),F(\frac{x_2+x_3}{2},\frac{y_2+y_3}{2})\)

\(\text{mid}_{DE}(\frac{2x_1+x_2+x_3}{4},\frac{2y_1+y_2+y_3}{4}),\text{mid}_{EF}(\frac{x_1+x_2+2x_3}{4},\frac{y_1+y_2+2y_3}{4})\)

\[l_{DE}:y=\frac{y_2-y_3}{x_2-x_3}x+\frac{y_1+y_2}{2}-\frac{x_1+x_2}{x_2-x_3}\times\frac{y_2-y_3}{2} \]

\[l_{EF}:y=\frac{y_1-y_2}{x_1-x_2}x+\frac{y_1+y_3}{2}-\frac{x_1+x_3}{x_1-x_2}\times\frac{y_1-y_2}{2} \]

\[\begin{aligned}\begin{cases}\frac{1}{l_{DE}}\\\text{mid}_{DE}\end{cases}\rightarrow l_3:y=\frac{x_2-x_3}{y_2-y_3}x+\frac{2y_1+y_2+y_3}{4}-\frac{x_2-x_3}{y_2-y_3}\times\frac{2x_1+x_2+x_3}{4} \\\begin{cases}\frac{1}{l_{EF}}\\\text{mid}_{EF}\end{cases}\rightarrow l_4:y=\frac{x_1-x_2}{y_1-y_2}x+\frac{y_1+y_2+2y_3}{4}-\frac{x_1-x_2}{y_1-y_2}\times\frac{x_1+x_2+2x_3}{4}\end{aligned} \]

联立

\[\begin{aligned}x&=\frac{\frac{y_1+y_2+2y_3}{4}-\frac{x_1-x_2}{y_1-y_2}\times\frac{x_1+x_2+2x_3}{4}-\frac{2y_1+y_2+y_3}{4}+\frac{x_2-x_3}{y_2-y_3}\times\frac{2x_1+x_2+x_3}{4}}{\frac{x_2-x_3}{y_2-y_3}-\frac{x_1-x_2}{y_1-y_2}}\\&=\frac{(y_3-y_1)(y_1-y_2)(y_2-y_3)-(x_1-x_2)(y_2-y_3)(x_1+x_2+2x_3)+(y_1-y_2)(x_2-x_3)(2x_1+x_2+x_3)}{4[(y_1-y_2)(x_2-x_3)-(y_2-y_3)(x_1-x_2)]}\\&=\frac{y_1x_1x_2-y_1x_1x_3-x_1^2y_2-x_1^2y_3+y_1x_2^2+x_2x_3y_2-y_2x_1x_2+x_2^2y_3-y_1x_3^2+x_3^2y_2-x_1y_3x_3+x_2x_3y_3}{2(y_1x_2-y_1x_3+x_3y_2-y_2x_1-x_1y_3+x_2y_3)}\\&=\frac{x_1+x_2+x_3}{2}\end{aligned} \]

所以直接统计每个数在和式的出现次数,发现全部是定值 \(\frac{(n-1)(n-2)}{2}\),因此直接加和即可

代码里将 \(\frac{(n-1)(n-2)}{2}\)\(\frac{6}{n(n-1)(n-2)}\) 提前做了一点约分

#include<bits/stdc++.h>
using namespace std;
const long double pi=acos(-1);
struct node{public:long double x,y;node(){}node(long double xp,long double yp){x=xp;y=yp;}node operator +(node A){return node(x+A.x,y+A.y);}node operator +=(node A){return *this=*this+A;}node operator *(long double dx){return node(x*dx,y*dx);}node operator *=(long double dx){return *this=*this*dx;}
};
int n;
node a[500001];
long long theta;
node ans;int main(){scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%lld",&theta);a[i].x=cos(theta*pi/1e9);a[i].y=sin(theta*pi/1e9);ans+=a[i];}ans*=(3.0/(n*2.0));printf("%.20Lf %.20Lf",ans.x,ans.y);
}
这是什么

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

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

相关文章

Fluid Flux2.0海浪原理拆解

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!大概一年前,在油管上看到这个视频: Fluid Flux 2.0 - Coastline [Unreal Engine 5]除了效果很好,更重要的是看到简介中写着:“并非实…

PHP将整形数字转为Excel下标

1、背景 这两天在接到一个需求,需要导出一个班级所有学员的所有成绩,在最后excel表处理的时候发现导出的列超过了26列,后面会出现AA之类的下标,所以写了一个函数把数字整型转为Excel对应的下标。 2、转换函数/*** @Notes:将整数转为excel对应的列标* @Function int_to_chr*…

18. 模块

一、什么是模块模块化 指将一个完成的程序分解为一个一个小的模块。通过将模块组合,来搭建一个完整的程序。如果不采用模块化,那么所有的代码将统一保存到一个文件中。采用模块化后,将程序分别编写到多个文件中。使用模块化后,我们可以把代码进行复用,这方面后序的开发和维…

csp-s模拟12

csp-s模拟12\(T1\) T2918. 小 h 的几何 \(100pts\)对于任意三角形,均有其三条边的中点、三条高的垂足、三个顶点与垂心连线的中点,这九个点在一个圆上。观察样例可知,对于单位圆上 \(\triangle ABC\) 的三个顶点 \(A(x_{a},y_{a}),B(x_{b},y_{b}),C(x_{c},y_{c})\) ,其九点…

Android8,reactnative中webView传的token,vue中获取不到是怎么回事?

rn代码是这样的,要在vue页面获取到tokenvue中是这样写的,安卓9以上都能得到,就是8获取不到有没有大佬帮忙看看,跪谢!!!!

实时同步服务

1 实时同步应用场景通过rsync+定时任务实现定时备份/同步 对于NFS我们需要进行实时同步2 实时同步工具选型实时同步工具 特点 选型inotify工具+脚本inotify监控指定的目录,监控 目录下是否有变化,显示变化了的文件. 通过rsync服务端与客户端传送,书写脚本.不推荐,有性能问题.se…

五款免费报表工具推荐:山海鲸报表、Tableau 等优劣对比

在当今数据驱动的时代,报表工具已经成为各类企业进行决策和管理的重要工具。无论是大中型企业还是小微企业,能够快速、高效地生成可视化报表,洞察业务运营情况,已经成为提升竞争力的关键。今天为大家挑选了5款非常优秀的报表软件,并且详细分析了它们的优缺点,希望能够帮助…

DevExpress隐藏列表中显示的加号+

GridView1.OptionsDetail.EnableMasterViewMode = False

人大金仓kingbase部署

环境准备: 系统版本:CentOS Linux release 7.9.2009 (Core) 硬件配置:4C4G200G 安装包准备:KingbaseES_V008R006C008B0020_Lin64_install.iso https://www.kingbase.com.cn/xzzx/index.htmlicense准备:license_企业版.zip https://www.kingbase.com.cn/xzzx/index.htm计划…

从深海探测到海洋强国:数字孪生助力海洋装备跨越式发展

浮力调节系统作为涉及潜水的海洋设备的关键部件,能够为潜水器提供稳定悬浮的深度控制,并能根据工作深度的不同通过改变浮力来带动潜水器上浮或下潜。海洋广袤无垠,蕴藏着丰富的资源。近现代以来,人类使用各种手段探索海洋探索,广袤无垠的海洋与人类的生活越来越紧密,至少…

python - 分享绕过验证码登录的方法

一、通过webdriver启动浏览器:二、添加cookie:三、切换到目标地址: # This is a sample Python script. from selenium import webdriver import time # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for clas…