CodeForces369C On Changing Tree

昨天的CF自己太挫了。一上来看到A题,就有思路,然后马上敲,但是苦于自己很久没有敲计数的题了,许多函数都稍微回忆了一阵子。A题的主要做法就是将每个数质因数分解,统计每个质因子的个数,对于每个质因子pi的个数k,等价于解一个方程x1+x2+...+xn=k的有多少个非负整数解,学过离散数学或者一些组合数学的就会知道,答案是C(k,n+k-1),但是由于n+k-1可能会很大,我一开始考虑小了,贡献了好多次RE,所以在算组合数的时候只能算出每个数的阶乘以及对应的逆元去算,然后将每个因子算出来的结果乘起来就可以了。

B的话写一下就会发现很明显的能够裂项,所以问题就转换成求u(n),v(n),n的大小达到10^9,但是基于素数的稠密性我们可以在有限的时间内算出来,10^11以内的相邻素数间隔貌似是在400多还是500多,每次判素数的复杂度是根号n,所以大致找出u(n),v(n)的时间是在10^7以内,这个在CF上绝对是可以算的,知道u,v后面的就是简单的计算一下。当然为了加快速度,可以考虑素性测试。

C的话拿到的时候时间不多了,想了一下就有了思路,但是10分钟真的打不出来,于是就想想算了。今天才打出来的。在树上对结点以及它的后代进行更新自然是先把这棵树搜成dfs序列,但是像题目这种,隔一层-k的怎么办呢? 可以考虑建两棵线段树,首先预处理出每棵树的深度dep,每次更新的时候就在第一棵线段树上每个结点加上x+k*dep[v],然后再在第二棵线段树上加上-k。 那么询问的时候怎么办呢? 询问的时候的答案就是 该结点在第一棵线段树上的值ans1,加上在第二棵线段树上的值ans2乘上对应结点的深度 即 ans1+ans2*dep[v]。可以优化的地方是其实并不需要建两棵,只是一棵线段数维护两个值而已,我写的这份代码很慢,1.9s,差不多都超时了,不过也没有办法啦。

#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cmath>
#include<map>
#define maxn 300500
#define ll long long
#define mod 1000000007
using namespace std;struct Node
{int l, r;ll add, sum;
};struct SegmentTree
{Node N[4 * maxn];void build(int i, int L, int R){N[i].l = L; N[i].r = R; N[i].sum = N[i].add = 0;if (L == R){return;}int M = (L + R) >> 1;build(i << 1, L, M);build(i << 1 | 1, M + 1, R);}void pushDown(int i){ll tt = N[i].add;if (N[i].l == N[i].r) return;if (tt != 0){(N[i << 1].add += tt) %= mod;(N[i << 1 | 1].add += tt) %= mod;(N[i << 1].sum += (N[i << 1].r - N[i << 1].l + 1)*tt%mod) %= mod;(N[i << 1 | 1].sum += (N[i << 1 | 1].r - N[i << 1 | 1].l + 1)*tt%mod) %= mod;N[i].add = 0;}}void pushUp(int i){N[i].sum = (N[i << 1].sum + N[i << 1 | 1].sum) % mod;}void add(int i, int L, int R, ll s){if (N[i].l == L&&N[i].r == R){(N[i].add += s) %= mod;(N[i].sum += (R - L + 1)*s) %= mod;return;}pushDown(i);int M = (N[i].l + N[i].r) >> 1;if (R <= M) add(i << 1, L, R, s);else if (L > M) add(i << 1 | 1, L, R, s);else add(i << 1, L, M, s), add(i << 1 | 1, M + 1, R, s);pushUp(i);}ll query(int i, int L, int R){if (N[i].l == L&&N[i].r == R){return N[i].sum;}pushDown(i);int M = (N[i].l + N[i].r) >> 1;if (R <= M) return query(i << 1, L, R);else if (L > M) return query(i << 1 | 1, L, R);else return query(i << 1, L, M) + query(i << 1 | 1, M + 1, R);//pushUp(i);}
}st[2];int n;
vector<int> G[maxn];
int dep[maxn];
int pre[maxn];
int post[maxn];
int dfs_clock;void dfs(int u, int fa,int d)
{pre[u] = ++dfs_clock;dep[u] = d;for (int i = 0; i < G[u].size(); i++){int v = G[u][i];if (v == fa) continue;dfs(v, u, d + 1);}post[u] = dfs_clock;
}int main()
{while (cin >> n){for (int i = 0; i <= n; i++) G[i].clear();int vi;for (int i = 2; i <= n; i++){scanf("%d", &vi);G[vi].push_back(i);G[i].push_back(vi);}dfs_clock = 0;dfs(1, -1, 0);st[0].build(1, 1, n); st[1].build(1, 1, n);int q; scanf("%d", &q);ll vq, xq, kq;int tq;for (int i = 0; i < q; i++){scanf("%d", &tq);if (tq == 1){scanf("%I64d%I64d%I64d", &vq, &xq, &kq);st[0].add(1, pre[vq], post[vq], (xq + dep[vq] * kq)%mod);st[1].add(1, pre[vq], post[vq], -kq);}else{ll ans = 0; scanf("%d", &vq);ans = (ans + st[0].query(1, pre[vq], pre[vq])) % mod;ans = (ans + st[1].query(1, pre[vq], pre[vq])*dep[vq]) % mod;ans = (ans + mod) % mod;printf("%I64d\n", ans);}}}return 0;
}

 

转载于:https://www.cnblogs.com/chanme/p/3571783.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6之const命令

一直以来以ecma为核心的js始终没有常量的概念&#xff0c;es6则弥补了这一个缺陷&#xff1b; const foofoo;foobar;//TypeError: Assignment to constant variable.上例声明了一个基本类型的常量&#xff0c;如过试图修改初始值则会报错&#xff1b;如果是引用类型的值同样适用…

C++和Rust_后端程序员一定要看的语言大比拼:Java vs. Go vs. Rust

这是Java&#xff0c;Go和Rust之间的比较。这不是基准测试&#xff0c;更多是对可执行文件大小、内存使用率、CPU使用率、运行时要求等的比较&#xff0c;当然还有一个小的基准测试&#xff0c;可以看到每秒处理的请求数量&#xff0c;我将尝试对这些数字进行有意义的解读。为了…

Hdu 2015 偶数求和

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2040。水题。CODE&#xff1a;1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <math.h>5 using namespace std;6 7 const int maxn 102;8 9 int save[ma…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波11 - 直方图处理 - 使用直方图统计量增强图像

使用直方图统计量增强图像 全局均值和方差 μn∑i0L−1(ri−m)np(ri)(3.24)\mu_{n} \sum_{i0}^{L-1} (r_{i} - m)^{n} p(r_{i}) \tag{3.24}μn​i0∑L−1​(ri​−m)np(ri​)(3.24) m∑i0L−1rip(ri)(3.25)m \sum_{i0}^{L-1} r_{i} p(r_{i}) \tag{3.25}mi0∑L−1​ri​p(ri​…

数据结构 --- 堆

to be continued转载于:https://www.cnblogs.com/zhongzhiqiang/p/5808564.html

HDU - 1723 - Distribute Message

先上题目&#xff1a; Distribute Message Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1186 Accepted Submission(s): 547 Problem DescriptionThe contest’s message distribution is a big thing in pre…

nodejs 图片处理模块 rotate_学会Pillow再也不用PS啦——Python图像处理库Pillow入门!...

你在用什么软件进行图像处理呢&#xff1f;厌倦了鼠标和手指的拖拖点点&#xff0c;想不想用程序和代码进行图像的高效处理&#xff0c;Python作为简单高效又很强大的一门编程语言&#xff0c;对于图像的处理自然也是轻松拿下&#xff0c;听起来是不是很酷很极客&#xff0c;那…

创建一个追踪摄像机(2)

为了生成曲线&#xff0c;函数需要通过4个在沿着重量值在0和1之间的路径上连贯的位置。由于重量在这些2个值之间增加&#xff0c;曲线返回在更远的路径上的坐标。 当所提供的重量值为0&#xff0c;曲线将返回正确的坐标在第二个输入坐标。当所提供的重量值为1&#xff0c;曲线将…

Xcodebuild自动打包

#! /bin/bash #firtoken 29b441056e1e17c984cb32fadadsdddd shell_dirdirname $0 TARGET_NAME"SmartLock" DIR_PATH/Users/用户名/Desktop/SmartLock SIGN"iPhone Distribution:******" PROFILE"66d127d6-7963-4c20-ac8b-47e4f0fe8742" TEMP_DIR…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波12 - 空间域滤波基础 - 卷积运算(numpy 实现的三种卷积运算)

这篇文章比较长&#xff0c;请耐心看空间域滤波基础线性滤波可分离滤波器核空间域滤波和频率域滤波的一些重要比较如何构建空间滤波器第一种卷积方法&#xff08;公式法&#xff09;第二种卷积的方法&#xff08;可分离核&#xff09;第三种方法&#xff08;img2col)这是分离核…

hdu_1861_游船出租_201402282130

游船出租 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7238 Accepted Submission(s): 2411 Problem Description 现有公园游船租赁处请你编写一个租船管理系统。当游客租船时&#xff0c;管理员输入船号并按…

acer清理工具 clear下载_SolidWorks绿色版下载-SolidWorks完全清理工具v1.0免费版

SolidWorks完全清理工具(SWCleanUninstall)是一款绿色免费的SolidWorks完全卸载工具。很多SolidWorks安装不成功都是因为之前安装错误做成软件残留。这款工具可以完全清理很多SolidWorks留下的注册表垃圾。软件核心功能1、SWCleanUninstall可以直接删除电脑上的SolidWorks软件2…

ZOJ1221 Risk 图形的遍历

一开始做图形遍历的题都是用链表做的&#xff0c;这次用数组体会到了方便但就是有点浪费。 不过题目给的内存限制已经足够了。 View Code 1 #include<cstdio>2 #include<cstdlib>3 #include<cstring>4 #include<queue>5 #include<iostream>6 7 …

Android 从AndroidManifest获取meta-data

语法如下&#xff1a; <meta-data android:name"string"android:resource"resource specification"android:value"string" /><meta-data>标签可以作为子标签&#xff0c;可以被包含在<activity>、<application> 、<s…

trim()函数

参数string&#xff1a;string类型&#xff0c;指定要删除首部和尾部空格的字符串返回值String。 函数执行成功时返回删除了string字符串首部和尾部空格的字符串&#xff0c;发生错误时 返回空字符串&#xff08;""&#xff09;。 如果参数值为null时&#xff0c;会抛…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波13 - 平滑低通滤波器 -盒式滤波器核

这里写目录标题平滑&#xff08;低通&#xff09;空间滤波器盒式滤波器核平滑&#xff08;低通&#xff09;空间滤波器 平滑&#xff08;也称平均&#xff09;空间滤波器用于降低灰度的急剧过渡 在图像重取样之前平滑图像以减少混淆用于减少图像中无关细节平滑因灰度级数量不…

python中str用法_python数据类型之str用法

1、首字母大写 语法&#xff1a;S.capitalize() ->str title "today is a good day"title_catitle.capitalize() print(title_ca) 结果&#xff1a;today is a good day 2、大写转小写 1 语法&#xff1a;S.casefold() ->str2 3 title "TODAY is a GOOD …

WPF 窗体设置

WPF 当窗体最大化时控件位置的大小调整&#xff1a; View Code 1 <Window x:Class"WpfApplication1.MainWindow"2 xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"3 xmlns:x"http://schemas.microsoft.com/wi…

Git实践

Git是什么自不必说。Git和gitlab安装和实践在后边的俩篇中会写。本篇仅重点写Git自动部署。Git同样有Hooks,可以用于各种需求。可以控制提交commit名称&#xff0c;可以控制代码规范&#xff0c;也当然包含以下要介绍的自动部署&#xff0c;也不仅包含这些。Git自动部署简单的思…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波14 - 平滑低通滤波器 -高斯滤波器核的生成方法

目录平滑&#xff08;低通&#xff09;空间滤波器低通高斯滤波器核统计排序&#xff08;非线性&#xff09;滤波器平滑&#xff08;低通&#xff09;空间滤波器 平滑&#xff08;也称平均&#xff09;空间滤波器用于降低灰度的急剧过渡 在图像重取样之前平滑图像以减少混淆用…