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为还需要的蜡烛数, ...
随机推荐
- 达梦数据库-DW-国产化--九五小庞
武汉达梦数据库股份有限公司成立于2000年,是国内领先的数据库产品开发服务商,国内数据库基础软件产业发展的关键推动者.公司为客户提供各类数据库软件及集群软件.云计算与大数据等一系列数据库产品及相关技术 ...
- 使用 Python ssh 远程登陆服务器的最佳方案
在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果. 在 shell 环境中,我们是这样子做的. sshpass -p ${passwd} s ...
- 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 ...
- ChatGPT — Release Notes
ChatGPT - Release Notes The latest update for ChatGPT Written by Natalie. Updated yesterday Release ...
- 漏洞扫描与安全加固之Apache Axis组件
一.Apache Axis组件高危漏洞自查及整改 Apache Axis组件存在由配置不当导致的远程代码执行风险. 1. 影响版本 Axis1 和Axis2各版本均受影响 2. 处置建议 1)禁用此服 ...
- windows系统和IE的兼容性问题
IE浏览器用户正在逐步减少,但是以前的基数较大,为了解决win和ie的版本混乱问题,特记录一下: 一.从操作系统角度出发: XP最高支持到IE8,XP支持ie6,ie7,ie8 WIN7自带 ...
- 【Unity3D】UI Toolkit容器
1 前言 UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit元素 中介绍了 Label.Button.TextField.To ...
- 什么是Kubernetes
什么是Kubernetes Kubernetes 概述 1.K8S 是什么? K8S 的全称为 Kubernetes (K12345678S),PS:"嘛,写全称也太累了吧,不如整个缩写&q ...
- Docker从了解到部署应用的详细教程
一.Docker基础知识 1.Docker (1)Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可以移植的容器中,然后发布到任何的linux机器上,可以实现虚拟化: (2)Docker ...
- 手撕Vuex-实现actions方法
经过上一篇章介绍,完成了实现 mutations 的功能,那么接下来本篇将会实现 actions 的功能. 本篇我先介绍一下 actions 的作用,然后再介绍一下实现的思路,最后再实现代码. act ...