ABC396(VP)

本来明天有活动,晚上 VP 了一场 abc 找找手感,结果活动取消了(。

额,算了一下,大概是 rk.730 左右,打了就是上分局。

A - Triple Four

按照题目模拟即可。

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=105;
int n,a[N];
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i+2<=n;i++){if(a[i]==a[i+1]&&a[i+1]==a[i+2]){printf("Yes\n");return 0;}}printf("No\n");return 0;
}

时间复杂度 \(O(n)\)

B - Card Pile

按照题目模拟即可。

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=305;
int n,stk[N],top;
int main(){cin>>n;for(int i=1;i<=n;i++)stk[++top]=0;for(int i=1;i<=n;i++){int o,x;cin>>o;if(o==1){cin>>x;stk[++top]=x;}else{cout<<stk[top--]<<endl;}}return 0;
}

时间复杂度 \(O(n)\)

C - Buy Balls

扫码特判。

假设黑球中选择了 \(a\) 个数,白球中选了 \(b\) 个数(\(a>b\))。则最优方案一定是黑球中最大的 \(a\) 个和白球中最大的 \(b\) 个,所以我们按照从大到小的顺序排序后,取出的分别是两个序列的前缀。

假设 \(k\) 为黑球中排序后最后一个正数的位置,显然,如果选择了 \(k\) 这个位置之后的球,方案总权值会越来越小,所以尽量不选,除非 \(b>k\)(这种情况必须满足要求)。

所以我们排序,求出前缀和和 \(k\) 后,枚举 \(b\),若 \(b\le k\),则选择黑球中前 \(k\) 个和白球中前 \(b\) 个。否则,选择黑球和白球中的前 \(b\) 个。

需要注意,白球可以选择 \(0\) 个。

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll n,m,a[N],b[N],ans,sum,res;
int k;
bool cmp(ll a,ll b){return a>b;
}
int main(){scanf("%lld %lld",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",a+i);for(int i=1;i<=m;i++)scanf("%lld",b+i);sort(a+1,a+1+n,cmp);sort(b+1,b+1+m,cmp);for(int i=1;i<=n;i++)a[i]+=a[i-1];for(int i=1;i<=m;i++)b[i]+=b[i-1];for(int i=2;i<=n;i++)if(a[k]<a[i])k=i;ans=a[k];for(int i=1;i<=min(n,m);i++)ans=max(ans,b[i]+a[max(k,i)]);printf("%lld\n",ans);return 0;
}

时间复杂度 \(O(n)\)

D - Minimum XOR Path

D 在 C 之前过的。

注意到 \(n\le 10\),“每个点不重复经过”,考虑搜索。

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=15;
typedef long long ll;
ll w[N][N],ans=2e18;
int n,m,mk[N];
void dfs(int x,ll sum){if(x==n){ans=min(ans,sum);return;}for(int i=1;i<=n;i++){if(!mk[i]&&w[x][i]!=-1){mk[i]=1,dfs(i,sum^w[x][i]),mk[i]=0;}}return;
}
int main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)w[i][j]=-1;for(int i=1;i<=m;i++){int u,v;ll val;scanf("%d %d %lld",&u,&v,&val);w[u][v]=w[v][u]=val;}mk[1]=1;dfs(1,0ll);cout<<ans<<endl;return 0;
}

时间复杂度 \(O(n!)\)

E - Min of Restricted Sum

嗯嗯嗯,这题就有意思了。

位运算题经典套路拆位。因为各个位之间互相运算不影响,所以我们对 \(A_i,Z_i\) 的每一位分开讨论。让 \(\sum A_i\) 最小,就是让每一位中,\(1\) 的个数最少。

把这个东西简化成子问题,就是给 \(n\)\(01\) 变量 \(A_i\),给定 \(m\) 对关系,每个关系形如 \(A_x\)\(A_y\) 相等/不相等。求得一种方案,最小化变量 \(A\)\(1\) 的个数。

看起来有点像扩展域并查集?我们考虑将所有变量分为两个集合,两个变量相等划分在同一集合,两个变量不相等划分在不同集合。然后将较小集合中的所有变量赋值为 \(1\),另一个集合中的元素赋值为 \(0\)

然后就做完了?为了方便处理,我们考虑二分图染色,并维护左部点和右部点集合(可以用 vector)。注意到二分图不一定联通,所以我们对每一个联通块都进行上述算法,如果有一个二分图不是联通块,则无解(同理,若有一位无解,则整个问题无解)。

点击查看代码
#include <iostream>
#include <cstdio>
#include <vector>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int N=2e5+10;
int n,m,x[N],y[N],z[N],a[N],col[N];
vector<int>u,v;
vector<pii>G[N];
void add(int now,int nxt,int val){G[now].push_back(mp(nxt,val));
}
bool dfs(int now,int co){col[now]=co;if(co==1)u.push_back(now);else v.push_back(now);for(auto [nxt,val]:G[now]){if(!col[nxt]){if(val&&dfs(nxt,3-co))return 1;else if(!val&&dfs(nxt,co))return 1;}else{if(val&&col[nxt]==col[now])return 1;else if(!val&&col[nxt]!=col[now])return 1;}}return 0;
}
bool solve(int k){for(int i=1;i<=m;i++){int c=((z[i]>>k)&1);add(x[i],y[i],c);add(y[i],x[i],c);}for(int i=1;i<=n;i++){if(!col[i]){if(dfs(i,1))return 1;else{if(u.size()>v.size())swap(u,v);for(auto p:u)a[p]|=(1<<k);u.clear(),v.clear();}}}for(int i=1;i<=n;i++)G[i].clear(),col[i]=0;return 0;
}
int main(){scanf("%d %d",&n,&m);for(int i=1;i<=m;i++)scanf("%d %d %d",x+i,y+i,z+i);for(int k=0;k<=30;k++){if(solve(k)){printf("-1\n");return 0;}}for(int i=1;i<=n;i++)printf("%d ",a[i]);return 0;
}

时间复杂度 \(O(n\log V)\),其中 \(V\) 是值域。

F - Rotated Inversions

看上去很难,实际上很简单的问题。下文称状态 \(x\) 为当 \(k=x\) 时的 \(B\)

首先 \(x=0\) 的情况可以暴力求。然后对于任意 \(x\ge 1\),我们求出状态 \(x\) 相对于状态 \(x-1\) 的贡献。

如果我们不看 \(A_i+x\bmod m=0\) 的这些位置 \(i\),则容易发现其他数对没有产生任何逆序对贡献(因为相对之间的大小没有改变)。而这些位置 \(i\) 之间也不会产生贡献。

我们考虑这些位置在状态 \(x-1\) 中的逆序对贡献和 \(x\) 中的逆序对贡献,减去前者加上后者即为所求。

因为 \(A_i+x\bmod m=0\),所以 \(A_i+x-1\bmod m=m-1\),即 \(i\) 在状态 \(x-1\) 是最大的数,所以 \(i\) 前面的数不可能和他构成逆序对,而 \(i\) 后面不和它相等的一定会构成逆序对(因为此时 \(B_i\) 最大)。同理可知,因为在状态 \(x\) 中,位置 \(i\) 是值最小的位置,所以它后面的任何数不可能和他构成逆序对,而 \(i\) 前不和它相等的一定会构成逆序对。

所以我们只需要求出每个数前后各有多少数和他不相等即可,用一个桶即可做到 \(O(n)\)。初始状态的逆序对数可以通过树状数组来求。

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll n,m,ans[N],t[N],a[N],c[N];
void add(int x,int v){x++;for(;x<=m+1;x+=(x&-x))c[x]+=v;return;
}
ll ask(int x){ll cnt=0;x++;for(;x>0;x-=(x&-x))cnt+=c[x];return cnt;
}
int main(){scanf("%lld %lld",&n,&m);for(int i=1;i<=n;i++){scanf("%lld",a+i);ans[0]+=i-1-ask(a[i]);add(a[i],1);}for(int i=1;i<=n;i++)ans[m-a[i]]+=i-1-t[a[i]];for(int i=0;i<=m;i++)t[i]=0;for(int i=n;i>=1;i--)ans[m-a[i]]-=n-i-t[a[i]];printf("%lld\n",ans[0]);for(int i=1;i<m;i++){ans[i]+=ans[i-1];printf("%lld\n",ans[i]);}return 0;
}

时间复杂度 \(O(n\log n)\)

G - Flip Row or Col

未来有机会补吧。

好菜啊。

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

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

相关文章

DVWA-CSRF-Medium

用户admin/password 登陆,修改密码,并使用BP抓包使用smithy/password登陆,重放抓到的BP包,smithy 密码将被修改重点是确保Referer 的信息存在,且和admin/password 修改密码时使用的一致代码审计:通过代码可以看出,如果在Referer中找到服务器名称才会执行参数修改工作,因…

C++继续学习2025_练习

课堂练习题3月15练习题 完善程序,输入到计算机运行,得到要求的结果。 1、编程序输出如图所示的图形。11111222223333344444#include <iostream> using namespace std; int main() {int i, j;for(i=1;____;i++){for(j=1;_______;j++)cout<<________;cout <<…

web41笔记(eval命令执行+过滤了数字和字⺟(因为后⾯/i对⼤⼩写不敏感),并且不能⽤异或、取反、⾃增等操作(过滤$、+、-、^、~),但是可以⽤|(或))

<?php/* # -*- coding: utf-8 -*- # @Author: 羽 # @Date: 2020-09-05 20:31:22 # @Last Modified by: h1xa # @Last Modified time: 2020-09-05 22:40:07 # @email: 1341963450@qq.com # @link: https://ctf.show*/if(isset($_POST[c])){$c = $_POST[c]; if(!preg_mat…

快速沃尔什变换CF662C

FWT 快速沃尔什变换(FWT)是解决位运算卷积问题,即给定序列 \(a,b\),求序列 \(c\) 满足\(c_i=\sum_{i=j\oplus k}A_j\times B_k\),其中 \(\oplus\) 为一种位运算符号[1]。 因为本文是讲题的前置,所以这里只讲异或卷积,也是最难的一个。 规定 \(popcnt(x)\) 为 \(x\) 二进…

VMware中安装CentOS7

转自:https://www.cnblogs.com/javaxubo/p/18455425 centos7下载地址:https://mirrors.aliyun.com/centos/7/isos/x86_64/ 1、打开“VMware Workstation“软件,选择”创建新的虚拟机2、选择“典型”选项,然后下一步。3、选择“稍后安装操作系统”,点击下一步。4、客户机操…

3.14日报

所花时间:8h 代码量(行):220 博客量:6 了解到的知识点: 计算机网络:早上详细讲解了链路层部分,三个基本问题:封装成帧,透明传输,差错检测。 其中着重讲解了有关计算的二进制序列,随堂练习更是一半的计算 然后就是下午的软件测试 要做一个地铁售票

使用fastapi部署网页模板

背景 如果你想快速实现一个网站的前后端的部署,那么现成的站点模板是必须的,如果我们使用nginx做反向代理可以实现部署静态网站,如果我想相对请求或者页面有一些更新,那么就需要用到后端框架,这里我们使用fastapi去代理静态资源同时将模板的请求根据我们的需求进行动态的返…

第四周第五天

所用时间:270分钟 代码量(行):174 博客量(篇):1 了解到的知识点: 1.课堂测试 编写了简单的地铁购票系统app,实现了按站计算购票费用,将项目打包为apk后再手机端运行成功 学习了如何将项目打包为apk文件,如下图所示2.计算机网络

Apache Tomcat RCE漏洞复现(CVE-2025-24813)

今日官方披露 Apache Tomcat partial PUT文件上传反序列化漏洞。在 CVE-2025-24813 中tomcat开启文件会话持久化,攻击者可利用PUT上传文件,并构造恶意请求触发session文件反序列化。漏洞描述 该漏洞的核心在于不完整PUT请求上传时 Tomcat 会使用了一个基于用户提供的文件名和…

SparkSubmit提交任务到yarn及报错解决方案

SparkSubmit提交任务到yarn及报错解决方案@目录一、提交任务代码二、Linux提交可能出现的问题及解决方案情况1:JSON解析异常情况2:java.lang.InstantiationException spark.sql.driver情况3 中kafka:java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Cal…

线程异步处理任务

实际开发中,service层可能会执行多个步骤,那有些步骤可能和主任务没有太大关联,那我们可以采用线程去处理,这样就提高响应速度,当然也可以采用MQ,此处介绍的是用线程处理 1、controller层@GetMapping("/thread")public void thread(){demo1Service.process();}…

08. 通用定时器

一、什么是通用定时器ESP32 S3 芯片配备了两个通用定时器组,每组均包含两个通用定时器和一个主系统看门狗定时器。每个通用定时器都具备多个通道。通过明确指定定时器号和通道号,用户可以精准地选定所需的定时器和通道。每个定时器均支持独立编程,并且具备微秒级的精确时间中…