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]\) 即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int a,b,c;
  5. cin>>a>>b>>c;
  6. if(c<b) c+=24;
  7. while(a<=c){
  8. // cout<<a<<" in "<<b<<" "<<c<<endl;
  9. if(a>=b and a<=c){
  10. cout<<"No"<<endl;
  11. return 0;
  12. }
  13. a+=24;
  14. }
  15. cout<<"Yes"<<endl;
  16. }

B.Cut .0 \(\text{Diff }43\)

给定一个小数,去除多余的后导零或小数点

比第一题水,不说了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. string x;
  5. cin>>x;
  6. for(int i=x.length()-1;i>=0;--i){
  7. if(x[i]=='.'){
  8. x.pop_back();
  9. break;
  10. }
  11. if(x[i]!='0') break;
  12. x.pop_back();
  13. }
  14. cout<<x<<endl;
  15. }

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\)

显然应该是爆搜

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[9];
  4. int n,k;
  5. int r[9];
  6. void dfs(int now,int nowsum){
  7. if(now>n){
  8. if(nowsum%k==0){
  9. for(int i=1;i<=n;++i){
  10. cout<<a[i]<<" ";
  11. }
  12. cout<<endl;
  13. }
  14. return;
  15. }
  16. for(int i=1;i<=r[now];++i){
  17. a[now]=i;
  18. dfs(now+1,nowsum+i);
  19. }
  20. }
  21. int main(){
  22. cin>>n>>k;
  23. for(int i=1;i<=n;++i){
  24. cin>>r[i];
  25. }
  26. dfs(1,0);
  27. }

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\) 数组会如何变化

  1. 2 1 4 3
  2. i dis
  3. 1 0 2 3 7
  4. 2 8 0 1 5
  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\) 数组,这样这个题就做完了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int n,m,sum;
  5. int a[200001],r[1000001],pres[200002],opres[200002];
  6. signed main(){
  7. scanf("%lld %lld",&n,&m);
  8. for(int i=1;i<=n;++i){
  9. scanf("%lld",&a[i]);
  10. sum+=a[i];
  11. }
  12. for(int i=1;i<=n-1;++i){
  13. pres[i]=pres[i-1]+a[i];
  14. opres[i]=pres[i];
  15. r[pres[i]%m]++;
  16. }
  17. r[0]++;
  18. int ans=0,rm=m,msum=0;
  19. for(int i=1;i<=n;++i){
  20. m+=opres[i]-msum;
  21. msum+=pres[i]-msum;
  22. r[pres[i==1?n:i-1]%rm]--;
  23. pres[i==1?n:i-1]+=sum;
  24. r[pres[i==1?n:i-1]%rm]++;
  25. ans+=r[msum%rm];
  26. }
  27. cout<<ans-n<<endl;
  28. }

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_{i,j}=p_{i-1,p_{i-1,j}}
\]

初始化 \(p_{0,i}=x_{i}\)

但是有了这个东西还不够,因为它让我们求恰好 \(K\) 次操作时候的 \(K\) 数组值,而我们现在只有 \(2^{i}\) 的数组值.

写到这基本就能想到了,搞一个二进制分解就行了

其实本来想暴力建图弄一个内向基环树的,因为在树上直接维护环信息,到最后直接取模 \(O(1)\) 就出了. 这个思路是假的,但是如果 \(K\ge N\),这个思路就是对的了. 瓶颈在这个算法只能求出走进环里的节点的末态,而对于很长的链而 \(K\) 非常小的时候,存在节点无法走入环内,由于无法维护环外信息,因此复杂度会被卡成 \(n^{2}\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int n,k;
  5. int p[61][200001],a[200001],x[200001];
  6. signed main(){
  7. cin>>n>>k;
  8. for(int i=1;i<=n;++i){
  9. cin>>p[0][i];
  10. }
  11. for(int i=1;i<=n;++i){
  12. cin>>a[i];
  13. }
  14. for(int i=1;i<=60;++i){
  15. for(int j=1;j<=n;++j){
  16. p[i][j]=p[i-1][p[i-1][j]];
  17. }
  18. }
  19. for(int i=1;i<=n;++i){
  20. x[i]=i;
  21. }
  22. for(int i=0;i<=60;++i){
  23. if(k&1){
  24. for(int j=1;j<=n;++j){
  25. x[j]=p[i][x[j]];
  26. }
  27. }
  28. k>>=1;
  29. }
  30. for(int i=1;i<=n;++i){
  31. cout<<a[x[i]]<<" ";
  32. }
  33. cout<<endl;
  34. }

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)\) 回答询问

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int p=141592653589;
  5. int n,q;
  6. int a[200001],b[200001],val[200001],sum1[200001],sum2[200001];
  7. signed main(){
  8. cin>>n>>q;
  9. ios::sync_with_stdio(false);
  10. srand(time(0));
  11. for(int i=1;i<=n;++i){
  12. val[i]=(rand()*1ll*rand())%(p-1)+1;
  13. }
  14. for(int i=1;i<=n;++i){
  15. cin>>a[i];
  16. a[i]=val[a[i]];
  17. sum1[i]=sum1[i-1]+a[i];
  18. }
  19. for(int i=1;i<=n;++i){
  20. cin>>b[i];
  21. b[i]=val[b[i]];
  22. sum2[i]=sum2[i-1]+b[i];
  23. }
  24. for(int i=1;i<=q;++i){
  25. int l,r,L,R;
  26. cin>>l>>r>>L>>R;
  27. if((sum1[r]-sum1[l-1])%p!=(sum2[R]-sum2[L-1])%p) cout<<"No\n";
  28. else cout<<"Yes\n";
  29. }
  30. }

Atcoder Beginner Contest 367的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

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

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

  10. AtCoder Beginner Contest 075 C bridge【图论求桥】

    AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...

随机推荐

  1. 第十节 JMeter基础-初级购物车【接口关联-鉴权】

    声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 背景:商城购物车可以添加数据,也可以删除数据. 思路: 登录后添加购物车,加入成功后查看购物车列表. 购物车列表,随机删除, ...

  2. 个人使用 sudo 方法

    sudo 作用:允许 系统管理员 授予某些用户或用户组以 其他用户身份 运行某些或所有命令的权限 su 用于变更为其他使用者的身份的命令,一般需要键入该使用者的密码 sudo 则是对 su 使用的简化 ...

  3. CF1988C Increasing Sequence with Fixed OR Solution

    题意简述如下: 给定一个正整数 \(n\),请构造一个正整数序列使其满足以下条件并尽可能长:这个序列中每个数都大于等于 \(1\) 且小于等于\(n\):这个序列是单调递增的:这个序列中任意两个相邻的 ...

  4. 20+前端常用的vscode插件(总结推荐)

    本篇文章给大家总结分享20多个前端常用的vscode插件.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 1. vscode 简介vscode是微软开发的的一款代码编辑器,就如官网上 ...

  5. LangChain的LCEL和Runnable你搞懂了吗

    LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough.RunnableParallel.RunnableBranch.RunnableLambda ...

  6. 7月24号python:库存管理

    7月24号python:库存管理 题目: ​ 仓库管理员以数组 stock 形式记录商品库存表.stock[i] 表示商品 id,可能存在重复.原库存表按商品 id 升序排列.现因突发情况需要进行商品 ...

  7. vue之循环遍历v-for

    1.背景 2.遍历数组 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. 常用的php方法

    /* * http 封装网络请求方法 */ /* * get method */ function get($url, $param=array()){ if(!is_array($param)){ ...

  9. Odd and Even Zeroes 题解

    前言 题目链接:洛谷:UVA. 题目简述 定义 \(\operatorname{count}(num)\) 表示 \(num\) 末尾 \(0\) 的个数.给出 \(n\)(\(n \leq 10^{ ...

  10. 高效调度新篇章:详解DolphinScheduler 3.2.0生产级集群搭建

    转载自tuoluzhe8521 导读:通过简化复杂的任务依赖关系, DolphinScheduler为数据工程师提供了强大的工作流程管理和调度能力.在3.2.0版本中,DolphinScheduler ...