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
未来有机会补吧。
好菜啊。
ABC396(VP)的更多相关文章
- Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化
Android MVP粗来已经有段时间了,在项目中我也多多少少用了一些,不得不说代码使用这种模式后,条例确实清晰了好多,整个流程看起来有点各司其职的感觉(另一种的java面向对象的方式). 不过这里是 ...
- 互联网金融必须知道:O2O、P2P、MRD、BRD、LBS、PV、UV、KPI、MRD、VP、UED....
进入互联网的朋友们和身为互联网业内人士,你们知道有多少专业术吗?有时候专业术语也是一种逼格.商业需求文档,市场需求文档,产品需求文档,功能详细说明文档,华丽丽的各种文档你知道吗?用户体验,用户界面,用 ...
- 加盟阿里!贾扬清被曝从Facebook离职,任阿里硅谷研究院VP
3 月 2 日傍晚,知乎上爆出一则 AI 人事变动大消息——Caffe 作者贾扬清将从 Facebook 离职. 短短数小时,就有近 10 万人浏览这个问题.不仅如此,据 AI 前线爆料,贾扬清离开 ...
- vp uml uninstall
1◆ vp uml uninstall D:\devsoft\ultimate\idea\plugins\sdeIJ D:\devsoft\ultimate\idea\bin\sde ...
- C#调用VP 包含素材
VS2012 +VP9.0 ***************** 自己运行的时只要修改VP里面素材的路径即可 链接: https://pan.baidu.com/s/1J6Bc5FcBYLZLgqe30 ...
- 4星|《情感驱动》:可口可乐营销VP的案例回顾与经验总结
情感驱动 作者是西班牙人,1963年出生,可口可乐前营销VP. 作者大学是法律专业,毕业后5年,在西班牙开了一个律师事务所,干了1年后去读MBA.1988年进入宝洁工作,1996年跳槽到可口可乐,辗转 ...
- [转]谈谈关于MVP模式中V-P交互问题
在差不多两年的时间内,我们项目组几十来号人都扑在一个项目上面.这是一个基于微软SCSF(Smart Client Software Factory)的项目,客户端是墨尔本一家事业单位.前两周,我奉命负 ...
- Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填
我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...
- Codeforces696 Round #362 (Div. 1)(vp) A~D题解
很久没有打比赛了,内部模拟赛天天垫底,第一次vp之旅又是和**一样,这样下去GDOI之后直接退役算了 整场都在忘开LL A. Lorenzo Von Matterhorn 这个题一看我就想直接虚树+树 ...
- [日常] SNOI2019场外VP记
SNOI2019场外VP记 教练突然说要考一场别省省选来测试水平...正好还没看题那就当VP咯w... Day 1 八点开题打 .vimrc. 先看了看题目名...一股莫名鬼畜感袭来... 怎么T1就 ...
随机推荐
- python,批量修改文件后缀名
比如,D盘test目录下有以下几个没有后缀的文件,需要修改为txt结尾 python代码如下 # python批量更换后缀名 import os import sys #需要修改后缀的文件目录 os. ...
- windows10环境下,remote wsl链接wsl ubuntu使用ubuntu 开发环境,报错:VS Code server for WSL closed unexpectedly check WSL terminal for more details
报错提示这样 在windows的vscode里面的关键报错信息是:vscode wsl Unable to detect if server is already installed: Error: ...
- kettle介绍-Step之Abort
Abort中止介绍 中止步骤用于读取指定行数之后停止读取剩余行数,可以用于调试转换 Step Name:步骤的名称,在单一的转换中,名称必须唯一 Abort threshold:指定行数,转换读取到指 ...
- Java--Calendar类,Date类的简单使用,日期的格式化
package demo; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; / ...
- 代码随想录第二十七天 | Leecode 455. 分发饼干、 376. 摆动序列、 53. 最大子数组和
Leecode 455. 分发饼干 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干. 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的 ...
- 如何把ASP.NET Core WebApi打造成Mcp Server
前言 MCP (Model Context Protocol)即模型上下文协议目前不要太火爆了,关于它是什么相信大家已经很熟悉了.目前主流的AI开发框架和AI工具都支持集成MCP,这也正是它的意义所在 ...
- 【从0到1800 Star】90天,我用0预算推广了一个C语言项目
亲爱的朋友们,我想和你们分享一下这90多天的开发旅程,虽然不涉及具体的技术部分,但我相信这些经验对你的项目会有所帮助哦 Catime是如何在大约90天内从0做到1800+ star的呢?其中最主要的原 ...
- 手把手教你使用C#创建一个WebSearchAgent
PocketFlowSharp介绍 最近我对PocketFlow比较感兴趣,不仅是因为它是一个极简的LLM框架,更加让我觉得很不错的地方在于作者提供了很多方便学习的例子,就算没有LLM应用开发经验,也 ...
- 通过tushare获取k线数据
tushare中get_k_date接口主要目的是获取k线数据,该接口融合了get_hist_data和get_h_data两个接口的功能,即能方便获取日周月的低频数据,也可以获取5.15.30和60 ...
- 9 easybr指纹浏览器https代理认证教程
目的 在高匿名浏览环境中,代理是关键组件之一.相比普通 HTTP 代理,HTTPS 代理(HTTP over TLS) 支持加密传输,在保障隐私.防止中间人攻击方面更具优势. Chromium 浏览器 ...