Atcoder Beginner Contest 367
A.Shout Everyday \(\text{Diff }43\)
给你 \(24\) 小时制下的 \(A,B,C\) 三个时刻,问 \(A\) 是否在 \([B,C]\) 范围内
考虑到先将 \(B,C\) 加上一个 \(24\),假如 \(C\) 比 \(B\) 小,将 \(C\) 再加上一个 \(24\),这样可以保证严格的 \(A\lt B,C\),此时直接判断是否存在一个 \(k\),使得 \(A+24k\in[B,C]\) 即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
if(c<b) c+=24;
while(a<=c){
// cout<<a<<" in "<<b<<" "<<c<<endl;
if(a>=b and a<=c){
cout<<"No"<<endl;
return 0;
}
a+=24;
}
cout<<"Yes"<<endl;
}
B.Cut .0 \(\text{Diff }43\)
给定一个小数,去除多余的后导零或小数点
比第一题水,不说了
#include<bits/stdc++.h>
using namespace std;
int main(){
string x;
cin>>x;
for(int i=x.length()-1;i>=0;--i){
if(x[i]=='.'){
x.pop_back();
break;
}
if(x[i]!='0') break;
x.pop_back();
}
cout<<x<<endl;
}
C.Enumerate Sequences \(\text{Diff }234\)
按字典序输出所有满足条件的,长度为 \(N\) 的序列 \(A\)
- \(\forall A_{i}\in[1,R_{i}]\)
- \(\sum^{N}_{i=1}A_{i}\mod K=0\)
\(N\le 8,K\le 10,R_{i}\le 5\)
显然应该是爆搜
#include<bits/stdc++.h>
using namespace std;
int a[9];
int n,k;
int r[9];
void dfs(int now,int nowsum){
if(now>n){
if(nowsum%k==0){
for(int i=1;i<=n;++i){
cout<<a[i]<<" ";
}
cout<<endl;
}
return;
}
for(int i=1;i<=r[now];++i){
a[now]=i;
dfs(now+1,nowsum+i);
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;++i){
cin>>r[i];
}
dfs(1,0);
}
D.Pedometer \(\text{Diff }1037\)
顺时针给你一个环,告诉你环上各边的权值
定义 \(dis(x,y)\) 为从 \(x\) 顺时针走到 \(y\) 的路径长
请你求出所有满足 \(dis(u,v)\mod M=0\) 的点对数量
\(N\le 2\times 10^{5},M\le 10^{6}\)
显然不能每次都改变整个 \(dis\) 数组的值
首先先来模拟一下,先考虑暴力,每次枚举出发点,开一个数组 \(dis\) 用来表示从出发点到各点的距离,观察当出发点从 \(i\) 变成 \(i+1\) 的时候,\(dis\) 数组会如何变化
2 1 4 3
i dis
1 0 2 3 7
2 8 0 1 5
3 7 9 0 4
可以发现,每当我们将 \(i\) 向后移了一位,其实就相当于以下两步操作:
- 将 \(dis_{i}\) 加上总路径和(其实就是绕了一圈)
- 将整个 \(dis\) 数组减去 \(dis_{i+1}\)
发现第二步实际上是可以优化的,因为这道题是取模操作,方便我们优化. 注意到若 \(x\mod M=0\),则应该有 \((x-k)\mod M=M-(k\mod M)\),因此我们可以考虑直接根据这样的性质来转移余数而不是整个 \(dis\) 数组,这样这个题就做完了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,sum;
int a[200001],r[1000001],pres[200002],opres[200002];
signed main(){
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
sum+=a[i];
}
for(int i=1;i<=n-1;++i){
pres[i]=pres[i-1]+a[i];
opres[i]=pres[i];
r[pres[i]%m]++;
}
r[0]++;
int ans=0,rm=m,msum=0;
for(int i=1;i<=n;++i){
m+=opres[i]-msum;
msum+=pres[i]-msum;
r[pres[i==1?n:i-1]%rm]--;
pres[i==1?n:i-1]+=sum;
r[pres[i==1?n:i-1]%rm]++;
ans+=r[msum%rm];
}
cout<<ans-n<<endl;
}
E.Permute K times \(\text{Diff }1370\)
给定长度为 \(N\) 的序列 \(X,A\),其中 \(\forall x_{i}\in[1,N]\),对序列 \(A\) 执行 \(K\) 次下列操作:
- 同时将全部 \(A_{i}\) 赋值为 \(A_{X_{i}}\)
求最终的序列 \(A\)
\(N\le 2\times 10^{5},K\le 10^{18}\)
好题。
この問題は、 ダブリング と呼ばれるテクニックで解くことができます
我并不知道 ダブリング 是啥算法,但是我猜大抵是倍增罢
注意到我们每次在 \(A\) 数组上操作其实就相当于在 \(X\) 数组上操作,因此我们暂时抛开 \(A\) 数组不管
又注意到 \(X\) 数组上的转移是有传递性的,比如两次操作后的 \(X'_{i}=X_{X_{i}}\)
定义 \(p_{i,j}\) 表示操作 \(2^{i}\) 次以后 \(X_{j}\) 的值,我们姑且先不考虑 \(K\) 的限制,转移是显而易见的
\]
初始化 \(p_{0,i}=x_{i}\)
但是有了这个东西还不够,因为它让我们求恰好 \(K\) 次操作时候的 \(K\) 数组值,而我们现在只有 \(2^{i}\) 的数组值.
写到这基本就能想到了,搞一个二进制分解就行了
其实本来想暴力建图弄一个内向基环树的,因为在树上直接维护环信息,到最后直接取模 \(O(1)\) 就出了. 这个思路是假的,但是如果 \(K\ge N\),这个思路就是对的了. 瓶颈在这个算法只能求出走进环里的节点的末态,而对于很长的链而 \(K\) 非常小的时候,存在节点无法走入环内,由于无法维护环外信息,因此复杂度会被卡成 \(n^{2}\)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int p[61][200001],a[200001],x[200001];
signed main(){
cin>>n>>k;
for(int i=1;i<=n;++i){
cin>>p[0][i];
}
for(int i=1;i<=n;++i){
cin>>a[i];
}
for(int i=1;i<=60;++i){
for(int j=1;j<=n;++j){
p[i][j]=p[i-1][p[i-1][j]];
}
}
for(int i=1;i<=n;++i){
x[i]=i;
}
for(int i=0;i<=60;++i){
if(k&1){
for(int j=1;j<=n;++j){
x[j]=p[i][x[j]];
}
}
k>>=1;
}
for(int i=1;i<=n;++i){
cout<<a[x[i]]<<" ";
}
cout<<endl;
}
F.Rearrange Query \(\text{Diff }1540\)
给你两个序列 \(A,B\)
每次询问给定 \(l,r,L,R\),判断是否满足下列条件
\(A_{l},A_{l+1}\cdots A_{r}\) 可以通过重排与 \(B_{L},B_{L+1}\cdots B_{R}\) 匹配
\(N,Q\le 2\times 10^{5},\forall A_{i},B_{i}\in[1,N]\)
当 \(R-L\neq r-l\) 时显然不可能,考虑剩下的情况
设计一个哈希值,考虑每次直接 \(O(n)\) 判等. 那么我们这个哈希值显然是需要无序的,即只要是 \(A\) 的一个排列,其哈希值都与 \(A\) 相等. 可以想到两种哈希:和哈希与异或哈希.
异或哈希做不到给每个元素都赋不同的值,因为它总共就只有 \(64\) 位可用,因此考虑和哈希,即将序列元素中的值加起来之和用于判断.
假如我们真的用原数列做哈希的话,出题人随便就给卡了,因为即便是和哈希,哈希冲突的概率还是太高. 因此考虑开一个 map,把数字离散化,均匀分布到 \([1,mod-1]\) 范围内. 可以证明这样做的冲突概率是 \(\frac{2^{64}}{n^2}\)
此外,直接处理前缀和即可 \(O(1)\) 回答询问
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=141592653589;
int n,q;
int a[200001],b[200001],val[200001],sum1[200001],sum2[200001];
signed main(){
cin>>n>>q;
ios::sync_with_stdio(false);
srand(time(0));
for(int i=1;i<=n;++i){
val[i]=(rand()*1ll*rand())%(p-1)+1;
}
for(int i=1;i<=n;++i){
cin>>a[i];
a[i]=val[a[i]];
sum1[i]=sum1[i-1]+a[i];
}
for(int i=1;i<=n;++i){
cin>>b[i];
b[i]=val[b[i]];
sum2[i]=sum2[i-1]+b[i];
}
for(int i=1;i<=q;++i){
int l,r,L,R;
cin>>l>>r>>L>>R;
if((sum1[r]-sum1[l-1])%p!=(sum2[R]-sum2[L-1])%p) cout<<"No\n";
else cout<<"Yes\n";
}
}
Atcoder Beginner Contest 367的更多相关文章
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
随机推荐
- TIER 1: Crocodile
TIER 1: Crocodile nmap 在前几次练习中,我们已经熟悉 nmap 扫描,我们在本次靶机中使用继续使用 nmap 进行扫描. 扩充我们的知识库:-sC 选项启用了 Nmap 的默认脚 ...
- JavaScript小面试~节流
节流,当用户发出多次请求时,需要对事件进行限制,不要让事件过多触发.场景:在用户浏览页面的时候,用户拼命滚动屏幕时,控制页面滚动的事件会多次触发,会导致网络阻塞或者出现渲染差.此时需要对其进行约束.无 ...
- 【译】用 GitHub Copilot 提交注释揭开历史的神秘面纱
您是否曾经难以理解一个提交在做什么或者为什么要做?在审查或协作代码更改时,您是否希望有更多的清晰度和上下文?如果您的回答是肯定的,那么您会喜欢 GitHub Copilot 为您所做的--生成提交注释 ...
- 前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段
本章主要实现素材的嵌套(加载阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形. 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue ...
- Known框架实战演练——进销存基础数据
本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息.供应商管理和客户管理3个菜单页面.供应商和客户字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: htt ...
- 自己在本地搭建 git 版本仓库服务器
请确保你安装了 git 的图形化工具和 git 软件 首先先创建一个目录作为你的项目工程目录,比如 e:/gitTest 其次右键 git init. 然后指定一个 git 服务器目录,例如:e:/g ...
- Springboot实现HTML表单from简单的接收信息
HTML< from >元素 from可向Web服务器提交请求 普遍格式: <from action="服务器地址" method="请求方式" ...
- 失温急救处理方法——1.快速复温;2.心肺复苏;3.口服或静脉注射生理盐水(40 ~ 42 ℃ ,小剂量250 mL);4.口服或静脉注射抗血栓药物,如布洛芬
相关: https://haokan.baidu.com/v?pd=wisenatural&vid=14530104659934311010 参考: https://m.bjnews.com. ...
- Jupyter 实验室中的 GPU 仪表板
这两天收到了NVIDIA公司推送的新闻: https://developer.nvidia.com/zh-cn/blog/gpu-dashboards-in-jupyter-lab/?ncid=em- ...
- 实操教程 | 触发器实现 Apache DolphinScheduler 失败钉钉自动告警
作者 | sqlboy-yuzhenc 背景介绍 在实际应用中,我们经常需要将特定的任务通知给特定的人,虽然 Apache DolphinScheduler 在安全中心提供了告警组和告警实例,但是配置 ...