Codeforces Round 911 (Div. 2) 总结
第一次在赛场上敲莫反,还好最后调出来了!
A
题意:你在Minecraft里挖了一些一格的坑(同一列),问你用几桶水可以填满它(可以造无限水)。
解法:找大于 \(2\) 的连续段,有的话就是两桶,没有的话挖了几次就是几桶。
B
题意:\(a,b,c\) 三个数,每次操作可以选定其中一个数加一,另外两个数各自减一。问对于每一个数,能否通过若干次操作仅使它变为 \(0\),其他两个数不为 \(0\) 。
解法:
通过手玩发现一些性质:
1、可以将每个数都变成小于等于 \(2\) 的非 \(0\) 数。
2、一次操作所有数的奇偶性发生改变。
所以利用性质1可以知道我们只要将所有数化为小于等于 \(2\) 的数,讨论 \(1\) 的个数即可。
由性质2可知只要对所有数模 \(2\) 加 \(1\)即可得到它们对应的小于等于 \(2\) 的数。
再手玩一下只考虑只有 \(2\) 和 \(1\) 的答案:
221:001
211:100
111:111(222和111等价)
所以结论是当三个数奇偶性相同时全部可以满足题意,奇偶性不同时只有独特的那个数符合题意。
结论为什么是对的?
充分性在上面的过程中已经体现。
必要性(符合题意的有且仅有奇偶性独特的那个数)证明可以考虑性质2,奇偶性独特的那个数成为 \(0\) 时另外两数必不为 \(0\) 。
(所以这题为什么只有900分,是结论比较好猜吗?)
C
题意:给出一棵二叉树,每个节点上有标记L或R或U分别表示走向左儿子、走向右儿子、走向父亲。一个人从根出发,按每个节点的标记走。现在要修改最少的标记,使得他能经过某个叶子节点。
解法:可以考虑走到节点x所需的更改次数 \(f[x]\) 。很容易从父节点转移到子节点,标记所指的那个儿子继承 \(f[x]\),另一个赋值为 \(f[x]+1\) 。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,MOD=998244353;
char p[N];
int ls[N],rs[N],res[N],ans;
void dfs(int x)
{
if(!ls[x]&&!rs[x])
{
ans=min(ans,res[x]);
return;
}
if(ls[x])
{
res[ls[x]]=res[x]+(p[x]!='L');
dfs(ls[x]);
}
if(rs[x])
{
res[rs[x]]=res[x]+(p[x]!='R');
dfs(rs[x]);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;cin>>T;
while(T--)
{
int n;cin>>n;
cin>>(p+1);
for(int i=1;i<=n;i++)
{
cin>>ls[i]>>rs[i];
}
ans=1e9;
dfs(1);
cout<<ans<<endl;
for(int i=0;i<=n;i++) p[i]=ls[i]=rs[i]=res[i]=0;
}
}
D
题意:给定数组 \(a\) ,求:
\]
定义 \(f(x,y,z)\) 表示 \(x,y,z\)中较小的两个数的最大公约数。
解法:
如果去掉对 \(k\) 的那个 \(\Sigma\) 的话就变成莫反裸题了,因此这个题大概率也可以用莫反解决。
假设数组a中的数两两不同。
首先考虑将数组 \(a\) 放进桶里,柿子可以转化为:
\]
\(m\) 是 \(a\) 中出现的最大值,数组 \(t\) 是桶,\(count\) 用于统计区间内 \(a_i\) 出现次数。
运用一下莫反:
\]
对于后面一坨柿子可以看到 \(kd\) 是一个整体,我们可以通过枚举 \(kd\) ,再枚举倍数预处理出来,时间复杂度是调和级数约等于一只log。
但上面考虑的是数组 \(a\) 不存在两两相等的元素。
接下来还要考虑枚举到的三个数 \(x\leq y\leq z\) 的相等关系:
1、\(x=y=z\) :
\(\sum_{i=1}^{m}i\cdot\text{C}_{t[i]}^{3}\) 直接另外处理即可。
2、\(x=y<z\) :
\(\sum_{i=1}^{m}i\cdot\text{C}_{t[i]}^{2}\cdot count(i+1,m)\) 和1一起处理。
3、\(x<y=z\) :
在预处理 \(kd\) 的倍数中,每一次枚举到 \(jkd\) 都会对答案产生额外贡献 \(t[ikd]\cdot \text{C}_{t[jkd]}^{2}\)。
全部的柿子应改为:
\]
然后就可以写代码了,预处理部分可以从大到小枚举,用类似后缀和的方式存储与 \(j\) 相关的值。
整体包含两次枚举倍数,时间复杂度大约是一只log。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,MOD=998244353;
int mu[N],cnt,vis[N];
vector<int> prime;
void init()
{
mu[1]=1;
for(int i=2;i<N;i++)
{
if(!vis[i]) prime.push_back(i),mu[i]=-1;
for(int j=0;i*prime[j]<N&&j<prime.size();j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else mu[i*prime[j]]=-mu[i];
}
}
}
int t[N],p[N],q[N],A[N],res[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
init();
int T;cin>>T;
while(T--)
{
int n,m=0;cin>>n;
for(int i=1;i<=n;i++) cin>>A[i],t[A[i]]++,m=max(m,A[i]);
sort(A+1,A+n+1);
for(int i=1,pos=1;i<=n;i++)
{
while(pos<=n&&A[pos]==A[i]) pos++;
p[A[i]]+=n-pos+1;
}
for(int kd=1;kd<=m;kd++)
{
int sum=0;
for(int i=m/kd;i;i--)
{
res[kd]+=sum*t[i*kd];
sum+=p[i*kd]+t[i*kd]*(t[i*kd]-1)/2;
}
}
int ans=0;
for(int k=1;k<=m;k++)
for(int d=1;d*k<=m;d++)
{
ans+=mu[d]*k*res[k*d];
}
int num=0;
for(int i=m;i;i--)
{
if(t[i])
{
ans+=t[i]*(t[i]-1)/2*num*i;
ans+=t[i]*(t[i]-1)*(t[i]-2)/6*i;
num+=t[i];
}
}
cout<<ans<<endl;
for(int i=0;i<=m;i++) res[i]=p[i]=t[i]=q[i]=0;
for(int i=0;i<=n;i++) A[i]=0;
}
}
E
缩点模板题,困了,先咕着(
F
还不会,先咕着(
总结
成功切掉了D(?),所以上了一点点分,还行,但D调的还是太久了。
Codeforces Round 911 (Div. 2) 总结的更多相关文章
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
- Codeforces Round #268 (Div. 2) ABCD
CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
随机推荐
- 二叉树(binary tree)
二叉树(binary tree) 二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树具有以下特点: 每个节点最多有 ...
- 深信服 9-15笔试 C卷
深信服 9-15笔试 C卷 15题填空,4道编程 填空 填空比较基础,考察了数据结构(队列,二叉树),和简单编程,二进制等. 1.1 2 3 4 5 入队,然后队首弹出,6 7 8 9 10 入队,然 ...
- 【Python】代理池针对ip拦截破解
代理池是一种常见的反反爬虫技术,通过维护一组可用的代理服务器,来在被反爬虫限制的情况下,实现数据的爬取.但是,代理池本身也面临着被目标网站针对ip进行拦截的风险. 本文将详细介绍代理池针对ip拦截破解 ...
- WebApi中添加Jwt鉴权
前言 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息.一个 JWT 实际上就是一个字符串,它由三部分组成,头部.载荷与签 ...
- stm32开发笔记
STM32F103C8T6单片机简介 标准库与HAL库区别 寄存器 寄存器众多,需要经常翻阅芯片手册,费时费力: 更大灵活性,可以随心所欲达到自己的目的: 深入理解单片机的运行原理,知其然更知其所以然 ...
- 深入理解 python 虚拟机:生成器停止背后的魔法
深入理解 python 虚拟机:生成器停止背后的魔法 在本篇文章当中主要给大家介绍 Python 当中生成器的实现原理,尤其是生成器是如何能够被停止执行,而且还能够被恢复的,这是一个非常让人疑惑的地方 ...
- ASP.NET 6启动时自动创建MongoDB索引
大家好,我是Edison. 最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着通过代码的方式在A ...
- ChatGPT — Release Notes
ChatGPT - Release Notes The latest update for ChatGPT Written by Natalie. Updated yesterday Release ...
- studio
- Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】
〇.简介 1.什么是桥接模式? 一句话解释: 通过一个类的抽象,与另一个类的抽象关联起来,当做桥.此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来. 桥接,顾名思义就是用桥来 ...