首页 > 其他分享 >CF293E Close Vertices

CF293E Close Vertices

时间:2024-08-20 21:37:42浏览次数:5  
标签:int siz Vertices mk maxs second buc Close CF293E

对于这种树上路径统计问题,一个经典解法就是点分治。

如果没有两个限制,还是很简单的,对于单个限制,使用树状数组来解决就行了。

但是这道题目要求两个限制,有点像二维偏序,但不完全是。可以说是分成了几个段,每个段之间求二维偏序,而要求段内不能产生贡献。如果这么表述这个问题的话,那就很好解决了:把段内的贡献先求出来,再求出总的贡献,减去即可。

但是如果在表述问题时用:子树内与已经记录的桶内的贡献,那么就死路一条了。

这给了两个启示:1.点分治不要拘泥于每个子树与已经记录的桶之间的关系。2.尝试转化问题,把问题用比较形式化的语言表述出来(比如“子树”这个说法,其实它是不是个树无所谓)。

注意有个易错点:不要搞混了限制中的 \(l,w\) 与双指针中的 \(l\),边权的 \(w\)。

#include <bits/stdc++.h>

using namespace std;

#define typ int
inline char gc(){static char buf[100000] , *p1 = buf , *p2 = buf;return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;}inline typ read(){typ x = 0; bool f = 0;char ch = gc();while(!isdigit(ch)){f |= (ch == '-');ch = gc();}while(isdigit(ch)){x = (x << 1) + (x << 3) + (ch ^ 48);ch = gc();}return (f ? -x : x);}

typedef long long ll;

const int N = 1e5 + 5;

int n , L , W;
vector<pair<int,int> > E[N];

int siz[N] , dis[N] , wsum[N] , mk[N];
pair<int,int> buc[N] , Buc[N]; int o , O;

namespace BIT {
#define lowbit(x) (x & (-x))
	int t[N];
	void add(int x , int v){
		while(x <= n){
			t[x] += v;
			x += lowbit(x);
		}
	}
	ll qwq(int x){
		if(x < 0) return 0;
		ll res = 0;
		while(x){
			res += t[x];
			x -= lowbit(x);
		}
		return res;
	}
}

signed main(){
	n = read() , L = read() , W = read();
	
	for(int i = 2; i <= n; ++ i){
		int v = read() , w = read();
		E[i].push_back({v , w});
		E[v].push_back({i , w});
	}
	
	int rt , sum;
	function<void(int,int)> getrt = [&] (int u , int fa){
		siz[u] = 1;
		int maxs = 0;
		for(auto e : E[u]){
			int v = e.first;
			if(v == fa || mk[v]) continue;
			
			getrt(v , u);
			
			siz[u] += siz[v];
			maxs = max(maxs , siz[v]);
		}
		maxs = max(maxs , sum - siz[u]);
		if(maxs <= sum / 2) rt = u;
	};
	
	function<void(int,int)> getdis = [&] (int u , int fa){
		buc[ ++ o] = {wsum[u] , dis[u]};
		for(auto e : E[u]){
			int v = e.first , w = e.second;
			if(v == fa || mk[v]) continue;
			
			dis[v] = dis[u] + 1;
			wsum[v] = wsum[u] + w;
			
			getdis(v , u);
		}
	};
	
	ll ans = 0;
	function<void(int)> calc = [&] (int u){
		O = 0;
		for(auto e : E[u]){
			int v = e.first , w = e.second;
			if(mk[v]) continue;
			
			wsum[v] = w , dis[v] = 1;
			o = 0;
			getdis(v , u);
			
			sort(buc + 1 , buc + o + 1);
			for(int i = 2; i <= o; ++ i) BIT::add(buc[i].second , 1);
			for(int i = 1; i <= o; ++ i) Buc[ ++ O] = buc[i];
			for(int l = 1 , r = o; l < r; ){// calculating l , r is border
				while(l < r && buc[r].first + buc[l].first > W) BIT::add(buc[r -- ].second , -1);
				ans -= BIT::qwq(L - buc[l].second);
				if( ++ l <= r) BIT::add(buc[l].second , -1);
			}
		}
		Buc[ ++ O] = {0 , 0};
		sort(Buc + 1 , Buc + O + 1);
		for(int i = 2; i <= O; ++ i) BIT::add(Buc[i].second , 1);
		for(int l = 1 , r = O; l < r;){// calculating l , r is border
			while(l < r && Buc[r].first + Buc[l].first > W) BIT::add(Buc[r -- ].second , -1);
			ans += BIT::qwq(L - Buc[l].second);
			if( ++ l <= r) BIT::add(Buc[l].second , -1);
		}
	};
	
	function<void(int)> work = [&] (int u) {
		mk[u] = 1;
		calc(u);
		for(auto e : E[u]){
			int v = e.first;
			if(mk[v]) continue;
			
			getrt(v , u);
			sum = siz[v];
			getrt(v , u);
			
			work(rt);
		}
	};
	
	sum = n;
	getrt(1 , 0);
	
	work(rt);
	
	printf("%lld" , ans);
	
	return 0;
}

标签:int,siz,Vertices,mk,maxs,second,buc,Close,CF293E
From: https://www.cnblogs.com/TongKa/p/18370368

相关文章

  • git clone 网络太差总是失败:error: RPC 失败。curl 92 HTTP/2 stream 5 was not close
    ❯gitclonehttps://github.com/Almamu/linux-wallpaperengine.git.正克隆到'.'...remote:Enumeratingobjects:6271,done.remote:Countingobjects:100%(1447/1447),done.remote:Compressingobjects:100%(628/628),done.error:RPC失败。curl92HTT......
  • Android Camera close异常导致app的input ANR案例分析
    1.背景在日常的项目开发过程中,经常会收到用户或者测试同仁报过来的ANR(ApplicationNotResponse)的问题,本文结合作者的日常工作中遇到的典型案例,分享ANR的分析过程。ANR(‌ApplicationNotResponding)‌主要分为以下几种类型:‌Inputdispatchingtimedout:‌当输入事件(......
  • Linux系统编程-open,close,重载和变参
    open函数open的用法第一个参数是待打开的文件名,第二个参数是位图。flags(位图)必须包含以下三项:只读,只写,读写。0个或多个文件的创建选项和文件的状态选项,可以以按位或的方式放到文件中去。第一个为只读。第二个为读写。第三个为只写,并且文件不存在的话要创建,而且文件......
  • 使用CloseableHttpClient 访问 http 和https 的get请求
    publicclassHttpClientUtil{privatestaticLoggerlogger=LoggerFactory.getLogger(HttpClientUtil.class);/***带参数的get请求**@paramurl*@paramparam*@returnString*/publicstaticStringdoGet(Stringurl,Map<S......
  • 【YashanDB知识库】stmt未close,导致YAS-00103 no free block in sql main pool part 0
    问题现象问题单:YAS-00103nofreeblockinsqlmainpoolpart0,YAS-00105outofmemorytoallocatehashtableofsize=256现象:业务处理sql时,报错YAS-00103nofreeblockinsqlmainpoolpart0问题风险及影响业务处理报错,影响功能使用问题影响版本客户版本:22.2.4......
  • Mike11闸门中Close和Unchanged的区别
    前言:近期研究了一个简单的闸门调度方式。调度方式设置一:闸门上游水位(Hups)达到某个水位时,闸门打开,否则关闸门即:闸门上游水位(Hups)达到某个水位时,闸门打开,否则关闸门。根据以上调度要求设置了如下图的参数:通过以上的结果,各位不难看出,闸门是不断的开关的,当水位高则开,水位......
  • Linux---open和close函数
    open:这是对文件权限的说明。注意:返回上一个工作目录:cd-close函数:关闭文件注意:在对C语言代码进行了修改时,必须要都运行的文件重新编译,然后在重新运行。不然,输出的结果不会发生改变。今日标语“努力不一定成功,但不努力一定不会成功。”......
  • java java.nio.channels.ClosedChannelException
    java.nio.channels.ClosedChannelException报错信息"java.nio.channels.ClosedChannelException"表示尝试在一个已经关闭的通道上进行操作。在JavaNIO中,通道(Channel)表示一个可以进行IO操作的对象,例如读取或写入数据。当你尝试在一个已经被关闭的通道上进行读取、写入或者其他......
  • 【论文翻译】DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in C
    本翻译来自大模型翻译,如有不对的地方,敬请谅解引言开源社区通过开发诸如StarCoder(Li等人,2023b;Lozhkov等人,2024)、CodeLlama(Roziere等人,2023)、DeepSeek-Coder(Guo等人,2024)和Codestral(MistralAI,2024)等开源代码模型,在推进代码智能方面取得了显著进展。这些模型的性能已稳步接近......
  • DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intellig
    DeepSeek-Coder-V2:BreakingtheBarrierofClosed-SourceModelsinCodeIntelligence相关链接:arxivgithub关键字:开源、代码智能、混合专家模型(MoE)、编程语言支持、上下文长度扩展摘要我们介绍了DeepSeek-Coder-V2,这是一个开源的混合专家(MoE)代码语言模型,其性......