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

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. 达梦数据库-DW-国产化--九五小庞

    武汉达梦数据库股份有限公司成立于2000年,是国内领先的数据库产品开发服务商,国内数据库基础软件产业发展的关键推动者.公司为客户提供各类数据库软件及集群软件.云计算与大数据等一系列数据库产品及相关技术 ...

  2. 使用 Python ssh 远程登陆服务器的最佳方案

    在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果. 在 shell 环境中,我们是这样子做的. sshpass -p ${passwd} s ...

  3. destoon根据目录下的html文件生成地图索引

    因为项目需要,destoon根据目录下的html文件生成地图索引,操作方法,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  4. ChatGPT — Release Notes

    ChatGPT - Release Notes The latest update for ChatGPT Written by Natalie. Updated yesterday Release ...

  5. 漏洞扫描与安全加固之Apache Axis组件

    一.Apache Axis组件高危漏洞自查及整改 Apache Axis组件存在由配置不当导致的远程代码执行风险. 1. 影响版本 Axis1 和Axis2各版本均受影响 2. 处置建议 1)禁用此服 ...

  6. windows系统和IE的兼容性问题

    IE浏览器用户正在逐步减少,但是以前的基数较大,为了解决win和ie的版本混乱问题,特记录一下:      一.从操作系统角度出发: XP最高支持到IE8,XP支持ie6,ie7,ie8 WIN7自带 ...

  7. 【Unity3D】UI Toolkit容器

    1 前言 ​ UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit元素 中介绍了 Label.Button.TextField.To ...

  8. 什么是Kubernetes

    什么是Kubernetes Kubernetes 概述 1.K8S 是什么? K8S 的全称为 Kubernetes (K12345678S),PS:"嘛,写全称也太累了吧,不如整个缩写&q ...

  9. Docker从了解到部署应用的详细教程

    一.Docker基础知识 1.Docker (1)Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可以移植的容器中,然后发布到任何的linux机器上,可以实现虚拟化: (2)Docker ...

  10. 手撕Vuex-实现actions方法

    经过上一篇章介绍,完成了实现 mutations 的功能,那么接下来本篇将会实现 actions 的功能. 本篇我先介绍一下 actions 的作用,然后再介绍一下实现的思路,最后再实现代码. act ...