视频讲解:TBD

A. Three Doors

题目大意

有 333 个门和 333 把对应的钥匙。其中 222 把钥匙分别在 222 扇门后,111 把在手上。打开门才能获得门后的钥匙,问能否打开所有的门。

题解

判断前两次开的门后,是否有钥匙即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;int main()
{int T,x,a[5],now;scanf("%d",&T);while(T--){scanf("%d%d%d%d",&x,&a[1],&a[2],&a[3]);now=3^2^1^a[1]^a[2]^a[3];if(a[now]==0||a[a[now]]==0)printf("NO\n");elseprintf("YES\n");}
}

B. Also Try Minecraft

题目大意

有长为 nnn 列的世界,第 iii 列高 aia_iai​ 。每一步可以向左或向右移动一格,若移动到更低处,则会受到高度差的伤害。
qqq 次询问,每次询问求从低 sss 列移动第 jjj 列会受到多少伤害。

题解

预处理受到伤害的前缀和与后缀和,每次询问时求差即可得到答案。
prei=prei−1+max(0,ai−1−ai)pre_i=pre_{i-1}+max(0,a_{i-1}-a_i)prei​=prei−1​+max(0,ai−1​−ai​)

sufi=sufi+1+max(0,ai+1−ai)suf_i=suf_{i+1}+max(0,a_{i+1}-a_i)sufi​=sufi+1​+max(0,ai+1​−ai​)

ans={pret−prest≥ssuft−sufst<sans=\begin{cases} pre_t-pre_s &t\geq s \\ suf_t-suf_s &t<s \end{cases}ans={pret​−pres​suft​−sufs​​t≥st<s​

注意开long long。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int MAXN=100100;
ll a[MAXN],pre[MAXN],suf[MAXN];int main()
{int n,m,i,s,t;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%lld",&a[i]);}for(i=2;i<=n;i++)pre[i]=pre[i-1]+max(0ll,a[i-1]-a[i]);for(i=n-1;i>=1;i--)suf[i]=suf[i+1]+max(0ll,a[i+1]-a[i]);while(m--){scanf("%d%d",&s,&t);if(t>s)printf("%lld\n",pre[t]-pre[s]);elseprintf("%lld\n",suf[t]-suf[s]);}
}

C. Recover an RBS

题目大意

给定带未知符’?'的括号序列,每个"?“表示为”(“或”)",求是否存在唯一方案得到合法的括号序列

题解

从左到右遍历,维护以下两个初始为 000 的变量:

  • dep:括号序列的深度。遇到"(" 则 +1+1+1 ,遇到")" 则 −1-1−1 。
  • now:未确定的"?" 数量。

遍历时,存在以下两个特殊情况:

  • 若 dep<0dep<0dep<0 ,则之前必定有个未确定的"?“需要为”(",即 dep++,now−−dep++,now--dep++,now−− 。
  • 若 dep=0,now=1dep=0,now=1dep=0,now=1 ,则之前唯一的未确定的"?“必须为”(",即 dep++,now−−dep++,now--dep++,now−− 。

最终判断 ∣dep∣=now|dep|=now∣dep∣=now 是否成立即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int MAXN=200200;
char s[MAXN];int main()
{int T,now,dep,i,len;scanf("%d",&T);while(T--){scanf("%s",&s);len=strlen(s);now=0;dep=0;for(i=0;i<len;i++){if(s[i]=='(')dep++;else if(s[i]==')'){dep--;if(dep<0){dep++;now--;}}elsenow++;if(dep==0&&now==1){dep++;now--;}}if(abs(dep)==now)printf("YES\n");elseprintf("NO\n");}
}

D. Rorororobot

题目大意

给定 n(1≤n≤109)n(1 \leq n \leq 10^9)n(1≤n≤109) 行 m(1≤m≤2⋅105)m(1 \leq m \leq 2 \cdot 10^5)m(1≤m≤2⋅105) 列的网格图,第 iii 行的第 1,2,3,...,ai1,2,3,...,a_i1,2,3,...,ai​ 格为障碍物。

有 q(1≤q≤2⋅105)q(1 \leq q \leq 2\cdot 10^5)q(1≤q≤2⋅105) 次询问,每次询问给定起点坐标 (xs,ys)(x_s,y_s)(xs​,ys​) ,终点坐标 (xt,yt)(x_t,y_t)(xt​,yt​) 和正整数 k(1≤k≤109)k(1 \leq k \leq 10^9)k(1≤k≤109) 。

从起点开始,每步可以向任意方向移动 kkk 格,途中不能碰到障碍物或走出网格,问能否从起点走到终点。

题解

由于移动是可反悔的,且障碍物均在下方。因此可以先把起点和终点不断移动到上面,再判断能否从起点走到终点。
xs+=⌊n−xsk⌋∗kx_s+=\lfloor \frac{n-x_s}{k} \rfloor*kxs​+=⌊kn−xs​​⌋∗k

xt+=⌊n−xtk⌋∗kx_t+=\lfloor \frac{n-x_t}{k} \rfloor*kxt​+=⌊kn−xt​​⌋∗k

当起点和终点均向上移动后,若存在合法方案,则必须满足:

  • x坐标相同,即 xs=xtx_s=x_txs​=xt​
  • y坐标差为 kkk 的倍数,即 (ys−yt)%k=0(y_s-y_t)\%k=0(ys​−yt​)%k=0
  • 期间不存在障碍物,即 max⁡{ays,ays+1,...,ayt}<xs\max\{a_{y_s},a_{y_s+1},...,a_{y_t}\}<x_smax{ays​​,ays​+1​,...,ayt​​}<xs​ ,可以用ST表快速求解。注意可能 yt<ysy_t<y_syt​<ys​ ,需要交换左右端点。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int MAXN=200200;
const int MAXM=20;
int a[MAXN],dp[MAXN][MAXM];void ST(int n)
{int i,j;for(i=1;i<=n;i++)dp[i][0]=a[i];for(j=1;j<MAXM;j++){for(i=1;i+(1<<j)-1<=n;i++)dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}
}int rmq(int l,int r)
{if(l>r)swap(l,r);int k=log(r-l+1)/log(2);return max(dp[l][k],dp[r-(1<<k)+1][k]);
}int main()
{int n,m,i,q,sx,sy,tx,ty,k;scanf("%d%d",&n,&m);for(i=1;i<=m;i++)scanf("%d",&a[i]);ST(m);scanf("%d",&q);while(q--){scanf("%d%d%d%d%d",&sx,&sy,&tx,&ty,&k);sx+=(n-sx)/k*k;tx+=(n-tx)/k*k;if(sx==tx&&abs(ty-sy)%k==0&&rmq(sy,ty)<sx)printf("YES\n");elseprintf("NO\n");}
}

E. XOR Tree

题目大意

给定 n(1≤n≤2⋅105)n(1 \leq n \leq 2 \cdot 10^5)n(1≤n≤2⋅105) 个点的树,节点 iii 具有权值 ai(1≤ai<230)a_i(1 \leq a_i < 2^{30})ai​(1≤ai​<230) 。

定义简单路径的权值为路径上的节点权值的异或和。

每次可以将一个节点修改为任意正整数,求最少需要修改多少次,使得树上不存在权值为 000 的简单路径。

题解

由于被修改后的权值可以很大,因此假设节点 iii 的权值修改为 2i+302^{i+30}2i+30 ,则任何经过节点 iii 的路径权值均不可能为 000 。

考虑DFS逐个处理每个子树内经过子树根节点 xxx 的简单路径。
设集合 SxS_xSx​ 表示 xxx 为根的子树内的每个节点到 xxx 的简单路径权值构成的集合,则有转移式

Sx=⋃s∈SonxSs⊕axS_x=\bigcup_{s\in Son_x}S_s\oplus a_xSx​=s∈Sonx​⋃​Ss​⊕ax​

以上操作,可以用dsu on tree实现,注意由于存在交换大小集合的操作时,需要添加偏移量 lazlazlaz。

枚举 xxx 的子节点 sss 时,经过节点 xxx ,一端在 sss 为根的子树内,即 u∈Tsu\in T_su∈Ts​ ,另一端为 xxx 为根的的子树中之前已遍历过的节点之一,即 v∈Txvistedv\in T_x^{visted}v∈Txvisted​,则其权值构成的集合为

{Valu⊕Valv∣Valu∈Ss,Valv∈Sxvisted}\{Val_u\oplus Val_v | Val_u\in S_s,Val_v\in S_x^{visted}\}{Valu​⊕Valv​∣Valu​∈Ss​,Valv​∈Sxvisted​}

以上操作,可以通过枚举小集合中的每个元素,用set快速查找大集合中是否存在相同的元素,记得判断是否存在权值为 000 的简单路径。

若存在权值为 000 ,且经过节点 xxx 且两端均在 xxx 的子树内的简单路径,则将 axa_xax​ 修改为 2i+302^{i+30}2i+30 ,即可排除所有这样的简单路径。
且所有一端在 xxx 的子树中,另一端在 xxx 的子树外的简单路径均可同时被排除,因此清空 SxS_xSx​ ,答案 +1+1+1 即可。。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int MAXN=200200;
int ans=0;
int a[MAXN],fa[MAXN],laz[MAXN];
vector<int> e[MAXN];
set<int> st[MAXN];void dfs(int x,int p)
{st[fa[x]].insert(a[x]);int flag=1;for(int i=0;i<e[x].size();i++){int son=e[x][i];if(son==p)continue;dfs(son,x);if(st[fa[x]]>=st[fa[son]]){swap(fa[x],fa[son]);laz[fa[x]]^=a[x];laz[fa[son]]^=a[x];}for(set<int>::iterator it=st[fa[son]].begin();flag&&it!=st[fa[son]].end();it++){if(st[fa[x]].find((*it)^laz[fa[son]]^laz[fa[x]])!=st[fa[x]].end())flag=0;}for(set<int>::iterator it=st[fa[son]].begin();flag&&it!=st[fa[son]].end();it++)st[fa[x]].insert((*it)^a[x]^laz[fa[son]]^laz[fa[x]]);}if(!flag){st[fa[x]].clear();ans++;}
}int main()
{int n,i,x,y;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);fa[i]=i;}for(i=1;i<n;i++){scanf("%d%d",&x,&y);e[x].push_back(y);e[y].push_back(x);}dfs(1,0);printf("%d\n",ans);
}

F. Multiset of Strings

TBD

题目大意

题解

参考代码


Educational Codeforces Round 132 div.2 A-F题解相关推荐

  1. Educational Codeforces Round 110 div.2 A~F题解

    视频讲解:BV1254y137Rn A. Fair Playoff 题目大意 有 444 位选手参加比赛,第 iii 位选手的水平为 si(1≤si≤100)s_i(1 \leq s_i \leq 1 ...

  2. Educational Codeforces Round 132 A - D

    Educational Codeforces Round 132 (Rated for Div. 2) 提交情况 参考 Educational Codeforces Round 132 (Rated ...

  3. Codeforces Round #797 (Div. 3)无F

    Codeforces Round #797 (Div. 3)无F 这打的也太屎了,白天把G补了才知道简单的很,但f还是没头绪呜呜呜 Problem - A - Codeforces Given the ...

  4. Educational Codeforces Round 112(Div.2) ABC题解

    D题好像可以做一做,挖个坑以后做好了来填(doge Educational Codeforces Round 112(Div.2) 题目列表 1.A 2.B 3.C 1.A 原题链接 题目大意 有三种 ...

  5. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  6. Codeforces Round #774 (Div. 2)E题题解

    Codeforces Round #774 (Div. 2) E. Power Board 题目陈述 有一个n×m(1≤n,m≤106)n\times m(1\le n,m\le10^6)n×m(1≤ ...

  7. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  8. Educational Codeforces Round 132 (Rated for Div. 2) 题解(A~D)

    A题链接 题目大意: t t t 次询问,先给一扇门 n n n 的钥匙,开了 n n n 门后,会给当前数字 a i a_i ai​ 的门的钥匙. 比如样例一:给了第3个门的钥匙,第3个门打开后给2 ...

  9. Educational Codeforces Round 132 (Rated for Div. 2) C. Recover an RBS

    翻译: 括号序列是只包含字符"("和")"的字符串.正则括号序列(或简称RBS)是一个可以通过在序列的原始字符之间插入字符"1"和" ...

最新文章

  1. C#编程中的crc16校验
  2. 阅读A Practical Guide to Support Vector Classification
  3. 依赖倒置原则_设计模式之SOLID原则
  4. axis1 c# 接口 调用_java axis 调用C# webService的例子
  5. c# dynamic 类型调用静态方法实例
  6. jquery原型方法map的使用和源码分析
  7. 50行代码实现3D模拟真实撒金币动效
  8. 实战 | F1060路由模式典型组网配置案例(静态路由)
  9. 小程序源码:独立后台带分销功能月老办事处交友盲盒-多玩法安装简单
  10. android 下载目录,android – FileProvider – 从下载目录中打开文件
  11. 【H3C设备组网配置】第一版
  12. 如何快速打出希腊字母
  13. 使用canvas 绘制象棋棋盘
  14. 什么是空热量的食物?“空热量”的谬论
  15. 【C++】用递归函数实现Hermite多项式求值
  16. android 4.3抽屉先过,android抽屉
  17. 了解Fidder工具及使用方法
  18. 机器学习 基本概念/术语
  19. aix服务器查看文件编码格式,Linux stat命令和AIX istat命令 (查看文件修改时间)(示例代码)...
  20. 八大排序详解-超详细

热门文章

  1. Synchronized详解(Monitor,轻量级锁,偏向锁,锁膨胀,锁消除,自旋)
  2. Python编程 | 系统编程 | 脚本运行上下文 | 标准流
  3. 【stm32】delay详解
  4. CVPR 2021放榜,腾讯优图20篇论文都在这里了!
  5. epoll_create详解
  6. 1707. [Usaco2007 Nov]tanning分配防晒霜
  7. gem意思_GEM什么意思
  8. Linux查看系统状态-ZZT
  9. 抽象代数——代数结构
  10. 潮人必备签名档,得闲就更新