1 条题解

  • 0
    @ 2025-8-24 22:47:20

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Gao_yc
    谁需要这不解风情又潦草的总结

    搬运于2025-08-24 22:47:20,当前版本为作者最后更新于2023-05-21 09:40:45,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目实际上是要求图的连通块情况。

    不妨设 faifa_i 为 与 ii 联通的点的最小编号,那么题目就能转化为求 faifa_i

    于是有两种情况:

    1.fai=ifa_i=i,即 ii1i11 \sim i-1 的点均不连通,是一个新加入的连通块。

    2.fai<ifa_i < i

    先考虑如何判断第一种情况。

    rtirt_i 表示满足前 ii 个点联通的礼物编号,那么只要满足 rti1rti=Connected(rti1,i1,i)rt_{i-1} \ne rt_i = Connected(rt_{i-1},i-1,i) 即可。

    而对于第二种情况,可以二分查找 faifa_i,通过查询 Connected(rtmid,mid,i)Connected(rt_{mid},mid,i) 是否为 rtmidrt_{mid} 来判断。

    设连通块个数为ss,则询问次数为 O((ns)logn)\mathcal{O}((n-s) \log n)

    但是这样可以被特定的数据卡掉。

    优化:

    显然,如果 Connected(rtx,x,i)=rtxConnected(rt_x,x,i)=rt_x,那么 Connected(rtfax,fax,i)=rtfaxConnected(rt_{fa_x},fa_x,i)=rt_{fa_x},而 faxxfa_x \le x

    因此如果 xx 满足条件,faxfa_x 必定也满足条件。

    于是我们只要二分 fai=ifa_i=i 的点就好了。

    询问次数 O((ns)logs)\mathcal{O}((n-s) \log s)

    优化效果:构造 n=m=200n=m=200 的数据,不加优化询问次数 13901390

    优化之后询问次数 570570

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=210;
    int rt[N],fa[N],cnt,las;
    int a[N],top;
    vector<pair<int,int> > ans;
    int Connected(int a, int i, int j);
    void DescribeDesign(std::vector<std::pair<int, int>> result);
    void ToyDesign(int n,int max_ops){
    	fa[1]=1;rt[1]=0;a[top=1]=1;
    	for(int i=2;i<=n;++i){
    		rt[i]=Connected(rt[i-1],i-1,i);cnt++;
    		if(rt[i]!=rt[i-1]){
    			fa[i]=i;
    			a[++top]=i;
    			continue;
    		}
    		int l=1,r=top,res=0;
    		while(l<=r){
    			int mid=(l+r)>>1;
    			if(a[mid]==i-1) {r=mid-1;continue;} 
    			cnt++;
    			if(Connected(rt[a[mid]],a[mid],i)==rt[a[mid]]) r=mid-1;
    			else l=mid+1,res=mid;
    		}
    		fa[i]=a[res+1];
    	}
    	for(int i=1;i<=n;++i) if(fa[i]!=i) ans.push_back(make_pair(fa[i],i));
    	DescribeDesign(ans);
    	return;
    }
    
    • 1

    信息

    ID
    8721
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者