本来明天有活动,晚上 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)的更多相关文章

  1. Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化

    Android MVP粗来已经有段时间了,在项目中我也多多少少用了一些,不得不说代码使用这种模式后,条例确实清晰了好多,整个流程看起来有点各司其职的感觉(另一种的java面向对象的方式). 不过这里是 ...

  2. 互联网金融必须知道:O2O、P2P、MRD、BRD、LBS、PV、UV、KPI、MRD、VP、UED....

    进入互联网的朋友们和身为互联网业内人士,你们知道有多少专业术吗?有时候专业术语也是一种逼格.商业需求文档,市场需求文档,产品需求文档,功能详细说明文档,华丽丽的各种文档你知道吗?用户体验,用户界面,用 ...

  3. 加盟阿里!贾扬清被曝从Facebook离职,任阿里硅谷研究院VP

    3 月 2 日傍晚,知乎上爆出一则 AI 人事变动大消息——Caffe 作者贾扬清将从 Facebook 离职. 短短数小时,就有近 10 万人浏览这个问题.不仅如此,据 AI 前线爆料,贾扬清离开 ...

  4. vp uml uninstall

    1◆ vp uml uninstall D:\devsoft\ultimate\idea\plugins\sdeIJ         D:\devsoft\ultimate\idea\bin\sde ...

  5. C#调用VP 包含素材

    VS2012 +VP9.0 ***************** 自己运行的时只要修改VP里面素材的路径即可 链接: https://pan.baidu.com/s/1J6Bc5FcBYLZLgqe30 ...

  6. 4星|《情感驱动》:可口可乐营销VP的案例回顾与经验总结

    情感驱动 作者是西班牙人,1963年出生,可口可乐前营销VP. 作者大学是法律专业,毕业后5年,在西班牙开了一个律师事务所,干了1年后去读MBA.1988年进入宝洁工作,1996年跳槽到可口可乐,辗转 ...

  7. [转]谈谈关于MVP模式中V-P交互问题

    在差不多两年的时间内,我们项目组几十来号人都扑在一个项目上面.这是一个基于微软SCSF(Smart Client Software Factory)的项目,客户端是墨尔本一家事业单位.前两周,我奉命负 ...

  8. Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填

    我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...

  9. Codeforces696 Round #362 (Div. 1)(vp) A~D题解

    很久没有打比赛了,内部模拟赛天天垫底,第一次vp之旅又是和**一样,这样下去GDOI之后直接退役算了 整场都在忘开LL A. Lorenzo Von Matterhorn 这个题一看我就想直接虚树+树 ...

  10. [日常] SNOI2019场外VP记

    SNOI2019场外VP记 教练突然说要考一场别省省选来测试水平...正好还没看题那就当VP咯w... Day 1 八点开题打 .vimrc. 先看了看题目名...一股莫名鬼畜感袭来... 怎么T1就 ...

随机推荐

  1. 解决C盘根目录不能创建文件,只能创建文件夹问题

    转载:https://blog.csdn.net/xinke453/article/details/7496545 解决方法 用管理员运行cmd 输入 icacls c:\ /setintegrity ...

  2. 【笔记】PyVis|神经网络数据集的可视化

    文章目录 版本: 应用实例: PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列结点`add_nodes`: 三.添加边 ...

  3. LangChain4j比SpringAI强在哪?一文读懂

    LangChain4j 和 Spring AI 是 Java 生态中实现大模型应用开发的两个最重要的框架,但二者的区别是啥?生产级别又该使用哪种框架?令很多人犯了难,所以本文就来浅聊一下,希望给大家在 ...

  4. 完整版QQ(腾讯)开放平台操作指南(包含:qq登录能力获取等等)

    之前我和大家提过,我要购买第三方的APP服务,就相当于有自己的APP了,现在APP对接上线之前需要做大量的准备工作,在此把步骤分享给大家,这样可以节省大家很多时间. 完整版QQ(腾讯)开放平台操作指南 ...

  5. 智表ZCELL专业版授权说明

    专业版: 1.智表专业版按照部署地址授权,价格1680元.(IP或域名均可,授权时localhost会同步授权) 2.授权版本为智表专业版最新版本,不提供历史版本授权.授权为插件使用权,不提供源码. ...

  6. sqlalchemy多对多关联

    sqlalchemy_many_to_many.py #!-*-coding:utf-8-*-from sqlalchemy import Table,Column,Integer,String,DA ...

  7. css——慕课

  8. QQ会员首页HTML+CSS

    作为一个穷人,唯一一次逛这么久的会员首页还是因为要写最头大的web~苦涩 效果图 源码 <!DOCTYPE html> <html> <head> <meta ...

  9. 【多线程】Java多线程与并发编程全解析

    Java多线程与并发编程全解析 多线程编程是Java中最具挑战性的部分之一,它能够显著提升应用程序的性能和响应能力.本文将全面解析Java多线程与并发编程的核心概念.线程安全机制以及JUC工具类的使用 ...

  10. Manim动画渲染:从代码到屏幕的幕后故事

    Manim是一个强大的动画制作库,它能够将简单的Python代码转化为精美的动画视频. 你是否好奇过,当你运行Manim代码时,背后的魔法是如何发生的呢? 今天,将重点介绍渲染过程中的三个关键步骤:S ...