首页 > 其他分享 >20240726模拟赛订正题笔记

20240726模拟赛订正题笔记

时间:2024-07-26 16:20:58浏览次数:6  
标签:订正 int 权值 笔记 um LCA 20240726 节点 mod

(T1)lnsyoj2212 刷数组

考场上切掉了,所以来说说考场上的做法。
首先看数据范围,线段树并不能拿满分,所以考虑在数组上操作。
如何处理区间覆盖:记录一下区间覆盖的数,然后记录第几次覆盖,单点修改或增加时查看次数被覆盖了几次,若与正常覆盖次数不符,则将此数设为新的覆盖数。
考场代码如下:

#include <cstdio>
#define int long
using namespace std;
int ans;
int a[10000005];
int qtcs[10000005];
int qtshu;
int yqtcs;
int n,q;
signed main(){
	scanf("%ld%ld",&n,&q);
	for(int i=1;i<=q;i++){
		int opt;
		scanf("%ld",&opt);
		if(opt==1){
			int x,y;
			scanf("%ld%ld",&x,&y);
			if(qtcs[x]<yqtcs){
				a[x]=qtshu;
				qtcs[x]=yqtcs;
			}
			ans+=y-a[x];
			a[x]=y;
		}
		else if(opt==2){
			int x,y;
			scanf("%ld%ld",&x,&y);
			if(qtcs[x]<yqtcs){
				a[x]=qtshu;
				qtcs[x]=yqtcs;
			}
			ans+=y;
			a[x]+=y;
		}
		else if(opt==3){
			int y;
			scanf("%ld",&y);
			qtshu=y;
			ans=y*n;
			yqtcs++;
		}
		printf("%ld\n",ans); 
	}
	return 0;
}

(T2)lnsyoj2213 LCA 的统计

(考场上还想以为有规律呢,最后提交时还忘了记忆化,真是服了)
首先设\(f_{i}\)为当根节点的权值为i时所有LCA的和,\(g_{i}\)为当根节点的权值为i时树的节点数。
转移为:\(f_{i}=\begin{cases}2f_{i/2}+i(g_{i}^{2}-2g_{i/2}^2)&i\%2==0\\f_{i/2}+f_{i/2+1}+i(g_{i}^{2}-g_{i/2}^2-g_{i/2+1}^2)&i\%2==1\end{cases}\)
\(g_{i}=\begin{cases}2g_{i/2}+1&i\%2==0\\g_{i/2}+g_{i/2+1}+1&i\%2==1\end{cases}\)
可以通过打表找规律得知\(g_{i}=2i-1\)。
原因:因为一个根节点为i的树的左右子树都为神奇的树,所以肯定将左右两个树的权值进行合并,然后需要考虑一下几种情况:
1.左子树与根节点的LCA总和,因为左子树与根节点的LCA一定为根节点,所以权值都采用根节点的。
2.右子树与根节点的LCA总和,与左子树相似。
3.左子树与右子树的LCA总和,因为左子树与右子树的LCA显然为根节点,所以权值都采用根节点的。
4.根节点与根节点的LCA总和,直接加一吧。
所以会发现除了左右子树内的贡献不采用根节点,其余的均采用根节点的权值。
dp时进行记忆化搜索,记忆化时用map或unordered_map维护,时间复杂度\(O(Tlog_{n})\),取模细节超级多,说不定哪就挂了。。。。。。
代码如下:

#include <cstdio>
#include <algorithm>
#include <unordered_map>
#define int long long
#define mod 1000000007
using namespace std;
unordered_map<int,int> um;
inline int g(int i){
	return (2*i%mod-1+mod)%mod;
}
int dfs1(int i){
	if(um[i]!=0){
		return um[i];
	}
	if(i&1){
		um[i]=((dfs1(i/2+1)+dfs1(i/2))%mod+i%mod*(((g(i)*g(i)%mod-g(i/2+1)*g(i/2+1)%mod+mod)%mod-g(i/2)*g(i/2)%mod+mod)%mod)%mod)%mod;
		return um[i];
	}
	else{
		um[i]=((dfs1(i/2)*2)%mod+i%mod*(((g(i)*g(i)%mod-g(i/2)*g(i/2)%mod+mod)%mod-g(i/2)*g(i/2)%mod+mod)%mod)%mod)%mod;
		return um[i];
	}
}
int T;
signed main(){
	um[1]=1;
	scanf("%lld",&T);
	for(int i=1;i<=T;i++){
		int n;
		scanf("%lld",&n);
		printf("%lld\n",dfs1(n));
	}
	return 0;
}

标签:订正,int,权值,笔记,um,LCA,20240726,节点,mod
From: https://www.cnblogs.com/Owen1234/p/18325518

相关文章

  • AC 自动机学习笔记
    1.引入1.1.问题描述给定一个长度为\(n(1\len\le10^5)\)的字符串和\(m\)个模式串\(s_1,\cdots,s_m\),求问字符串中出现了多少个模式串。\(\sums_i\le10^5\)。1.2.解法考虑当\(m=1\)的情况,直接跑KMP就可以了。但是如果\(m\)特别大时,跑KMP的复杂度......
  • 【学习笔记】最小生成树
    提示:文中代码是按照洛谷题目P3366【模板】最小生成树编写的。讲的有可能不全部正确,请指出。伪代码并不标准,但能看。MST介绍MST(最小生成树,全称MinimumSpanningTree)是指一张有向连通图中边权之和最小的一棵树。最小生成树的构造目前其实有三种算法,常用的Kruskal、Pri......
  • 基于CAT的VBM和SBM计算学习笔记(二)感兴趣区(ROI)&全脑体积(TIV)
    前言 回顾一下上文:之前学习了用CAT计算VBM灰质体积的预处理过程,主要分为三步:Preprocessing:从使用DPABI生成T1图像再校准T1原点。Segement:CAT软件自带的自动化分割。Smooth:最后用Spm进行平滑操作。基于CAT的VBM和SBM计算学习笔记(一)VBMhttps://mp.csdn.net/mp_blog/creat......
  • Kruskal 重构树学习笔记
    Kruskal想必大家都不陌生,这是一种求最小生成树的算法。关于Kruskal重构树,就是把一张图转化为一个堆。具体来说,我们可以处理出来从\(u\)到\(v\)路径中的点权或边权的极值。比如上面这张图(前为编号,[]内为点权),我们可以将它重构为小顶堆,如下请注意,这棵树有着严格的方向,......
  • 不依赖本地系统调度jupyter笔记本
    是否可以在不依赖本地系统的情况下调度使用一个驱动器文件的jupyter笔记本。我在公司的共享点中创建了一个驱动器的快捷方式,并在我的jupyter笔记本中读取这些文件(笔记本从onedrive读取csv文件)。我目前每天在jupyterlab中安排笔记本,但这是在我的本地系统中,需要每天打开我......
  • C++自学笔记17(const和mutable)
    const在之前的笔记中我们出现很多次constchar*name=“shaojie”,定义一个不可变指针存放字符串。不可变就来自const,表示“只读、常量”为什么需要它呢?我们需要一些东西不可被修改。const加数据变量#include<iostream>intmain(){constintMAX_AGE=99;M......
  • C++自学笔记18(成员初始化列表和初始化对象)
    成员列表初始化创建变量,并将其初始化是创建函数的必要部分。#include<iostream>#include<string>classEntity{private:std::stringm_name;public:Entity(){m_name="nothing"}Entity(conststd::string&name){......
  • 《左耳听风 传奇程序员练级攻略》读书笔记
    本书是程序员大牛陈皓的文章汇总,内容包括技术、沟通、工程师文化等,通读之后摘录其中精华部分。开卷有益,能读到摘录部分也会收益,当然最好是去读原文,知识转化效率更高。除本书之外,还有一些他的文章也非常值得阅读,包括程序员如何变现,如何学习英语主题等。05有竞争力的程序员好的......
  • React18学习笔记 第六篇:对React内部运作深入了解
    Part1组件之间的概念差异·组件组件是我们为了描述用户界面的一部分而编写的,它只是一个普通的JavaScript函数,但它是一个返回React式元素的函数,这些元素是用JSX语法来编写的,我们可以把组件理解为一个“蓝图”或“模板”。·组件实例一个组件实例就像是一个组件的实际物理表......
  • 计组笔记第六章——总线
    6.1.1总线概述总线简图:总线的物理实现:“一根”;数据总线可能包含多跟信号线,所有硬件部件都可以通过这跟总线传递数据。同一时刻只能有一个部件发送数据,但可以有多个部件接受数据。基本概念总线的定义:总线是一组能为多个部件分时共享的公共信息传送线路。为什么要用总线......