CSP-S 模拟赛 35

news/2024/10/7 13:14:26/文章来源:https://www.cnblogs.com/laoshan-plus/p/18449927

CSP-S 模拟赛 35

rnk14,\(45+45+15+18=123\)

T1 送花

愚蠢题。看到区间想到线段树,预处理出每个位置的颜色上一次出现的位置,记为 \(\mathit{las}_i\)。从左到右扫右端点,给 \([\max(1,\mathit{las}_{\mathit{las}_i}),\mathit{las}_i]\) 减去 \(d(c_i)\),给 \((\mathit{las}_i,i]\) 加上 \(d(c_i)\)。最后用全局最大值更新答案。搓一个区间加、维护全局最大值的线段树就可解决。

#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
#define lp p<<1
#define rp p<<1|1
#define mid ((s+t)>>1)
using namespace std;char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){int x=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}
template<typename T>
void write(T x,char sf='\n'){if(x<0)putchar('-'),x=~x+1;int top=0;do str[top++]=x%10,x/=10;while(x);while(top)putchar(str[--top]+48);if(sf^'#')putchar(sf);
}
using ll=long long;
constexpr int MAXN=1e6+5;
int n,m,c[MAXN],d[8005];
ll ans=LONG_LONG_MIN;
vector<int>v[8005];
int las[MAXN];
struct SegTree{ll c,lazy;
}st[MAXN<<2];
void pushdown(int p){if(!st[p].lazy)return;st[lp].c+=st[p].lazy;st[lp].lazy+=st[p].lazy;st[rp].c+=st[p].lazy;st[rp].lazy+=st[p].lazy;st[p].lazy=0;
}
void mdf(int l,int r,ll k,int s=1,int t=n,int p=1){if(l<=s&&t<=r)return st[p].c+=k,st[p].lazy+=k,void();pushdown(p);if(l<=mid)mdf(l,r,k,s,mid,lp);if(mid<r)mdf(l,r,k,mid+1,t,rp);st[p].c=max(st[lp].c,st[rp].c);
}int main(){freopen("flower.in","r",stdin);freopen("flower.out","w",stdout);n=read(),m=read();for(int i=1;i<=n;++i)c[i]=read();for(int i=1;i<=m;++i)d[i]=read();for(int i=1;i<=n;++i)v[c[i]].emplace_back(i);for(int i=1;i<=m;++i)for(int j=1;j<(int)v[i].size();++j)las[v[i][j]]=v[i][j-1];for(int i=1;i<=n;++i){if(las[i])mdf(max(1,las[las[i]]),las[i],-d[c[i]]);mdf(las[i]+1,i,d[c[i]]);ans=max(ans,st[1].c);}return write(ans),fw,0;
}

T2 星空

新鲜的计算几何题。(?

题目给定的这个 “直接距离” 特别的 bug,发现这样一来,所有位于直线 \((\forall b)~y=\pm x+b\) 的点的直接距离都是一样的。考虑将坐标轴逆时针旋转 45 度,这样原来的坐标 \((x,y)\) 会变成 \((x-y,x+y)\),且所有横/纵坐标相等的点的直接距离都相等。

处理出距离为零的那些点用并查集合并,然后将点分别按照 \(x,y\) 排序并找到最近点对,这就是第一问的答案。对于第二问,将所有的最近点加到一个数组中去重,最后就是其中任两者的并查集连通块大小乘积。

#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
using namespace std;char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch))ch=='-'&&(f=-1),ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
template<typename T>
void write(T x,char sf='\n'){if(x<0)putchar('-'),x=~x+1;int top=0;do str[top++]=x%10,x/=10;while(x);while(top)putchar(str[--top]+48);if(sf^'#')putchar(sf);
}
constexpr int MAXN=1e5+5;
int n;
struct Star{int x,y,id;
}a[MAXN];
int f[MAXN],siz[MAXN];
int find(int x){if(f[x]^x)f[x]=find(f[x]);return f[x];
}
void combine(int x,int y){int fx=find(x),fy=find(y);if(fx==fy)return;if(siz[fx]<siz[fy])swap(fx,fy);f[fy]=fx;siz[fx]+=siz[fy];
}
vector<pair<int,int>>edge;int main(){freopen("sky.in","r",stdin);freopen("sky.out","w",stdout);n=read();for(int i=1,xx,yy;i<=n;++i){xx=read(),yy=read();a[i]={xx-yy,xx+yy,i};f[i]=i,siz[i]=1;}sort(a+1,a+n+1,[&](Star x,Star y){return x.x^y.x?x.x<y.x:x.y<y.y;});int ans=INT_MAX,ans2=0;for(int i=1,j;i<=n;++i){j=i+1;while(j<=n&&(a[i].x==a[j].x||a[i].y==a[j].y)){combine(a[i].id,a[j].id);++j;}if(j<=n)ans=min(ans,a[j].x-a[i].x);}sort(a+1,a+n+1,[&](Star x,Star y){return x.y^y.y?x.y<y.y:x.x<y.x;});for(int i=1,j;i<=n;++i){j=i+1;while(j<=n&&(a[i].x==a[j].x||a[i].y==a[j].y)){combine(a[i].id,a[j].id);++j;}if(j<=n)ans=min(ans,a[j].y-a[i].y);}for(int i=1,j;i<=n;++i){j=i+1;while(j<=n&&(a[i].x==a[j].x||a[i].y==a[j].y))++j;if(j<=n&&a[j].y-a[i].y==ans){int fx=find(a[i].id),fy=find(a[j].id);if(fx>fy)swap(fx,fy);edge.emplace_back(fx,fy);}}sort(a+1,a+n+1,[&](Star x,Star y){return x.x^y.x?x.x<y.x:x.y<y.y;});for(int i=1,j;i<=n;++i){j=i+1;while(j<=n&&(a[i].x==a[j].x||a[i].y==a[j].y))++j;if(j<=n&&a[j].x-a[i].x==ans){int fx=find(a[i].id),fy=find(a[j].id);if(fx>fy)swap(fx,fy);edge.emplace_back(fx,fy);}}sort(edge.begin(),edge.end());edge.erase(unique(edge.begin(),edge.end()),edge.end());for(auto v:edge)ans2+=siz[v.first]*siz[v.second];write(ans),write(ans2);return fw,0;
}

T3 零一串

双端队列维护 \(0\)\(1\) 的位置。

对于每一个 \(1\) 处理一个长度为 \(T\) 的零一串,每一个 \(1\) 代表这个时刻能不能左移。

考虑如果第 \(i\)\(1\) 可以在 \(j\) 的时刻左移,如果第 \(i+1\) 个位置是紧邻的,那么它只能在 \(j+1\) 的时刻左移。反之如果不紧邻,则后面有几个 \(0\) 可以移几次。神秘差分维护。

#include<bits/stdc++.h>
#define int long long
using namespace std;constexpr int MAXN=5e6+5,MOD=998244353;
int T,n,pw[MAXN]={1};
string s;
int pos[MAXN],tot;
int cf[MAXN],dis[MAXN],sum[MAXN],ans[MAXN],ans2;
void add(int&x,int y){x=x+y>=MOD?x+y-MOD:x+y;
}signed main(){freopen("chuan.in","r",stdin);freopen("chuan.out","w",stdout);cin>>T>>s;for(int i=1;i<=T;++i)pw[i]=pw[i-1]*233%MOD;n=s.size();s=' '+s;for(int i=1;i<=n;++i)if(s[i]=='1')pos[++tot]=i;deque<int>q(T);iota(q.begin(),q.end(),1);for(int i=1,all=0;i<=tot;++i){++all;if(!q.empty()&&q.back()+all>T)q.pop_back();q.emplace_front(1-all);for(int j=1;!q.empty()&&j<=pos[i]-pos[i-1]-1;++j){++cf[q.front()+all];--cf[min(tot-i+q.front()+all+1,T+1)];q.pop_front();}dis[i]=T-q.size();ans[pos[i]-dis[i]]=1;}int nxd=0,num=0;for(int i=1;i<=n;++i)if(s[i]=='1')++num;else add(nxd,num);ans2=nxd;for(int i=1;i<=T;++i){sum[i]=(sum[i-1]+cf[i])%MOD;add(nxd,sum[i]);ans2^=pw[i]*nxd%MOD;}for(int i=1;i<=n;++i)cout<<ans[i];cout<<'\n'<<ans2<<'\n';return 0;
}

T4 Revive

唐。

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

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

相关文章

CSS盒子

1.width,height宽度高度。 <!DOCTYPE html> <html><head><title>Width Height</title><style type="text/css">body {font-family: Arial, Verdana, sans-serif;color: #111111;}div {width: 400px;height: 300px;background-co…

【Shiro】4.Springboot集成Shiro

https://blog.csdn.net/sco5282/article/details/134016549 前面已经学习了Shiro快速入门和缓存 。现在假定实际业务中需要完成以下功能: 1. 包含页面登录和首页。 2. 登录时需要连接数据库,完成登录认证和授权。 3. 登录时,密码需要加密。 4. 登录和授权信息能够缓存。 5. …

基于3peak 17串AFE芯片TPB76016-QP3R的电池BMS控制板方案

随着电动汽车、可再生能源存储设备以及便携式电子产品的普及,对高效、安全的电池管理系统(BMS)需求日益增加。17通道高精度电池管理产品—TPB76016,内置高精度基准,工作温度支持-40C to +125C,可广泛应用于动力电池、储能电池、以及其他消费类电池的BMS控制板。TPB76016-…

mysql登录遇到ERROR 1045问题解决方法

遇到 MySQL 登录时出现 ERROR 1045(访问被拒绝,用户名或密码错误),可以通过以下步骤来解决: 1. 确认用户名和密码检查用户名和密码:确认在连接数据库时输入的用户名和密码是否正确。 尝试在命令行中连接数据库,确认是否能成功登录:bashmysql -u your_username -p2. 重置…

网站提示连接数据库错误怎么解决

解决网站连接数据库错误通常需要检查以下几个方面:检查数据库连接参数确认数据库地址(hostname)、端口号、用户名和密码是否正确。 检查数据库名称是否正确。检查网络连接确保服务器与数据库之间的网络连通性正常。 如果是在云环境中,检查安全组设置或防火墙规则是否允许从…

验证码绕过爆破

验证码绕过爆破 图片验证码绕过 方法一、插件 xiapao 下载地址:https://github.com/smxiazi/NEW_xp_CAPTCHA/releases/tag/4.2 需要 python3.6 的环境来启动 sercer.py 服务,下载 python3.6 安装包,选择路径进行安装(不需要配置环境变量),然后再 pycharm 中打开文件,配置…

react 知识点汇总(非常全面)

React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并维护。它的核心理念是“组件化”,即将用户界面拆分为可重用的组件。 React 的组件通常使用 JSX(JavaScript XML)。JSX 是一种 JavaScript 语法扩展,允许开发者在 JavaScript 代码中编写类似 HTML 的结构。…

大核注意力机制

一、本文介绍 在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv8,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,它主要通过将深度卷积层的2D卷积核分解为水平和垂直1D卷积核,减少了计算复杂性和内存占用。接着,我们介绍将这一机制…

2024熵密杯wp

第一部分:初始谜题这一部分算是开胃菜,形式也更像平时见到的CTF题目,三个题目都是python加密的,做出其中任意一个就可以进入第二部分,也就是一个更类似真实情境的大型密码渗透系统。但每个初始谜题都是有分数的,所以就算开了第二部分也当然要接着做。每个题目也都有前三血…

2024高校网络安全管理运维赛 wp

0x00 前言本文是关于“2024高校网络安全管理运维赛”的详细题解,主要针对Web、Pwn、Re、Misc以及Algorithm等多方向题目的解题过程,包含但不限于钓鱼邮件识别、流量分析、SQLite文件解析、ssrf、xxe等等。如有错误,欢迎指正。0x01 Misc签到给了一个gif,直接在线分帧得到syn…