【题解】CF#960 H-Santa's Gift
好久没有写过数据结构题目了,果然还是太不自信。实际上就是要求统计一个式子:
\(\sum (c[k]*p[k] - C)^{2}\)
拆开,分别统计和与平方和
\(co[k] * \sum p[k]^{2} - 2 * C * co[k] \sum p[k] + \sum C ^{2}\)
显然可以用树链剖分 + 线段树维护
平方和在区间 + 1的时候直接用 \((x + 1) ^ {2} = x^2 + 2 * x + 1\) 计算即可。
至于不同的口味的问题,我们给每个口味都开一线段树,动态开点~听起来虽然复杂,但代码实际上超短。◕ᴗ◕。
#include <bits/stdc++.h> using namespace std; #define maxn 3000000 #define int long long #define db double int n, m, q, C, cnt, f[maxn], co[maxn], dfn[maxn]; int size[maxn], hson[maxn], top[maxn], fa[maxn]; int root[maxn], mark[maxn * 2], cal[maxn * 2], cal2[maxn * 2], son[maxn * 2][2];int read() {int x = 0, k = 1;char c; c = getchar();while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); }while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * k; }struct edge {int cnp, to[maxn], last[maxn], head[maxn];edge() { cnp = 2; }void add(int u, int v){ to[cnp] = v, last[cnp] = head[u], head[u] = cnp ++; } }E1;void dfs(int u) {size[u] = 1; int mx = 0, hs = 0;for(int i = E1.head[u]; i; i = E1.last[i]){int v = E1.to[i];fa[v] = u; dfs(v); size[u] += size[v];if(size[v] >= mx) mx = size[v], hs = v;}hson[u] = hs; }void dfs2(int u, int anc) {dfn[u] = ++ cnt, top[u] = anc;if(hson[u]) dfs2(hson[u], anc);for(int i = E1.head[u]; i; i = E1.last[i])if(E1.to[i] != hson[u]) dfs2(E1.to[i], E1.to[i]); }void Add(int &p, int l, int r, int x) {if(!p) p = ++ cnt; mark[p] += x;cal2[p] += cal[p] * x + (r - l + 1) * x * x; cal[p] += (r - l + 1) * x * 2; }void Push_down(int p, int l, int r) {int mid = (l + r) >> 1;if(!mark[p]) return;Add(son[p][0], l, mid, mark[p]); Add(son[p][1], mid + 1, r, mark[p]);mark[p] = 0; }void Push_Up(int p) {int l = son[p][0], r = son[p][1];cal2[p] = cal2[l] + cal2[r]; cal[p] = cal[l] + cal[r]; }void Update(int &p, int l, int r, int L, int R, int x) {if(L > R || l > r) return;if(!p) p = ++ cnt;if(L <= l && R >= r) { Add(p, l, r, x); return; }Push_down(p, l, r); int mid = (l + r) >> 1;if(L <= mid) Update(son[p][0], l, mid, L, R, x); if(R > mid) Update(son[p][1], mid + 1, r, L, R, x);Push_Up(p); }void T_Update(int k, int u, int x) {for(; u; u = fa[top[u]])Update(root[k], 1, n, dfn[top[u]], dfn[u], x); }int Cal(int p) { return co[p] * co[p] * cal2[root[p]] - cal[root[p]] * C * co[p] + n * C * C; }signed main() {n = read(), m = read(), q = read(), C = read();for(int i = 1; i <= n; i ++) f[i] = read();for(int i = 2; i <= n; i ++) { int x = read(); E1.add(x, i); }for(int i = 1; i <= m; i ++) co[i] = read();dfs(1), dfs2(1, 1), cnt = m;for(int i = 1; i <= m; i ++) root[i] = i;for(int i = 1; i <= n; i ++) T_Update(f[i], i, 1);for(int i = 1; i <= q; i ++){int opt = read();if(opt == 1) {int x = read(), k = read();T_Update(f[x], x, -1), T_Update(f[x] = k, x, 1); }else {int k = read();printf("%lf\n", (db) Cal(k) / (db) n);}}return 0; }
转载于:https://www.cnblogs.com/twilight-sx/p/9760398.html
【题解】CF#960 H-Santa's Gift相关推荐
- 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
终于打了一场CF,不知道为什么我会去打00:05的CF比赛-- 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...
- 2021/10/24 2021ICPC江西省赛 部分个人题解 A,B,H,K,L,J
K Many Littles Make a Mickle 题目大意:有t组输入,每组输入一个n,一个m,表示有n层,第i层有i*i个房间,每个房间有m个人,求有多少人. 题解:数据小,暴力求和即可(也 ...
- 题解 CF 1413B A New Technique
原题 题面简化 TTT 组数据 用 nnn 行.mmm 列的不重数字按输入顺序组成一个矩阵 数据范围 1≤T≤1000001≤T≤1000001≤T≤100000 1≤n,m≤5001≤n,m≤500 ...
- CSUST选拔赛题解之-Problem H: 逃出监狱
Problem H: 逃出监狱 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 116 Solved: 42 [Submit][Status][Web ...
- CF Gym102059 H. Fractions
题目要求找到给定区间的化简后分子分母的和小于1000的数字的个数 我的想法是先找到所有的满足要求的最简分数(总数不超过1e6,而且远小于),然后对询问查找每个最简分数出现的次数. #include&l ...
- [题解]CF Round #386 (Div.2)
747A:Display Size 题意简述 给你 n n,求一对x,yx,y使得 x∗y=n x \ast y=n并且 x,y x,y最接近. 数据范围 n≤106 n \leq 10^6 思路 从 ...
- CF 1742C 题解 P8557 炼金术(Alchemy) 题解
温馨提示:\color{#E74C3C}\text{温馨提示:}温馨提示: 遇见题解勿抄袭,棕名封号两行泪.\color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪.}遇见题解勿抄袭, ...
- 【题解报告】ZJNU综合训练(2021.1.26)
[题解报告]ZJNU综合训练(2021.1.26) B C D F H I J M 综合训练 ZJNU综合训练(2021.1.26) B:DP+搜索 | CF 1057C C:组合数学+dp | CF ...
- 数据结构——马踏棋盘题解(贪心算法)
本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317 数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值 ...
最新文章
- GLM+广义线性模型
- JavaScript快速入门-ECMAScript本地对象(RexExp)
- 校园职业社交Handshake获1005万美金A轮融资
- Python基础教程:copy()和deepcopy()
- 使用centos7构建本地git服务器
- 【opencv系列06】OpenCV4.X滑动条操作
- linux下手动删除数据库实例
- 传值调用 与传地址调用(传引用)
- 哈佛大学单细胞课程|笔记汇总 (八)
- 156 13.67用matlab答案,MATLAB习题答案
- error C2265: 'Unknown' : reference to a zero-sized array is illegal
- 数字图像处理与python实现 岳亚伟_数字图像处理与Python实现
- 鼠标悬浮显示全部内容 不然隐藏部分内容
- Vue学习笔记----基础
- Hbase构建二级索引的一些解决方案
- c语言增量pi调节程序,增量式PI控制函数源代码(C语言)
- AutoIt教程资源汇总
- 你的颜值打几分?——基于tensorflow实现人脸打分模型
- 什么是跨域问题?跨域解决问题
- 分享一个吐血三升的GNS3 ASAv9.X直连ping不通的原因