好久没有写过数据结构题目了,果然还是太不自信。实际上就是要求统计一个式子:

  \(\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相关推荐

  1. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛-- 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  2. 2021/10/24 2021ICPC江西省赛 部分个人题解 A,B,H,K,L,J

    K Many Littles Make a Mickle 题目大意:有t组输入,每组输入一个n,一个m,表示有n层,第i层有i*i个房间,每个房间有m个人,求有多少人. 题解:数据小,暴力求和即可(也 ...

  3. 题解 CF 1413B A New Technique

    原题 题面简化 TTT 组数据 用 nnn 行.mmm 列的不重数字按输入顺序组成一个矩阵 数据范围 1≤T≤1000001≤T≤1000001≤T≤100000 1≤n,m≤5001≤n,m≤500 ...

  4. CSUST选拔赛题解之-Problem H: 逃出监狱

    Problem H: 逃出监狱 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 116  Solved: 42 [Submit][Status][Web ...

  5. CF Gym102059 H. Fractions

    题目要求找到给定区间的化简后分子分母的和小于1000的数字的个数 我的想法是先找到所有的满足要求的最简分数(总数不超过1e6,而且远小于),然后对询问查找每个最简分数出现的次数. #include&l ...

  6. [题解]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 思路 从 ...

  7. CF 1742C 题解 P8557 炼金术(Alchemy) 题解

    温馨提示:\color{#E74C3C}\text{温馨提示:}温馨提示: 遇见题解勿抄袭,棕名封号两行泪.\color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪.}遇见题解勿抄袭, ...

  8. 【题解报告】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 ...

  9. 数据结构——马踏棋盘题解(贪心算法)

    本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317 数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值 ...

最新文章

  1. GLM+广义线性模型
  2. JavaScript快速入门-ECMAScript本地对象(RexExp)
  3. 校园职业社交Handshake获1005万美金A轮融资
  4. Python基础教程:copy()和deepcopy()
  5. 使用centos7构建本地git服务器
  6. 【opencv系列06】OpenCV4.X滑动条操作
  7. linux下手动删除数据库实例
  8. 传值调用 与传地址调用(传引用)
  9. 哈佛大学单细胞课程|笔记汇总 (八)
  10. 156 13.67用matlab答案,MATLAB习题答案
  11. error C2265: 'Unknown' : reference to a zero-sized array is illegal
  12. 数字图像处理与python实现 岳亚伟_数字图像处理与Python实现
  13. 鼠标悬浮显示全部内容 不然隐藏部分内容
  14. Vue学习笔记----基础
  15. Hbase构建二级索引的一些解决方案
  16. c语言增量pi调节程序,增量式PI控制函数源代码(C语言)
  17. AutoIt教程资源汇总
  18. 你的颜值打几分?——基于tensorflow实现人脸打分模型
  19. 什么是跨域问题?跨域解决问题
  20. 分享一个吐血三升的GNS3 ASAv9.X直连ping不通的原因

热门文章

  1. EOS1.1版本新特性介绍
  2. easyui弹出窗关闭前调用确认窗口,先关闭页面后调用弹出窗口
  3. Host aggregate分区
  4. Flipping elements with WPF
  5. 解决vs2005中文乱码问题
  6. (进阶)LeetCode(766)——托普利茨矩阵(JavaScript)
  7. js中短路运算符 ||
  8. 逻辑删除用户后 用户名重复怎么办?
  9. 家庭的和谐稳定由什么决定?
  10. 养老金上涨后,退休老人每个月6500元的养老金,属于什么水平?