CF1368G Shifting Dominoes(扫描线求矩阵的并集)

CF1368G Shifting Dominoes

  • problem
  • solution
  • code

problem

题目链接

solution

求的是最后棋盘本质不同的个数,而本质不同等价于两个空格位置不同

如果想要移动一个多米诺骨牌,要求长边上下方有空位。

移动可以看成空位的移动

所以我们考虑把一个 (x,y)(x,y)(x,y) 看成一个点,表示该位置为空位。

然后向能转移的空位进行连边。

可以证明,连边后形成的图形不是环,而是森林

    1. 利用皮克定理证明:S=I+B2−1S=I+\frac{B}{2}-1S=I+2B1
    1. 出现环,意味着可以经过一系列操作后使得空位回到最原始的状态,但是显然原来的空位地方已经有一个多米诺骨牌霸占了。

如果将棋盘黑白染色,即一个多米诺骨牌恰好覆盖一个黑格子和一个白格子。

发现移动空位只会在同颜色格子上移动,因为每次移动无非是行 / 列 ±2±2±2

不同颜色格子之间答案互不影响

对两棵树 dfn\text{dfn}dfn 序编号,一个空位的所有移动可能就是其子树的大小。

两棵树里面某两个子树,出现不同的情况,就是两个子树大小的乘积。

将这个转化成二维矩阵面积问题。

显然矩阵之间会有交集,所以相当于是扫描线求矩阵的并集

code

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 200005
#define int long long
vector < int > G[maxn];
vector < pair < int, int > > pos[maxn];
char **s;
int **Hash;
int n, m, cnt, tot, ip;
int Y[maxn << 2], id[maxn], tag[maxn << 2], len[maxn << 2], dfn[maxn], siz[maxn];
bool vis[maxn];
#define lson now << 1
#define rson now << 1 | 1struct scan { int x, down, up, k; }MS[maxn];void pushup( int now, int l, int r ) {if( tag[now] ) len[now] = Y[r] - Y[l];else if( l + 1 == r ) len[now] = 0;else len[now] = len[lson] + len[rson];
}void modify( int now, int l, int r, int L, int R, int k ) {if( R < l or r < L ) return;if( L <= l and r <= R ) { tag[now] += k; pushup( now, l, r ); return; }if( l + 1 == r ) return;int mid = ( l + r ) >> 1;if( L <= mid ) modify( lson, l, mid, L, R, k );if( mid < R ) modify( rson, mid, r, L, R, k );pushup( now, l, r );
}void link( int u, int v ) {vis[v] = 1;G[u].push_back( v );
}void dfs( int u ) {dfn[u] = ++ ip, siz[u] = 1;for( auto v : G[u] ) dfs( v ), siz[u] += siz[v];
}signed main() {scanf( "%lld %lld", &n, &m );s = new char * [n + 5];Hash = new int * [n + 5];for( int i = 1;i <= n;i ++ ) {s[i] = new char [m + 5];Hash[i] = new int [m + 5];scanf( "%s", s[i] + 1 );for( int j = 1;j <= m;j ++ )Hash[i][j] = ( i - 1 ) * m + j;}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) {if( i + 2 <= n and s[i + 1][j] == 'U' and s[i + 2][j] == 'D' ) link( Hash[i][j], Hash[i + 2][j] );if( i - 2 >= 1 and s[i - 1][j] == 'D' and s[i - 2][j] == 'U' ) link( Hash[i][j], Hash[i - 2][j] );if( j + 2 <= m and s[i][j + 1] == 'L' and s[i][j + 2] == 'R' ) link( Hash[i][j], Hash[i][j + 2] );if( j - 2 >= 1 and s[i][j - 1] == 'R' and s[i][j - 2] == 'L' ) link( Hash[i][j], Hash[i][j - 2] );if( ! id[Hash[i][j]] ) {id[Hash[i][j]] = ++ cnt;if( s[i][j] == 'L' ) id[Hash[i][j + 1]] = cnt;if( s[i][j] == 'U' ) id[Hash[i + 1][j]] = cnt;}pos[id[Hash[i][j]]].push_back( { i, j } );}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ )if( ! vis[Hash[i][j]] ) dfs( Hash[i][j] );for( int i = 1;i <= cnt;i ++ ) {int a = pos[i][0].first, b = pos[i][0].second;int c = pos[i][1].first, d = pos[i][1].second;int u = Hash[a][b], v = Hash[c][d];int l1 = dfn[u], r1 = dfn[u] + siz[u] - 1;int l2 = dfn[v], r2 = dfn[v] + siz[v] - 1;if( ( a + b ) & 1 ) swap( l1, l2 ), swap( r1, r2 );	MS[++ tot] = { l1, l2, r2 + 1, 1 }; Y[tot] = l2;MS[++ tot] = { r1 + 1, l2, r2 + 1, -1 }; Y[tot] = r2 + 1;}sort( Y + 1, Y + tot + 1 );int m = unique( Y + 1, Y + tot + 1 ) - Y - 1;sort( MS + 1, MS + tot + 1, []( scan a, scan b ) { return a.x < b.x; } );int ans = 0;for( int i = 1;i <= tot;i ++ ) {ans += len[1] * ( MS[i].x - MS[i - 1].x );int down = lower_bound( Y + 1, Y + m + 1, MS[i].down ) - Y;int up = lower_bound( Y + 1, Y + m + 1, MS[i].up ) - Y;modify( 1, 1, m, down, up, MS[i].k );}printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吉吉王国(二分+树形dp)

吉吉王国 题意&#xff1a; n个点&#xff0c;m个边&#xff0c;有边权&#xff0c;现在要求叶子节点无法与1号点连通&#xff0c;要求切断的总长度不能超过m&#xff0c;且切断的最长的长度尽可能断 题解&#xff1a; 题意的前半部分可以确定是树形dp&#xff0c;后半部分…

P3239 [HNOI2015]亚瑟王(期望)

解析 显然可以利用期望的线性性对每张牌单独计算贡献。 现在的关键就是如何求出每张牌被使用的概率。 考虑第 iii 张牌&#xff0c;如果它的前面 [1,i−1][1,i-1][1,i−1] 中有 jjj 张牌被使用&#xff0c;那么它被使用的概率就是 1−(1−pi)r−j1-(1-p_i)^{r-j}1−(1−pi​)…

微软一顿操作猛如虎,PowerShell 排名直线上升

近日&#xff0c;TIOBE 发布了 2019 年 3 月编程语言排行榜&#xff0c;PowerShell 首次进入到了榜单的 Top 50 中&#xff0c;排在第 45 位。PowerShell 是运行在 Windows 操作系统上实现对系统以及应用程序进行管理自动化的命令行脚本环境。&#xff08;PowerShell 排在了 TI…

CF1237F Balanced Domino Placements(dp+组合计数)

CF1237F Balanced Domino Placementsproblemsolutioncodeproblem 题目链接 solution 骨牌横着放会占用一行两列&#xff0c;骨牌竖着放会占用两行一列。 问题可以抽象为&#xff1a;每次可以选择连续的两行放 AAA&#xff0c;或选一行放 BBB&#xff1b;每次可以选一列放 B…

AcWing 201. 可见的点

AcWing 201. 可见的点 题意&#xff1a; 题解&#xff1a; 我们先说结论:坐标(i,j)&#xff0c;如果i和j互质&#xff0c;说明该坐标为可见 为什么&#xff1f; 我们想想什么样的坐标可见&#xff0c;什么样的会被挡住。光线是一个直线&#xff0c;在同一个直线上的点会被第一…

模板:LGV引理(线性代数)

所谓LGV引理&#xff0c;就是解决LGV问题的引理。 &#xff08;逃&#xff09; 前言 上联&#xff1a;古有学完SAM学PAM&#xff1b; 下联&#xff1a;今有学完Polya学LGV&#xff1b; 横批&#xff1a;小清新。 常被用于有向图不交路径计数问题。&#xff08;废话&#xff…

ocelot 自定义认证和授权

Intro最近又重新启动了网关项目&#xff0c;服务越来越多&#xff0c;每个服务都有一个地址&#xff0c;这无论是对于前端还是后端开发调试都是比较麻烦的&#xff0c;前端需要定义很多 baseUrl&#xff0c;而后端需要没有代码调试的时候需要对每个服务的地址都收藏着或者记在哪…

CF765F Souvenirs(势能线段树)

CF765F Souvenirsproblemsolutioncodeproblem 题目链接 solution 这个势能线段树简直是太巧妙了&#xff01;&#xff01;&#xff01;( ఠൠఠ )&#xff89; 将询问按右端点升序离线下来。 对于每一个右端点 rrr&#xff0c;维护 ansimin⁡{∣ai−aj∣,j∈[i,r]}ans_i\m…

P4849 寻找宝藏(模板:四维偏序)

stable_sort 保平安。 解析 dp方程显而易见&#xff0c;关键就是如何进行这个四维偏序的转移。 考虑三维偏序&#xff08;比如拦截导弹&#xff09;我们是如何做的&#xff1f; 先按照第一维排序&#xff0c;然后分治解决前一半&#xff0c;接下来把前一半的第一维看成0&…

AcWing 220. 最大公约数

AcWing 220. 最大公约数 题意&#xff1a; 题解&#xff1a; 题目就变成了AcWing 201. 可见的点 当然有微调&#xff0c;因为可见的点里面是从0开始&#xff0c;本题从1开始&#xff0c;所以本题中phi[1]认为是0 AcWing 201. 可见的点的题解 代码&#xff1a; #include<b…

2021 CSP-S 游记

2021CSP-S游记 从国庆过后就开始停课&#xff0c;确实面对的压力和挑战很大。 这段时间真的就是完全没有去想文化课那边的事。 越接近考试时间&#xff0c;模拟赛就越密集&#xff0c;最近大家都在互测。 蛮清楚自己的水平的&#xff0c;而且偶尔还是能考得不错&#xff0c…

欧拉函数(简单介绍+例题)

Acwing视频讲解 欧拉函数&#xff1a;正整数n&#xff0c;欧拉函数是小于n的正整数中与n互质的数的数目 Np1a1 * p1a2 * p1a3 * …* p1ak 如果pj是i的最小质因子 红色区域一样 经推导得&#xff1a;phi[i * pj] phi[i] * pj 如果pj不是i的最小质因子 经推导&#xff1a;phi[…

P5303 [GXOI/GZOI2019]逼死强迫症(斐波拉契、矩阵乘法)

解析 非常妙的一个题&#xff0c;感受到了斐波拉契优美的归纳性质。 首先&#xff0c;不难发现只要两个1*1的位置固定&#xff0c;中间的摆法就固定了&#xff0c;而两边的方案都是经典的斐波拉契数列&#xff08;设为 fif_ifi​&#xff09;。 那么枚举中间的间隔再枚举左边…

程序员过关斩将--你的面向接口编程一定对吗?

菜菜哥&#xff0c;出大事啦怎么了&#xff0c;你和男票分手了&#xff1f;很正常&#xff0c;谁让你男票是产经经理呢不是啦&#xff0c;是我做的一个小游戏&#xff0c;需求又变了&#xff0c;程序我快改不动了说来让我欢乐一下&#xff1f;菜菜哥&#xff0c;咱两还能不能好…

[2021 CSP-S提高组] 题解(廊桥分配+括号序列+回文+交通规划)

2021 CSP-S 题解廊桥分配括号序列回文交通规划配合&#x1f449;CSP-S游记 食用更佳哦~ 【雷】&#xff1a;只是在民间数据过了&#xff0c;不保证一定正确。仅供参考&#xff01;&#xff01;&#xff01; 【雷】&#xff1a;只是在民间数据过了&#xff0c;不保证一定正确。…

P1247 取火柴游戏

P1247 取火柴游戏 题意&#xff1a; 有n堆火柴&#xff0c;两个人轮流操作&#xff0c;每次只能在从一堆中取若干火柴&#xff0c;拿走最后一根火柴的为胜者&#xff0c;给你一个状态&#xff0c;问先手是赢是输 题解&#xff1a; 很经典的nim博弈&#xff0c;结论大家应该…

Codeforces:779(div2)

前言 solve 4 rnk247 占了罚时的便宜。 CF不占罚时便宜就会被罚时占便宜 感觉这场似乎都是性质题&#xff0c;一眼看出性质就秒了&#xff0c;看不出就很难做出来了。 C似乎卡了很多人。但我做起来还好。 D2做不出来有些懊恼。 E是妙题。 题目 A 水题&#xff0c;保证male…

我们为什么要搞长沙.NET技术社区(4)

我们为什么要搞长沙.NET技术社区&#xff08;4&#xff09;邹溪源&#xff0c;2019年3月7日Ps:文中的.NET 包括且不限定于传统.NET Framework技术和.NET Core技术。1. 楔子昨天&#xff08;2019年3月6日&#xff09;晚餐时间&#xff0c;有幸得到长沙技术圈资深.NET开发者出生…

P1290 欧几里德的游戏

P1290 欧几里德的游戏 题意&#xff1a; 给定两个正整数 M 和 N&#xff0c;从 Stan 开始&#xff0c;从其中较大的一个数&#xff0c;减去较小的数的正整数倍&#xff0c;当然&#xff0c;得到的数不能小于 0。然后是 Ollie进行同样的操作&#xff0c;直到一个人得到0&#…

【无码专区3】乘法表的解密破译

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 problem 给定一个 qqq 进制的乘法表&#xff0c;每个字符代表着 0∼p−10\sim p-10∼p−1 不同的数字。 求每个字符代表的数字。保证有解。 \timesABCDACDBBDCBABBBBBBBBBCDCBBDBBCDBABBBCBD i.e. CD\text{C…