第一次在赛场上敲莫反,还好最后调出来了!

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

题意:给出一棵二叉树,每个节点上有标记LRU分别表示走向左儿子、走向右儿子、走向父亲。一个人从根出发,按每个节点的标记走。现在要修改最少的标记,使得他能经过某个叶子节点。

解法:可以考虑走到节点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\) ,求:

\[\sum_{i=1}^{n}\sum_{j=i+1}^{n}\sum_{k=j+1}^{n} f(a_i,a_j,a_k)
\]

定义 \(f(x,y,z)\) 表示 \(x,y,z\)中较小的两个数的最大公约数。

解法:

如果去掉对 \(k\) 的那个 \(\Sigma\) 的话就变成莫反裸题了,因此这个题大概率也可以用莫反解决。

假设数组a中的数两两不同。

首先考虑将数组 \(a\) 放进桶里,柿子可以转化为:

\[\sum_{i=1}^{m}\sum_{j=i+1}^{m}\gcd(i,j)\cdot t[i]\cdot t[j]\cdot count(j+1,m)
\]

\(m\) 是 \(a\) 中出现的最大值,数组 \(t\) 是桶,\(count\) 用于统计区间内 \(a_i\) 出现次数。

运用一下莫反:

\[\sum_{d=1}^{m}d\sum_{k=1}^{\lfloor\frac{m}{d}\rfloor}\mu(k)\sum_{i=1}^{\lfloor\frac{m}{kd}\rfloor}t[ikd]\sum_{j=i+1}^{\lfloor\frac{m}{kd}\rfloor} t[jkd]\cdot count(jkd+1,m)
\]

对于后面一坨柿子可以看到 \(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}\)。

全部的柿子应改为:

\[\sum_{d=1}^{m}d\sum_{k=1}^{\lfloor\frac{m}{d}\rfloor}\mu(k)\sum_{i=1}^{\lfloor\frac{m}{kd}\rfloor}t[ikd] \sum_{j=i+1}^{\lfloor\frac{m}{kd}\rfloor} (t[jkd]\cdot count(jkd+1,m)+\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) 总结的更多相关文章

  1. 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 ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. 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 ...

  7. 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 ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. Nginx map 实现时间格式转换

    哈喽大家好,我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始 ...

  2. Vue源码学习(五):<templete>渲染第四步,生成虚拟dom并将其转换为真实dom

    好家伙,   前情提要: 在上一篇我们已经成功将ast语法树转换为渲染函数  现在我们继续   1.项目目录 代码已开源https://github.com/Fattiger4399/analytic ...

  3. Windows上Dart安装

    过程 *1 去github上下载一个release包或者直接将flutter通过git clone下来 *2 将下载下来的flutter/bin添加到path中 *3 此时运行flutter或者flu ...

  4. .NET反编译神器ILSpy怎么用?

    前言 上一篇文章我们介绍了4款免费且实用的.NET反编译工具,这篇文章主要来说说ILSpy这个工具该如何安装和使用. ILSpy ILSpy是一款免费.开源的 .NET 反编译工具,能够将已编译的 . ...

  5. ActivityNotFoundException

    activity  加入 AndroidManifest android.content.ActivityNotFoundException: Unable to find explicit acti ...

  6. 自学一周python做的一个小游戏《大球吃小球》

    需求 1,显示一个窗口. 2,我们要做到的功能有鼠标点击屏幕生成小球. 3,生成的小球大小随机,颜色随机,向随机方向移动,速度也随机. 4,大的球碰到小球时可以吃掉小球,吃掉后会变大. 5,球碰到边界 ...

  7. 模块化打包工具-Webpack插件与其他功能

    1.Webpack插件机制 上一篇提到的webpack的loader可以用来加载资源,包括各种css,图片文件资源,实现打包文件的功能,而webpack的插件则起到了加强webpack的作用,可以完成 ...

  8. 洛谷P3612(递归)

    题目描述 The cows are experimenting with secret codes, and have devised a method for creating an infinit ...

  9. JVM-Java语法糖与Java编译器

    基本类型和其包装类型之间的自动转换,也就是自动装箱.自动拆箱,是通过加入[Wrapper].valueOf(如 Integer.valueOf)以及[Wrapper].[primitive]Value ...

  10. JAVA多线程(3)——如何加锁

    1.加锁不正确导致数据不一致:m1执行过程中,m2(未加synchronized)可以执行,因为m2不用获得锁就可以执行 1 public class TT implements Runnable { ...