首页 > 其他分享 >[ARC141E] Sliding Edge on Torus 题解

[ARC141E] Sliding Edge on Torus 题解

时间:2023-12-05 09:00:21浏览次数:46  
标签:typedef ch gcd int 题解 Torus long Edge define

题目链接

点击打开链接

题目解法

比较套路的题
首先画个图,然后把 \(y-x\) 相同的变成一个点(使 \(y>x\))
然后再两个点之间连有权边

那么问题就变成求新图的每个连通块中形成的原图的连通块数量
手玩几个数据发现,原图的连通块数量即为新图的所有环长的 \(\gcd\),再和 \(n\) 的 \(\gcd\)
根据有向图所有环的 \(\gcd\) 的求法,不难得出无向图所有环的 \(\gcd\) 求法
即为找到所有的非树边,假设是 \(x,y\),长度为 \(z\),记 \(dis_u\) 为 \(u\) 到根的距离,则环长的 \(\gcd\{z-dis_x+dis_y\}\)

上面的式子可以用带权并查集维护

时间复杂度 \(O(n\log n)\)(不算并查集)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=200100;
int n,m,fa[N],w[N],g[N];
LL ans;
int get_father(int x){
    if(x==fa[x]) return x;
    int ret=get_father(fa[x]);w[x]=(w[x]+w[fa[x]])%n;
    return fa[x]=ret;
}
void merge(int x,int y,int c){
    int fax=get_father(x),fay=get_father(y);
    if(fax==fay){
        ans-=g[fax];
        g[fax]=__gcd(g[fax],(w[x]-w[y]+c+n)%n);
        ans+=g[fax];return;
    }
    ans-=g[fax]+g[fay];
    g[fax]=__gcd(g[fax],g[fay]);
    ans+=g[fax];
    fa[fay]=fax,w[fay]=(c+w[x]-w[y]+n)%n;
}
int main(){
    n=read(),m=read();
    ans=1ll*n*n;
    F(i,0,n-1) fa[i]=i,g[i]=n;
    F(i,1,m){
        int a=read(),b=read(),c=read(),d=read();
        b=(b-a+n)%n,c=(c-a+n)%n,d=(d-a+n)%n;//let a=0
        if(c>d) d+=n;
        int x=b,y=d-c;
        merge(x,y,c);
        printf("%lld\n",ans);
    }
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:typedef,ch,gcd,int,题解,Torus,long,Edge,define
From: https://www.cnblogs.com/Farmer-djx/p/17876463.html

相关文章

  • [AGC061C] First Come First Serve 题解
    题目链接点击打开链接题目解法易知总情况数为\(2^n\)考虑重复计算的情况为:存在\([l_i,r_i]\),满足没有\([l_j,r_j](i\neqj)\)选在此区间中可以得到一个容斥的\(dp\)做法这个转移虽然感觉很显然,但卡了我一个晚上,一直调不出令\(f_i\)为到\(i\)的容斥情况下的权值和......
  • [CF1902] Educational Codeforces Round 159 A~E 题解
    [CF1902]EducationalCodeforcesRound159A~E题解A.BinaryImbalance很快观察到如果有不同的相邻元素,那么一定有解,意味着如果全是1无解,其他有解B.GettingPoints题面很长,可以发现,最好的偷懒方式一定是把所有的课都拖到最后几天上(真实),可以简单调整证明这样是不劣的,最后......
  • CF1833G Ksyusha and Chinchilla 题解
    题意:思路:当$n\not\equiv0\space(mod\space3)$时,无解;当$n\equiv0\space(mod\space3)$时,设$size_u$表示以$u$为根的子树还剩余的节点个数,自根节点向叶子节点递归,返回时进行处理节点$u$:设节点$u$的子节点为长度为$len$的序列$v$,设......
  • [ARC120E] 1D Party 题解
    提供二分+DP做法。Solution题意给出\(n(\le2\times10^5)\)个单调递增偶整数\(a_i\),求最小的\(k\)满足每一个\(i\)都可以在\(k\)时刻之前(含)与相邻的数相遇。每个单位时间可以移动一个单位距离。思路启发式思考在想到正解之前,我们可以想想类正解。显然,在时间一单......
  • CF1695C Zero Path 题解
    题意:思路:设$minv$表示路径最小权值和,$maxv$表示路径最大权值和。当且仅当路径长度$n+m-2\equiv0\space(mod\space2)$且$minv\le0\lemaxv$时,一定有权值和为$0$的路径;否则,一定没有权值和为$0$的路径。证明:由于只能向右或向下走,路径长度......
  • CF1163B2 Cat Party (Hard Edition) 题解
    题意:思路:对于满足条件的区间$[1,x]$,有如下三种情况:$1$.所有元素出现次数都为$1$;$2$.除了一个元素出现次数为$1$之外,其余元素出现次数都相等;$3$.除了一个出现次数比其他数的出现次数多$1$的元素之外,其余元素出现次数都相等。在线处理:设$cnt_i......
  • CF1198B Welfare State 题解
    题意:有一个长度为$n$的序列$a$,给定$q$次操作,每次操作为以下两种之一:$1$.$1$$p$$x$:$a_p=x$$2$.$2$$x$:$a_i$$=$$max$$($$a_i$,$x$$)$$(1\lei\len)$求经过$q$次操作后的序列$a$。思路:$a_i$的最终值只受......
  • ABC331G 题解
    盒子里有\(n\)张\(m\)种卡片,第\(i\)种卡片有\(c_i\)张。\(\sumc_i=n\)。每次均匀随机选一张,再放回去。求拿出过的卡片包含全部种类所需要的取出次数的期望。对\(998244353\)取模。\(1\leqn,m\leq2e5,c_i\gt0\)。首先观察到,对于任意终止局面,最后取出的卡片一定......
  • CF1442D Sum 题解
    题目链接点击打开链接题目解法\(n^3\)的\(dp\)是显然的但我们没用到\(a\)不降的性质考虑一个很妙的结论:最优选法中,至多只有一个序列取了且未取满为什么?如果最优情况下,存在选且未选满的序列为\(a,b\),第一个未选的元素为\(x,y\)如果\(a_x>a_{pre_y}\),那么选\(x\)......
  • 洛谷 P1044 [NOIP2003 普及组] 栈 题解
    洛谷P1044[NOIP2003普及组]栈题解Sol本题通过分析可得:假设现在进行\(12\)次操作,我们把push认为是在地图上向右走,pop向上走,那么其中一个合法的步骤可以是(\(p1\)代表push,\(p2\)代表pop):\(p1,p1,p2,p1,p2,p2,p1,p1,p2,p2,p1,p2\)。而且我们发现,他最终会......