A - Conflict

输出Yes\(\iff\)存在\(t[i]\)和\(a[i]\)同时为o

时间复杂度\(O(1)\)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
string t,a;
bool check(){
for(int i=0;i<n;i++) if(t[i]=='o'&&a[i]=='o') return 1;
return 0;
}
signed main(){
cin>>n>>t>>a;
cout<<(check()?"Yes\n":"No\n");
return 0;
}

B - Citation

显然答案\(\in[0,n]\),枚举验证即可。时间复杂度\(O(n^2)\)。

点击查看代码
#include<bits/stdc++.h>
#define N 105
using namespace std;
int n,a[N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;~i;i--){
int cnt=0;
for(int j=1;j<=n;j++){
cnt+=(a[j]>=i);
}
if(cnt>=i) cout<<i,exit(0);
}
return 0;
}

发现答案有单调性,也可以二分做到\(O(n\log n)\)。

C - Equilateral Triangle

首先\(L\bmod 3\neq 0\)的话直接输出No

然后用一个桶数组记录下每个位置的点数量,然后遍历形如\((i,i+\frac{L}{3},i+\frac{2L}{3})\)的三元组统计答案即可。

时间复杂度\(O(n+L)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 300010
using namespace std;
int n,l,d,cur,t[N],ans;
signed main(){
cin>>n>>l,t[0]=1;
for(int i=1;i<n;i++) cin>>d,(cur+=d)%=l,t[cur]++;
if(l%3) cout<<0,exit(0);
for(int i=0;i<l/3;i++)
ans+=t[i]*t[i+l/3]*t[i+l/3*2];
cout<<ans<<"\n";
return 0;
}

D - String Rotation

显然可以贪心。找到最小的\(i\)使得\(s[i]>s[i+1]\),然后将\(s[i]\)取出,放在最小的\(j\)使得\(s[j]>s[i]\)之前。

若找不到这样的\(j\)就把\(s[i]\)放在最后面;若找不到这样的\(i\)则直接原样输出。

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

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int t,n;
string s;
signed main(){
cin>>t;
while(t--){
cin>>n>>s;
bool f=0;
for(int i=0;i<n-1;i++){
if(s[i]>s[i+1]){
for(int j=0;j<i;j++) cout<<s[j];
bool flg=0;
for(int j=i+1;j<n;j++){
if(!flg&&s[j]>s[i]) flg=1,cout<<s[i];
cout<<s[j];
}
if(!flg) cout<<s[i];
cout<<"\n";
f=1;
break;
}
}
if(!f) cout<<s<<"\n";
}
return 0;
}

E - Pair Annihilation

单独考虑一条边对答案的贡献,任何一条边\((u,v,w)\)连接的\(2\)个部分的总和\(S\)和\(S'\)一定互为相反数,对答案至少有\(|S|*w\)的贡献。

因此只要电荷的移动不走回头路,就不存在冗余操作,答案就是最优的。

我们可以从叶节点开始逐层向上转移,转移的途中统计答案,到根节点就算结束,类似拓扑排序。

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

点击查看代码
#include<bits/stdc++.h>
#define N 100010
#define int long long
using namespace std;
int n,x[N],deg[N],ans;
struct edge{int to,w;};
vector<edge> G[N];
queue<int> q;
void add(int u,int v,int w){G[u].emplace_back(edge{v,w}),deg[u]++;}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i];
for(int i=1,u,v,w;i<n;i++) cin>>u>>v>>w,add(u,v,w),add(v,u,w);
for(int i=1;i<=n;i++) if(deg[i]==1) q.push(i);
while(!q.empty()){
int u=q.front();
q.pop();
for(auto i:G[u]){
int v=i.to,w=i.w;
if(!deg[v]) continue;
deg[u]--,deg[v]--;
ans+=abs(x[u])*w,x[v]+=x[u];
if(deg[v]==1) q.push(v);
}
}
cout<<ans<<"\n";
return 0;
}

F - Connecting Points

用并查集来维护连通性,并使用优先队列来选择距离最小的点对。

  • 对于操作\(1\),遍历之前所有的点\(v\),把它们和新点\(u\)的距离\(d\)以\((u,v,d)\)的形式扔进优先队列。
  • 对于操作\(2\),从队列中取出第一个\((u,v,d)\)使得\(u,v\)不在同一个连通块中。
    • 若找不到,则输出-1
    • 若能找到,则继续在队列中找所有\((u',v',d)\),将\(u'\)和\(v'\)在并查集上合并。
  • 对于操作\(3\),看看\(u,v\)是否处于并查集的同一集合中即可。

时间复杂度\(O((n+q)^2\log (n+q)^2)=O((n+q)^2\log (n+q))\)。

点击查看代码
#include<bits/stdc++.h>
#define N 1505
#define Q 1505
#define int long long
using namespace std;
struct Node{
int d,u,v;
bool operator < (const Node&x) const{return x.d<d;}
};
priority_queue<Node> q;
int n,tq,x[N+Q],y[N+Q],idx,fa[N+Q];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int dis(int i,int j){return abs(x[i]-x[j])+abs(y[i]-y[j]);}
void ins(int _x,int _y){
x[++idx]=_x,y[idx]=_y,fa[idx]=idx;
for(int i=1;i<idx;i++) q.push({dis(i,idx),i,idx});
}
signed main(){
cin>>n>>tq;
for(int i=1,x,y;i<=n;i++) cin>>x>>y,ins(x,y);
while(tq--){
int op,a,b;
cin>>op;
if(op==1){
cin>>a>>b;
ins(a,b);
}else if(op==2){
int k=-1;
while(!q.empty()){
Node t=q.top();
if((~k)&&k!=t.d) break;
q.pop();
if(find(t.u)==find(t.v)) continue;
if(k==-1) k=t.d;
if(k!=t.d) continue;
else fa[find(t.u)]=find(t.v);
}
cout<<k<<"\n";
}else{
cin>>a>>b;
cout<<(find(a)==find(b)?"Yes\n":"No\n");
}
}
return 0;
}

[题解] AtCoder Beginner Contest 409(ABC409) A~F的更多相关文章

  1. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

  2. 【AtCoder Beginner Contest 181】A~F题解

    越学越菜系列 于2020.11.2,我绿了(错乱) A - Heavy Rotation 签到题,奇数Black,偶数White. code: #include<bits/stdc++.h> ...

  3. AtCoder Beginner Contest 127 D,E,F

    D Integer Cards 题意:先给出n个数字,然后可以有m次操作,每次操作以数字对(x,y)表示最多能选x个数字把它变成y,问经历m次操作后n个数字和最大为多少? 解法:一个明显正确的做法是: ...

  4. [题解] Atcoder Beginner Contest ABC 270 G Ex 题解

    点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...

  5. [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT

    题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...

  6. AtCoder Beginner Contest 238 A - F 题解

    AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...

  7. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  8. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  9. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  10. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

随机推荐

  1. github无法访问问题解决方法

    问题描述: 直接使用gtihub.com网址访问github浏览器无响应. 解决办法: 1.登录https://github.com.ipaddress.com/去查询github.com.githu ...

  2. 洛谷 P3386 【模板】二分图最大匹配

    匈牙利算法博大精深,这里只记录步骤. 当然,不知道这些基础图论的童鞋请看这里(虽然也是草草概括一下谔谔谔) 主要步骤 \(main\) 主函数里面一个枚举现在正在匹配的左点 对于每个准备匹配的左点,进 ...

  3. [转]编译报错:virtual memory exhausted: Cannot allocate memory

    一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩 ...

  4. Flask之model以及缓存

    Flask默认并没有提供任何数据库操作的API. Flask中可以自己的选择数据,用原生语句实现功能,也可以选择ORM(SQLAlchemy,MongoEngine)原生SQL缺点 代码利用率低,条件 ...

  5. python 获取mac地址

    python 获取mac地址 方法一:使用socket库 使用了socket库中的ioctl函数和fcntl模块来获取MAC地址 import socket import fcntl import s ...

  6. mysql字符集插入中文报错

    org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: java.sql.SQLE ...

  7. 基于Modbus TCP的MCGS上位机软件教程

    1.概述 ZLAN5143D 是一款专门为工业环境设计的RS485设备数据采集器/物联网网关,兼具串口服务器.Modbus网关.MQTT网关.RS485转JSON等多种功能于一体.如图 1所示 图 1 ...

  8. leetcode 53 最大自序列和

    简介 暴力只要变量两遍, 挺好的, 不过更好的应该是动态规划. 应该是最简单的动态规划了吧 code class Solution { public: int maxSubArray(vector&l ...

  9. 匈牙利算法C++实现

    简介 一般场景是男生和女生配对的问题,现有男生要去配对如果想去配对的女生已经有喜欢的男生了,那就让想去配对的女生已经喜欢的男生挪挪位置,看看想去配对的女生已经喜欢的男生能不能喜欢其他人,给现有配对的男 ...

  10. Avalonia硬配.NET Framework 4.8

    Warning:这种方法能保证运行初始项目,但至于有没有什么其他问题我就不知道了,根据Avalonia官网的说法,Avalonia基于.NET Standard 2.0构建,该标准涵盖从.NET Fr ...