首页 > 其他分享 >[CF1981E] Turtle and Intersected Segments 题解

[CF1981E] Turtle and Intersected Segments 题解

时间:2024-11-10 15:19:25浏览次数:1  
标签:Turtle 颜色 int 题解 Segments st ln return 复杂度

好题好题。


难点在建图,因为图的边数将会决定最小生成树的时间复杂度。我们肯定希望能够只建 \(O(n)\) 级别的边,这样时间复杂度就可以做到 \(O(n\log n)\)。

观察到当 \(i,j,k\) 三个区间能够互相连边时(这里假设 \(a_i<a_j<a_k\)),我们绝对不会连 \((i,k)\) 这条边。

那么假如我们将所有区间按 \(a\) 值大小从小到大排序,每次将当前区间与该区间中所有颜色连边,然后再将这个区间染上新颜色,我们就能保证不会连上述所谓的 \((i,k)\) 边。这很明显是可以珂学解决的。

考虑证明珂朵莉树时间复杂度正确性(实际上也是在证明边数正确性)。

假设原先有 \(x\) 个颜色段,若连 \(y\) 条边,则至少减少 \(y-3\) 个颜色段(除最左边的颜色和最右边的颜色外,中间所有颜色块都一定会被删去,同时全部更新为一个新的颜色段),假如 \(y\) 很小,那么本次操作的单次时间复杂度可忽略不计;假如 \(y\) 很大,则本次操作减少的颜色段数将与花费的时间复杂度在一个量级,就相当于这些参与连边操作的颜色段将不会再次花费时间复杂度,总体时间复杂度依旧正确。

所以我们 极端口胡的 证明了边数级别就是 \(O(n)\),那么珂朵莉树时间复杂度就是 \(O(n\log n)\)。

最小生成树就不用说了。

最终时间复杂度 \(O(n\log n)\),可以通过。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+5;
int t,n,m,k,ans,fa[N];
struct edge{int x,y,w;}ed[N];
struct line{int l,r,a;}ln[N];
int cmp(edge x,edge y){
	return x.w<y.w;
}int cmp2(line x,line y){
	return x.a<y.a;
}struct odt{
	int l,r;
	mutable int v;
	bool operator<(const odt &c)const{
		return l<c.l;
	}
};set<odt>st;
#define iter set<odt>::iterator
struct chtholly{
	iter spilt(int x){
		iter it=st.lower_bound({x,0,0});
		if(it!=st.end()&&(*it).l==x) return it;
		it--;if((*it).r<x) return st.end();
		int l=(*it).l,r=(*it).r,v=(*it).v;
		st.erase(it);st.insert({l,x-1,v});
		return st.insert({x,r,v}).first;
	}void assign(int l,int r,int v){
		iter tr=spilt(r+1),tl=spilt(l);
		st.erase(tl,tr);st.insert({l,r,v});
	}void con(int l,int r,int id){
		iter tr=spilt(r+1),tl=spilt(l);
		for(iter it=tl;it!=tr;it++) if((*it).v)
			ed[++m]={id,(*it).v,ln[id].a-ln[(*it).v].a};
	}
}seniorious;
void init(){
	for(int i=1;i<=n;i++) fa[i]=i;
}int find(int x){
	return fa[x]=(fa[x]==x?x:find(fa[x]));
}void solve(){
	cin>>n,init(),m=ans=0,k=n;
	for(int i=1;i<=n;i++)
		cin>>ln[i].l>>ln[i].r>>ln[i].a;
	sort(ln+1,ln+n+1,cmp2);
	st.clear(),st.insert({1,(int)1e9,0});
	for(int i=1;i<=n;i++){
		seniorious.con(ln[i].l,ln[i].r,i);
		seniorious.assign(ln[i].l,ln[i].r,i);
	}sort(ed+1,ed+m+1,cmp);
	for(int i=1;i<=m;i++){
		int x=find(ed[i].x);
		int y=find(ed[i].y);
		if(x==y) continue;
		k--,fa[x]=y,ans+=ed[i].w;
		if(k==1){
			cout<<ans<<"\n";
			return;
		}
	}cout<<"-1\n";
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0); 
	cin>>t;
	while(t--) solve();
	return 0;
}/*
In this world where the sun dips in the west.
Set in the heavenly forest.
When this war is over.
The people who do not return and the multitudes who look on.
In the name of justice.
A past that will never die,The fading future.
I'm back.Even if the sun is fading.
Even if I can't see the future.
The light of this moment.
I hope you won't forget.
---- The Happiest Girl in the World
*/

标签:Turtle,颜色,int,题解,Segments,st,ln,return,复杂度
From: https://www.cnblogs.com/chang-an-22-lyh/p/18537982/cf1981-turtle_and_intersected_segments-

相关文章

  • ABC379E 题解
    ABC379E题解一道很好的题,开始还以为是高精度来着,但是发现不必要也不能用高精度,而是用一种技巧代替。题意Youaregivenastring\(S\)oflength\(N\)consistingofdigitsfrom1through9.Foreachpairofintegers\((i,j)\(1\leqi\leqj\leqN)\),define\(f(......
  • CF2030D QED's Favorite Permutation 题解
    题目传送门前置知识差分解法对于移动,我们可以无脑进行交换来保证移动,然后将中途交换的位置再交换回去。通过手摸不难发现,\(p_{i}\)能移动到\(i\)当且仅当\(s_{\min(i,p_{i})\sim\max(i,p_{i})}\)中不含有LR子串。反向考虑,即LR子串不被上述区间包含,差分判断即可。......
  • 题解:[ABC379D] Home Garden
    [ABC379D]HomeGarden题意:开始有一个空集,有\(Q\)次操作,每次有标识数\(op\):若\(op\)为\(1\):为集合添加一个元素\(0\)。若\(op\)为\(2\):输入\(T\),为集合内所有元素增加\(T\)。若\(op\)为\(3\):输入\(H\),删除集合内不小于\(H\)的元素,并输出删除元素个数。......
  • 题解:AT_abc379_e [ABC379E] E - Sum of All Substrings
    很水的一道题。我们先把题目上各地的数字看成一个序列,然后考虑计算该序列分别会对答案的每一位产生多少贡献。具体的,我们从后往前考虑答案的每一位。通过简单推演可知,设你当前考虑到答案的第\(i\)个数字,那么原序列对这一位的贡献为\(\sum_{j=1}^{n-i+1}a_j\timesj\)。这个......
  • 题解:AT_abc379_d [ABC379D] Home Garden
    难度严格小于C题。你考虑每盆花被种植的时间一定单调不降,这启示我们去用二分。具体的,我们用一个数组\(a\)表示当前所有的花的种植时间,并记录一个当前时间\(t\)。对于每个1操作都在数组后面加上个元素\(t\),对于\(2\)操作让\(t\leftarrowt+T\)。对于操作3,能够摘取的......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解
    总体情况A-Cyclic题意给你一个三位整数\(N\),其中每个数字都是介于\(1\)和\(9\)之间的整数。设\(a\),\(b\),\(c\)分别是\(N\)的百位、十位和个位数。打印一个按此顺序排列\(b\),\(c\),\(a\)所组成的整数,以及一个按此顺序排列\(c\),\(a\),\(b\)所组成......
  • 2024.11.9组队训练题解记录
    Teleportation鲍勃最近访问了一个奇怪的传送系统。该系统包含\(n\)个房间,编号为\(0\)到\(n-1\)。每个房间都安装了一个传送设备。每个传送设备都有一个看起来像钟表表面的仪表板,上面有一个指针,显示数字\(0\)到\(n-1\),按顺时针顺序排列。最初,第\(i\)个房间的传送设备上......
  • P4156 论战捆竹竿 题解
    论战捆竹竿题意:给定字符串\(s\),计数"串\(t\)的长度"可能的种数有多少种,使得\(t\)能被\(s\)作为印章印出来,且\(|t|\lew\)。\(n=|s|\le5\times10^5\),\(n\lew\le10^{18}\)。第一步:求出\(s\)的周期\(\{a_1\sima_m\}\),包含\(n\)(\(a_m=n\))。转化为求\(\suma_ib......
  • 题解:P11248 [GESP202409 七级] 矩阵移动
    笑点解析:这个人所在城市考试当天刮台风了,没考,免费送了一次12月的考试。设计这么一个东西:\(dp_{i,j}\)表示到格子\((i,j)\)的最大分数。本来还好,但现在的问题是,如果这个格子是‘?’,我哪儿知道到底可不可以变啊?万一变得太多了,那,那不就废了!万一少了,那我分不就没了?所以我们......
  • agc032 A~E 题解
    a倒推,每次删掉最后一个b[i]=i的即可b一开始发现可以构造完全二分图,使两边和同为S,这样每个点的和=对面二分图点的和=S,然后n=6和为奇数进一步发现可以直接分成A组组内和为B的组,然后组之间连边,此时S=(A-1)B,有AB=n(n+1)/2当n为奇数时取A=(n+1)/2,B=n,n单独一组其他大匹配小;n为偶数......