D.New Year Concert

传送门
题目大意:
一个长为

N

(

1

≤

N

≤

2

×

1

0

5

)

N(1\leq N\leq2\times 10^5)

N(1≤N≤2×105)的序列

A

A

A,对于

[

l

,

r

]

[l,r]

[l,r],如果

g

c

d

(

A

l

,

A

l

+

1

,

.

.

.

,

A

r

)

=

r

−

l

+

1

gcd(A_{l},A_{l+1},...,A_{r})=r-l+1

gcd(Al​,Al+1​,...,Ar​)=r−l+1,称这一段不好,每次操作可以将数列上任意一个位置上的数字替换为任意一个正整数。对序列的每个前缀,求出最少操作多少次可以使该前缀上没有不好的段。

思路:
因为可以修改为任意的正整数,所以我们只要将

A

i

A_{i}

Ai​修改为一个很大的素数,那么所有包含

i

i

i的不好的段都会变好。

再考虑从每个左端点

l

l

l开始的段,显然随着

r

r

r的增加,本段的

g

c

d

gcd

gcd不增,而

r

−

l

+

1

r-l+1

r−l+1会逐渐增大,也就是

g

c

d

gcd

gcd与

r

−

l

+

1

r-l+1

r−l+1最多有一个交点,也就是对于每个左端点,最多有

1

1

1个不好的段,不好的段总数最多为

N

N

N。

我们可以用

S

T

ST

ST表来求区间

g

c

d

gcd

gcd,然后枚举每个左端点二分求出所有不好的段。

接下来就是求最少修改多少个点可以使所有不好的段消失,我们可以对求出的所有不好的段按右端点排序,按右端点从小到大枚举,如果该段仍然存在,就修改该段右端点上的元素,同时所有包含该点的不好的段也都消失。最后对表示每个点是否被修改的数组求一个前缀和即为答案。

代码:

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
//#define int LL
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const double eps = 1e-8;
const LL mod = 1000000007;
const LL MOD = 998244353;
const int maxn = 200010; int N, A[maxn], ST[maxn][30];
vector<PII>seg;
int ans[maxn]; bool cmp(const PII& a, const PII& b)
{
if (a.second == b.second)
return a.first < b.first;
return a.second < b.second;
} int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
} void GCD_init(int n)
{
for (int i = 0; i < n; i++)
ST[i][0] = A[i];
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 0; i + (1 << j) - 1 < n; i++)
ST[i][j] = gcd(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]);
}
} int GCD(int l, int r)//[l,r)
{
if (l >= r)
return 0;
int k = floor(log2(r - l)); return gcd(ST[l][k], ST[r - (1 << k)][k]);
} void solve()
{
GCD_init(N + 1);
for (int i = 1; i <= N; i++)
{
int lo = i, hi = N + 1;
while (hi - lo > 1)
{
int mid = (lo + hi) / 2;
if (GCD(i, mid + 1) >= mid + 1 - i)
lo = mid;
else
hi = mid;
}
if (GCD(i, lo + 1) == lo + 1 - i)
seg.push_back(PII(i, lo));
}
sort(seg.begin(), seg.end(), cmp);
int lst = 0;
for (auto& s : seg)
{
int l = s.first, r = s.second;
if (l <= lst)
continue;
lst = r;
ans[r] = 1;
}
for (int i = 1; i <= N; i++)
{
ans[i] += ans[i - 1];
cout << ans[i] << ' ';
}
cout << endl;
} int main()
{
IOS;
cin >> N;
for (int i = 1; i <= N; i++)
cin >> A[i];
solve(); return 0;
}
E.Distance Tree

题目大意:
给定一颗以

1

1

1为根的有

N

(

N

≤

3

×

1

0

5

)

N(N\leq3\times10^5)

N(N≤3×105)个节点的树,每条边长度为

1

1

1,

d

(

v

)

d(v)

d(v)为

1

1

1到

v

v

v的最短距离,设

f

(

x

)

f(x)

f(x)为添加完一条长为

x

x

x的边之后最小的所有

d

(

v

)

d(v)

d(v)的最大值,求

f

(

1

)

∼

f

(

N

)

f(1)\sim f(N)

f(1)∼f(N)。

思路:
显然新加入的边一端连在

1

1

1是最优的。我们可以考虑对于每个

f

(

x

)

f(x)

f(x)来二分求得,我们设

f

m

i

d

f_{mid}

fmid​为在树中两个深度

>

m

i

d

>mid

>mid的节点的最远距离(如果

m

i

d

≥

mid\geq

mid≥树的深度,显然最终的答案

≤

m

i

d

\leq mid

≤mid),那么,我们将新加入边的另一端连接到这一条路径的中点上,就可以使

d

(

v

)

d(v)

d(v)的最大值最小,此时的最大值为

⌈

f

m

i

d

2

⌉

+

x

\lceil \frac{f_{mid}}{2}\rceil + x

⌈2fmid​​⌉+x,如果这个值

≤

m

i

d

\leq mid

≤mid,就说明最终的答案

≤

m

i

d

\leq mid

≤mid,否则

>

>

>。
对于

f

m

i

d

f_{mid}

fmid​,我们可以通过

d

f

s

dfs

dfs预处理出来。对于每个节点

v

v

v,我们可以找到其深度最大的两棵子树,记深度为

a

v

,

b

v

(

b

v

≤

a

v

)

a_{v},b_{v}(b_{v}\leq a_{v})

av​,bv​(bv​≤av​),若

b

v

>

0

b_{v}>0

bv​>0,则

f

b

v

−

1

=

m

i

n

(

f

b

v

−

1

,

a

v

+

b

v

−

2

×

d

e

p

t

h

v

)

f_{b_{v}-1}=min(f_{b_{v}-1},a_{v}+b_{v}-2\times depth_{v})

fbv​−1​=min(fbv​−1​,av​+bv​−2×depthv​),即用深度为

a

v

,

b

v

a_{v},b_{v}

av​,bv​两点的路径长度去更新

f

b

v

−

1

f_{b_{v}-1}

fbv​−1​,如果

a

v

,

b

v

a_{v},b_{v}

av​,bv​中某个值不存在,就将其直接设为

d

e

p

t

h

v

depth_{v}

depthv​即可。最后再从

N

−

2

∼

0

N-2\sim 0

N−2∼0遍历,令

f

i

=

m

a

x

(

f

i

,

f

i

+

1

)

f_{i}=max(f_{i},f_{i+1})

fi​=max(fi​,fi+1​)即可,这样每个

f

i

f_{i}

fi​就会被所有

j

>

i

j>i

j>i的

f

j

f_{j}

fj​更新到。

代码:

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
//#define int LL
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const double eps = 1e-8;
const LL mod = 1000000007;
const LL MOD = 998244353;
const int maxn = 300010; vector<int>G[maxn];
int depth[maxn], maxdep;
int T, N;
int a[maxn], b[maxn];
int f[maxn]; void add_edge(int from, int to)
{
G[from].push_back(to);
G[to].push_back(from);
} void dfs(int v, int d)
{
depth[v] = d;
maxdep = max(maxdep, depth[v]);
a[v] = b[v] = d;
for (int i = 0; i < G[v].size(); i++)
{
int to = G[v][i];
if (depth[to] == -1)
{
dfs(to, d + 1);
if (a[to] > a[v])
{
b[v] = a[v];
a[v] = a[to];
}
else if (a[to] == a[v])
b[v] = a[to];
else if (a[to] > b[v])
b[v] = a[to]; }
}
if (b[v] > 0)
f[b[v] - 1] = max(f[b[v] - 1], a[v] + b[v] - 2 * depth[v]);
} bool Check(int x, int ans)
{
if (ans >= maxdep || (f[ans] + 1) / 2 + x <= ans)
return true;
return false;
} void solve()
{
dfs(1, 0);
for (int i = N - 2; i >= 0; i--)
f[i] = max(f[i], f[i + 1]);
for (int x = 1; x <= N; x++)
{
int lo = -1, hi = N;
while (hi - lo > 1)
{
int mid = (hi + lo) / 2;
if (Check(x, mid))
hi = mid;
else
lo = mid;
}
cout << hi << ' ';
}
cout << endl;
} int main()
{
IOS;
cin >> T;
while (T--)
{
cin >> N;
maxdep = -1;
for (int i = 1; i <= N; i++)
G[i].clear();
memset(depth, -1, sizeof(depth));
memset(f, -1, sizeof(f));
int u, v;
for (int i = 1; i < N; i++)
{
cin >> u >> v;
add_edge(u, v);
}
solve();
}
}

Codeforces Round #769 (Div. 2)D,E的更多相关文章

  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 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

随机推荐

  1. CICD流程

    1.开发者git提交代码至gitlab仓库 2.jenkins从gitlab拉取代码,触发镜像构建 3.镜像上传至harbor私有仓库 4.镜像下载至执行机器--k8s node kubelet 5. ...

  2. SpringBoot集成MongoDB之导入导出和模板下载

    前言 自己很对自己在项目中集成MongoDb做的导入导出以及模板下载的方法总结如下,有不到之处敬请批评指正! 1.pom.xml依赖引入 <!-- excel导入导出 --> <de ...

  3. STC8H开发(八): NRF24L01无线传输音频(对讲机原型)

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. C++ 子函数参数传递过程

    编译环境:Visual Studio 2015 参数传递与汇编语言有很大关系.子函数传递参数主要方式有三种(这三种参数传递方式都可用用于x86汇编语言甚至其它汇编语言): 寄存器方式传递参数 存储器方 ...

  5. simpholders 官方网址 https://www.simpholders.com/

    SimPholders可让你快速直接地访问iPhone模拟器应用的app文档.你可以通过SimPholders找到数据库文件.永久存储以及缓存,它是一个非常实用的app debug工具,同时还可以离线 ...

  6. 微信h5下拉隐藏网页,还有取消页面滑动

    需求: 网页下拉太丑了,如下 度娘了一下, 发现一篇相关文档 基本解决了问题 https://juejin.cn/post/6844903940190896135#heading-2 加入如下代码即可 ...

  7. mysql启动错误:mysql.sock丢失

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 我的是Cent ...

  8. 通过ANT生成MANIFEST.MF中的Class-Path属性

    原文地址:http://reason2003.iteye.com/blog/1627353 之前做一个项目,主程序打包成一个jar文件,因为用到了很多第三方的lib包,所以直接通过java命令运行ja ...

  9. JVM性能调优与实战基础理论篇-下

    JVM内存管理 JVM内存分配与回收策略 对象优先在Eden分配,如果Eden内存空间不足,就会发生Minor GC.虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在 ...

  10. alpakka-kafka(10)-用kafka实现分布式近实时交易

    随着网上购物消费模式热度的不断提高,网上销售平台上各种促销手段也层出不穷,其中"秒购"已经是各种网站普遍流行的促销方式了."秒购"对数据的实效性和精确性要求非常 ...