bzoj 1453 双面棋盘 LCT 并查集

【BZOJ】【P1453】【WC2005】【Dface双面棋盘】【题解】【线段树+并查集】 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1453 用线段树维护每行,每个节点套并查集,记录最上方和最下方的联通性,暴力合并暴力修改并查集,记录答案, 并查集的合并比较恶心,我yy了很久……(请读者自行思考) 我用并查集中的1..n表示上方,n+1..2n表示下方,合并时2n+1..4n用于右侧的上下方并查集 Code: #i 阅读详情

把每个格子看成点,同色格子之间连边。
LCT维护关于删除时间的最大生成树。
设有x1个原来与当前格子同色的连通块与当前格子断开,x2个原来与当前格子不同色的连通块与当前格子连通,那么会增加x1-1个当前格子原来颜色的连通块,减少x2-1个当前格子现在颜色的连通块。
写得比较挫,初始状态用的并查集。。。

#include <bits/stdc++.h>
using namespace std;
#define N 210
#define M 310000
#define which(x) (ch[fa[x]][1]==x)
int n,m,cnt,tot,ans[2];
int a[N][N],idn[N][N],ide[N][N][2],idp[M][2];
int tim[M],pos[M],del[M],tmp[M],tp[M],val[M],fat[M];
int ch[M][2],fa[M],rev[M],mn[M],pos1[M],use[M],opt[M],opp[M];
void ins(int x,int y,int type,int op,int x1,int y1)
{tim[++tot]=x;pos[tot]=y;tp[tot]=type;opt[tot]=op;opp[tot]=idn[x1][y1];}
int find1(int x){return fat[x]==x ? x:fat[x]=find1(fat[x]);}
void add(int x1,int y1,int x2,int y2,int tp)
{
    ide[x1][y1][tp]=++cnt;
    idp[cnt][0]=idn[x1][y1];
    idp[cnt][1]=idn[x2][y2];
    if(a[x1][y1]==a[x2][y2])
    {
        ins(0,ide[x1][y1][tp],1,1,x1,y1);
        fat[find1(idn[x1][y1])]=find1(idn[x2][y2]);
    }
}
void proc(int x)
    {swap(ch[x][0],ch[x][1]);rev[x]^=1;}
void pushdown(int x)
{
    if(rev[x])
    {
        proc(ch[x][0]);proc(ch[x][1]);
        rev[x]=0;
    }
}
int isroot(int x)
    {return !fa[x]||ch[fa[x]][which(x)]!=x;}
void down(int x)
{
    if(!isroot(x))down(fa[x]);
    pushdown(x);
}
void pushup(int x)
{
    pos1[x]=mn[ch[x][0]]<mn[ch[x][1]] ? 
    (mn[ch[x][0]]<val[x] ? pos1[ch[x][0]]:x):
    (mn[ch[x][1]]<val[x] ? pos1[ch[x][1]]:x); 
    mn[x]=min(val[x],min(mn[ch[x][0]],mn[ch[x][1]]));
}
void rotate(int x)
{
    int y=fa[x],k=which(x);
    ch[y][k]=ch[x][k^1];
    ch[x][k^1]=y;
    if(!isroot(y))ch[fa[y]][which(y)]=x;
    fa[x]=fa[y];fa[y]=x;
    fa[ch[y][k]]=y;
    pushup(y);pushup(x);
}
void splay(int x)
{
    down(x);
    while(!isroot(x))
    {
        int y=fa[x];
        if(isroot(y))rotate(x);
        else
        {
            if(which(x)^which(y))rotate(x);
            else rotate(y);
            rotate(x);
        }
    }
}
void access(int x)
{
    int t=0;
    while(x)
    {
        splay(x);
        ch[x][1]=t;fa[t]=x;
        pushup(x);
        t=x;x=fa[x];
    }
}
void rever(int x)
{
    access(x);splay(x);
    proc(x);
}
void link(int x,int y)
{
    rever(x);fa[x]=y;
}
void cut(int x,int y)
{
    rever(x);
    access(y);splay(y);
    ch[y][0]=fa[x]=0;
    pushup(x);
}
int find(int x)
{
    while(fa[x])x=fa[x];
    return x;
}
int main()
{
    //freopen("tt.in","r",stdin);
    scanf("%d",&n);
    if(n==1)
    {
        int x;scanf("%d%d",&x,&m);
        for(int i=1;i<=m;i++)
            printf("%d %d\n",x^1,x),x^=1;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
            idn[i][j]=++cnt;fat[cnt]=cnt;
            if(i!=1)add(i,j,i-1,j,0);
            if(j!=1)add(i,j,i,j-1,1);
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(find1(idn[i][j])==idn[i][j])
                ans[a[i][j]]++;
    scanf("%d",&m);
    for(int i=1,x,y,t;i<=m;i++)
    {
        scanf("%d%d",&x,&y);a[x][y]^=1;t=a[x][y];
        if(x!=1)ins(i,ide[x][y][0],a[x][y]==a[x-1][y],t,x,y);
        if(y!=1)ins(i,ide[x][y][1],a[x][y]==a[x][y-1],t,x,y);
        if(x!=n)ins(i,ide[x+1][y][0],a[x][y]==a[x+1][y],t,x,y);
        if(y!=n)ins(i,ide[x][y+1][1],a[x][y]==a[x][y+1],t,x,y);
    }
    memset(tmp,0x3f,sizeof(tmp));
    for(int i=tot;i>=1;i--)
    {
        if(!tp[i])tmp[pos[i]]=tim[i];
        else del[i]=tmp[pos[i]];
    }
    memset(val,0x3f,sizeof(val));
    memset(mn,0x3f,sizeof(mn));
    for(int i=1,now=1;i<=m;i++)
    {
        int n1=0,n2=0,vt;
        while(now<=tot&&tim[now]<=i)
        {
            int t=pos[now];
            rever(opp[now]);
            if(tp[now])
            {
                val[t]=del[now];mn[t]=del[now];
                if(find(idp[t][0])==find(idp[t][1]))
                {
                    rever(idp[t][0]);
                    access(idp[t][1]);splay(idp[t][1]);
                    if(mn[idp[t][1]]<val[t])
                    {
                        int t1=pos1[idp[t][1]];
                        use[t1]=0;use[t]=1;
                        cut(t1,idp[t1][0]);cut(t1,idp[t1][1]);
                        link(t,idp[t][0]);link(t,idp[t][1]);
                    }
                }
                else
                {
                    link(t,idp[t][0]);link(t,idp[t][1]);
                    use[t]=1;if(tim[now])n1++;
                }
            }
            else if(use[t])
            {
                use[t]=0;
                cut(t,idp[t][0]);cut(t,idp[t][1]);
                if(tim[now])n2++;
            }
            vt=opt[now];now++;
        }
        ans[vt]-=n1-1,ans[vt^1]+=n2-1;
        printf("%d %d\n",ans[1],ans[0]);
    }
    return 0;
}
ANSYS ICEM CFD 2023R2 结构化网格实战:翼型绕流 10 步生成高质量六面体网格 在计算流体力学(CFD)分析中,网格质量直接决定了仿真结果的精度和收敛性。对于翼型绕流这类典型的外部流动问题,结构化网格因其规则的节点排列和优异的边界层捕捉能力,成为高精度模拟的首选方案。通过在后缘处添加局部H型拓扑,并将过渡区增长率降至1.1,最终使网格质量指标提升40%,计算收敛速度提高2倍。这印证了结构化网格在复杂流动模拟中的不可替代性——虽然初期投入时间较多,但能显著提升计算精度和稳定性。在开始网格划分前,合理的几何准备是确保后续流程顺利的关键。对于翼型绕流,O型网格拓扑能提供最佳的边界层适应性。 阅读详情

相关推荐

Open3D 教程学习指南 (持续整理)

Open3D 是一个开源库,旨在为 3D 数据处理提供高效且易用的工具。它由 Intel 开发和维护,支持多种 3D 数据处理任务,如点云处理、3D 重建、几何处理和可视化等。

Chase Blog 5929

BZOJ 1453 [WC] 双面棋盘 并查集+线段树暴搞

这道题大部分这么做的题解写的都很简洁,不过看代码就能看懂大概搞法。 线段树的一个节点维护的信息有:节点对应区间[l,r]为原图第l行到第r行这(r-l+1)×n的棋盘中的黑色连通块数和白色连通块数。然后我们保存第l行和第r行的连通的情况,这样就可以方便地合并两个相邻区间了。注意到同一行中不相邻的两个块可能是属于一个连通块的,所以用并查集来储存连通的信息比较合适。每次合并都是O(n)。合并区间时,连

Sky 1017

手把手教你用ADIsimCLK和GUI搞定HMC7044时钟配置(附避坑指南)

本文详细解析了HMC7044时钟芯片的配置方法,通过ADIsimCLK和HMC7044 Configuration GUI工具,从频率规划到硬件验证全流程实战演示。特别针对PLL模式选择、分频链配置等易错环节,提供量产验证的配置模板和实测数据,帮助工程师快速掌握高性能时钟解决方案。

weixin_30755393的博客 794

【BZOJ】1453: [Wc]Dface双面棋盘-LCT

LCT

远行客 291

ArcGIS小白必看:5分钟搞定面要素转点要素+自动计算经纬度坐标(附常见报错解决方案)

本文为ArcGIS新手详细解析了面要素转点要素并自动计算经纬度坐标的完整流程。核心在于正确理解和使用坐标系,并掌握ArcToolbox中的“要素转点”等工具。文章深入剖析了常见报错(如坐标系未定义、字段计算失败)的根源,提供了从基础操作到Python脚本自动化的实战解决方案,确保数据转换的准确与高效。

weixin_29284885的博客 575

地理空间坐标系统-不同椭球基准间的坐标转换

基于同一个椭球基准,可以构建三类地理空间坐标系:大地球面坐标系、大地空间直角坐标系、大地投影坐标系。由于坐标原点和椭球长短半径等都相同,这三类坐标系之间可以通过无损的数学方法相互之间进行转换。那么现在问题来了,不同椭球基准(在全球范围来看存在成百上千的椭球基准)之间的坐标怎么转换?比如,北京54、西安80、国家2000,特别是在我国,现在主推国家2000坐标系,那么如何将历史的测绘成果(北京54和...

技术改变世界 8336

BZOJ 1453 Wc2005 Dface双面棋盘 Link-Cut-Tree

题目大意:给定一张网格图,每个点有黑色和白色,同色相邻的点之间连边,每次反转一个点的颜色并输出黑色和白色的联通块个数 《论科技不发达的危害》 这显然是个动态图问题,由于不强制在线,我们用Link-Cut-Tree维护边删除时间的最大生成树就可以了 时间复杂度O((n2+m)logn)O((n^2+m)logn) 常数巨大#include <queue> #include <cstdio> #

世界 2321

OB4.X集群状态running但是oceanbase-ce is not running

自 V3.2.0 起,若 obd 设置了加密密钥,执行 display 命令输出的集群信息中,密码相关内容为加密状态。若需输出明文密码,可在命令中添加 --epk/–encryption-passkey 指定密钥用于验证。obd 运维的数据库,启停需要使用obd进行操作,停机时候没有使用obd会导致集群状态running但是oceanbase-ce is not running。查看集群中的租户时无租户反馈,警告oceanbase-ce is not running,但是查询集群状态明明是running。

qq961573863的博客 1213

【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集

【BZOJ1453】[Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT。。。还是学学正解的写法吧(虽然复杂度不如LCT)。 我们用线段树维护所有的行,每个叶子节点都代表一个列,每个线段...

aodanchui1057的博客 190

基于Simulink的固态变压器(SST)多级协同控制

本文基于Simulink平台,详细介绍了固态变压器(SST)多级协同控制的建模与仿真方法。针对SST三级架构(AC-DC、DC-DC、DC-AC)存在的级间耦合问题,提出了纵向解耦与横向联动的协同控制策略。通过搭建10kV/400V级联型SST系统模型,实现了输入电压波动±20%或负载0-100%跳变时直流母线电压波动小于2%的控制目标。文章详细讲解了Simulink建模步骤、控制算法推导及工程部署建议,包括功率前馈控制、虚拟惯性算法等关键技术。仿真结果表明,该协同控制方案能有效抑制负载突变时的电压波动,为

MHD0815的博客 214

STM32开发 -- LIS3DH三轴加速度计开发详解

这次要讲一下LIS3DH三轴加速度计的开发使用,之前是有讲过 MPU6050开发 的,但当时是在Linux下做的。额,还是个半成品,哈哈。现在手边有STM32的开发板,可以实实在在的来实现以下卡尔曼滤波了。 一、LIS3DH初识 依照惯例,先看一下手册,大致先了解一下,LIS3DH是什么模块。 下载:LIS3DH datasheet 1、描述 LIS3DH是一款超低功耗高性能三轴线性加速度计,属于...

不积跬步,无以至千里 2万+

BZOJ1453: [Wc]Dface双面棋盘

BZOJ1453: [Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解Here! 这题是本蒟蒻接触$LCT$以来见过的最毒瘤的一题。。。 于是我两个晚上就这么搭进去了。。。 首先这题可以线段树搞。 用...

weixin_30329623的博客 89

C语言试题四之计算并输出3到n之间所有素数的平方根之和

1、题目 请编写函数function,它的功能是:计算并输出3到n之间所有素数的平方根之和 例子:若我们main函数从键盘给n输入5之后,我们需要输出结果为3.968119 输入值n的要求:正整数n, 要求小于100。 2、部分函数说明 C 库函数 double sqrt(double x) 返回 x 的平方根 3、源代码实现 #include <stdio.h> #...

码莎拉蒂 7232

bzoj1453[Wc]Dface双面棋盘

一个$n*n$的棋盘,每个格子为黑色或白色。m次操作,每次修改一个格子的颜色,计算当前有多少黑色四联通块和白色四联通块 $$1 \leq n \leq 200$$ $$1 \leq m \leq 10000$$ 当年科技不发达...这明明是LCT一眼题啊喂 设有$x_1$个原来与当前格子同色的连通块与当前格子断开,$x_2$个原来与当前格子不同色的连通块与当前格子连通,那么会增...

aobai7842的博客 108

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【BZOJ1453】[WC] Dface双面棋盘(LCT维护联通块个数)

点此看题面 大致题意: 给你一个\(n*n\)的黑白棋盘,每次将一个格子翻转,分别求黑色连通块和白色连通块的个数。 \(LCT\)动态维护图连通性 关于这一部分内容,可以参考这道例题:【BZOJ4025】二分图。 大致思路 我们可以将同种颜色的相邻格子之间连边,这样就可以把问题搬到图上。 然后考虑先离线,把每两个格子间边的加入与删除的时间(同一条边可能被加入和删除多次)记录下来。 这样就可以用\(...

weixin_30758821的博客 255

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【WC2005】【BZOJ1453】Dface双面棋盘

Description Input Output Sample Input Sample Output HINT SourceLCT维护删除时间的最大生成树,和4025一个姿势 注意Cut时候判断一下是不是要更改答案 我的LCT因为姿势不优美一开始MLE了蟹蟹雅礼中学的Dashgua君帮我改了改姿势QwQAC code↓#include<iostream> #

CreationAugust is 14 years old forever 1488

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[BZOJ 1453] [Luogu P4121] [WC2005]双面棋盘

BZOJ传送门 洛谷传送门 题目描述 佳佳有一个 n 行 n 列的黑白棋盘,每个格子都有两面,一面白色,一面黑色。佳佳把棋盘平放在桌子上,因此每个格子恰好一面朝上,如下图所示: 我们把每行从上到下编号为 1 , 2 , 3 ,……, n ,各列从左到右编号为 1 , 2 , 3 ,……, nn ,则每个格子可以用棋盘坐标 (x,y)(x,y)(x, y) 表示。在上图中,有 8 个...

LPA的博客 494

[BZOJ1453][Wc]Dface双面棋盘(lct)

题目描述传送门题解这题好麻烦啊… 相当于是有一堆砍边和加边的操作,然后询问联通块数量 维护一棵以删除时间为权值的最大生成树,这样可以保证砍断一条边一定是联通块数量-1,加一条边一定是联通块数量+1 其余的做法实际上是和二分图那道题是一样的代码#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #in

zyf2000 1029

bzoj1453: [Wc]Dface双面棋盘

传送门 话说数据范围好像暴力能过?不管,讲正解。 发现暴力每一次询问需要O(N^2)。 但是每一次只修改一个数。 感觉比较浪费。 然后我们可以按照行跑线段树,然后暴力合并上下联通情况。 这样单次询问只要O(NlogN)了。#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<iostre

zyy大蒟蒻的博客 637

【刷题】BZOJ 1453 [Wc]Dface双面棋盘

Description Input Output Sample Input Sample Output HINT Solution 不强制在线的动态图问题,那就LCT了 类似二分图那道题目 对于四个方向,颜色相同的连边;那么每次翻转就变成了几次删边和几次加边(注意加边在删边之后);联通块数量就变成了LCT维护的森林的数量 先把所有动态的边存下来(离线),然后找到他们被删掉的时间,以时间...

weixin_30363981的博客 111

BZOJ1453: [WC2005]Dface双面棋盘

离线LCT维护MST,和3082的方法一样。然而比较码农,适合颓废的时候写。 PS:线段树分治要好写得多,LCT比较自娱自乐。 #include<bits/stdc++.h> using namespace std; const int dx[]={-1,1,0,0}; const int dy[]={0,0,-1,1}; const int inf=1e9; int...

weixin_30872671的博客 117

bzoj 5143 [Ynoi2018]五彩斑斓的世界

bzoj 5143 [Ynoi2018]五彩斑斓的世界

Rising_shit的博客 1054

BZOJ 4939 (Ynoi 2016)掉进兔子洞(莫队+压位)

4939: [Ynoi2016]掉进兔子洞 Description 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 一个长为 n 的序列 a。 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。 注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完, 比如三个区间...

Mogician_Evian的博客 608
上一篇: 4574 [Zjoi2016]线段树 dp
下一篇: bzoj 2759 一个动态树好题 LCT 数学
make_it_for_good
博客等级 码龄11年 13粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值