[2020-09-11 CQBZ/HSZX多校联测 T3] 万猪拱塔(线段树+巧妙转化)

万猪拱塔

  • description
  • solution
  • code

description

题目描述
小七养了很多头猪,它们分布在 n 行 m 列中,其中第 i 行第 j 列的猪圈养的是第 wi,jw_{i,j}wi,j 种猪。
小七有时会选择一个子矩形范围内的猪圈进行巡视,如果该子矩形包含 i 行 j 列 (1 ≤ i ≤ n; 1 ≤ j ≤ m),且子矩形内含有的猪种类编号最大值减去编号最小值恰好为 i × j - 1 ,则小七会获得 i × j 的愉悦值。
小七想知道,如果他将每个可能的子矩形都巡视一次,总共能获得多少愉悦值呢?你只需要输出答案对 998244353 取模的结果。

输入格式
输入文件 pig.in 包含 1 + n × m 行。
第一行输入两个正整数依次表示 n; m 。
接下来 n 行每行包含 m 个正整数,其中第 i 行的第 j 个正整数表示 wi;j 。

输出格式
输出文件 pig.out 包含一行,仅一个非负整数,表示答案对 998244353 取模
的结果。
样例输入

2 2
1 3
2 4

样例输出

12

样例解释
合法子矩形面积为 1 的有 4 个,面积为 2 的有 2 个,面积为 4 的有 1 个。
数据范围及约定

测试点编号n × m特殊性质
1 ∼ 2≤ 50
3 ∼ 6≤ 10^4
7 ∼ 12≤ 2 × 10^5n = 1
13 ∼ 20≤ 2 × 10^5

对于 100% 的数据, 1 ≤ wi;j ≤ n × m ≤ 2 × 105 , 保证 wi;j 互不相同。

solution

先吐槽一下题目的 包含 真的是误导新青年!!

我以为是原矩阵的iiijjj列,结果是选的矩阵重新编号后的iiijjj

实际上就是问多少矩阵内种类编号的极差等于矩阵行数乘列数再减一


应该不会有人只拿case 1~2的暴力吧

case 1~6 :枚举所选矩阵的左上角,求出以其右下方每一个点为矩阵右下角的种类最大值和最小值,可以通过扫一遍,然后行加一的时候继承上面一行信息,再操作

case 7~12n=1是一个一维问题,可以用线段树和单调栈解决

具体而言,枚举矩阵右端点rrr,如果区间[l,r][l,r][l,r]合法,则满足Maxl,r−Minl,r=r−l+1\text{Max}_{l,r}-\text{ Min}_{l,r}=r-l+1Maxl,r Minl,r=rl+1

对于每个lll的定义f[l]=Maxl,r−Minl,r+lf[l]=\text{Max}_{l,r}-\text{ Min}_{l,r}+lf[l]=Maxl,r Minl,r+l,用线段树维护f[l]f[l]f[l]

因为种类互不相同,所以∀lf[l]≥r+1\forall_l f[l]\ge r+1lf[l]r+1,只需要线段树维护f[l]f[l]f[l]的最小值,最小值个数,以及所有lll之和,就可以统计了,即(r+1)∗cnt−sum(r+1)*cnt-sum(r+1)cntsum

右端点移动111,用单调栈维护其影响的Maxl,r,Minl,r\text{Max}_{l,r},\text{Min}_{l,r}Maxl,r,Minl,r,在线段树上修改

Maxl,r\text{Max}_{l,r}Maxl,r维护一个单调递减栈,Minl,r\text{Min}_{l,r}Minl,r维护一个单调递增栈

case 13~20 :很不幸,一维的做法并不能处理二维情况

考虑另外一种nb的转化

考虑判定 权值[l,r][l,r][l,r]区间的点是否构成了一个矩阵,记这些格子的颜色为黑色,其余均为白色

n×mn\times mn×m的猪圈算上周围一圈的空白边界,看成(n+1)×(m+1)(n+1)\times (m+1)(n+1)×(m+1)的猪圈

产生(n+1)×(m+1)(n+1)\times (m+1)(n+1)×(m+1)2×22\times 22×2的小正方形猪圈(不能超出边界),标记在2×22\times 22×2这个矩阵的左上角

如果所有黑色格子能围成一个矩阵,当且仅当恰好有4个小猪圈只有1个黑点,没有任何一个小猪圈有3个黑点

不要急,仔细想想这句很妙的话,小猪圈是由其左上角表示的,只有围成的矩阵的四个顶点所在的小猪圈,只含这个顶点一个黑点

从小到大枚举权值rrr,定义F[l]F[l]F[l]为染黑权值为[l,r][l,r][l,r]的格子,其余格子为白色,小猪圈内有1/31/31/3个合格子的小猪圈数量

显然F[r]=4,F[l]≥4F[r]=4,F[l]\ge 4F[r]=4,F[l]4

这个时候可以利用一维的做法,线段树维护F[l]F[l]F[l]的最小值,最小值个数以及这些lll的和,贡献计算也是一样的

rrr增加111的时候,只会影响4442×22\times 22×2的矩阵(分别是r+1r+1r+1做左上角,右上角,左下角,右下角时的不同的444个小猪圈)

暴力修改即可——详见代码

最后就是这道题的天坑——卡常

必须开Ofast不然分竟然跟暴力差不多,快读快输,还有这种n×m≤2e5n\times m\le 2e5n×m2e5的必须卡着矩阵长相开数组的

这是什么jian题 好题,真的是好题!!

code

#pragma GCC optimize( "Ofast" )
#include <cstdio>
#define mod 998244353
#define maxn 200005
int Min[maxn << 2], cnt[maxn << 2], tag[maxn << 2];
long long sum[maxn << 2];
int ID[maxn];
int n, m, **w;#define Make( arr ) do { \arr = new int*[n + 3]; \for( int i = 0;i <= n + 2;i ++ ) arr[i] = new int[m + 3](); \
} while( false )inline void read( int &x ) {x = 0; char s = getchar();while( s < '0' or s > '9' ) s = getchar();while( '0' <= s and s <= '9' ) {x = ( x << 1 ) + ( x << 3 ) + ( s ^ 48 );s = getchar();}
}inline void write( int x ) {if( x >= 10 ) write( x / 10 );putchar( x % 10 ^ 48 );
}#define lson num << 1
#define rson num << 1 | 1
#define inf 0x3f3f3f3fint chkmin( int x, int y ) { return x < y ? x : y; }inline void pushup( int num ) {Min[num] = chkmin( Min[lson], Min[rson] );cnt[num] = sum[num] = 0;if( Min[num] == Min[lson] ) cnt[num] += cnt[lson], sum[num] += sum[lson];if( Min[num] == Min[rson] ) cnt[num] += cnt[rson], sum[num] += sum[rson];
}inline void build( int num, int l, int r ) {if( l == r ) { Min[num] = inf, cnt[num] = 1, sum[num] = l; return; }int mid = ( l + r ) >> 1;build( lson, l, mid );build( rson, mid + 1, r );pushup( num );
}inline void pushdown( int num ) {if( ! tag[num] ) return;Min[lson] += tag[num];tag[lson] += tag[num];Min[rson] += tag[num];tag[rson] += tag[num];tag[num] = 0;
}inline void modify( int num, int l, int r, int L, int R, int val ) {if( r < L or R < l ) return;if( L <= l and r <= R ) { Min[num] += val, tag[num] += val; return; }pushdown( num );int mid = ( l + r ) >> 1;modify( lson, l, mid, L, R, val );modify( rson, mid + 1, r, L, R, val );pushup( num );
}inline void modify( int r, int c, int Max, int opt ) {static int arr[4];if( ! ~opt ) {arr[0] = w[r][c], arr[1] = w[r][c + 1], arr[2] = w[r + 1][c], arr[3] = w[r + 1][c + 1];for( int i = 0;i < 3;i ++ )for( int j = 0;j < 3;j ++ )if( arr[j] > arr[j + 1] )    arr[j] ^= arr[j + 1] ^= arr[j] ^= arr[j + 1];}int ip = 0;for(;ip < 4 and arr[ip] <= Max;ip ++ );if( ip == 1 or ( ip > 1 and arr[ip - 1] ^ arr[ip - 2] ) )modify( 1, 1, n * m, ip == 1 ? 1 : arr[ip - 2] + 1, arr[ip - 1], opt );if( ip == 3 or ( ip > 3 and arr[ip - 3] ^ arr[ip - 4] ) )modify( 1, 1, n * m, ip == 3 ? 1 : arr[ip - 4] + 1, arr[ip - 3], opt );
}inline int mul( int x, int y ) { return 1ll * x * y % mod; }
inline int sub( int x, int y ) { return x - y < 0 ? x - y + mod : x - y; }
inline int add( int x, int y ) { return 1ll * x + y >= mod ? 1ll * x + y - mod : x + y; }int main() {freopen( "pig.in", "r", stdin );freopen( "pig.out", "w", stdout );scanf( "%d %d", &n, &m ); Make( w );for( int i = 0;i <= n + 1;i ++ ) w[i][0] = w[i][m + 1] = n * m + 1;for( int i = 1;i <= m;i ++ ) w[0][i] = w[n + 1][0] = n * m + 1;for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ )read( w[i][j] ), ID[w[i][j]] = ( i - 1 ) * m + j;build( 1, 1, n * m );int ans = 0;for( int i = 1;i <= n * m;i ++ ) {int r = ( ID[i] - 1 ) / m + 1, c = ID[i] - ( r - 1 ) * m;modify( 1, 1, n * m, i, i, -inf );for( int j = -1;j <= 0;j ++ )for( int k = -1;k <= 0;k ++ ) {modify( r + j, c + k, i - 1, -1 );modify( r + j, c + k, i, 1 );}if( Min[1] == 4 ) ans = add( ans, sub( mul( i + 1, cnt[1] ), sum[1] % mod ) );}write( ans );return 0;
}

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

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

相关文章

重新解读DDD领域驱动设计(一)

回顾十年前&#xff0c;还未踏入某校时&#xff0c;便听闻某学长一毕业就入职北京某公司&#xff0c;月薪过万。对于一个名不见经传的小学院&#xff0c;一毕业能拿到这个薪水还是非常厉害的。听闻他学生期间参与开发了一款股票软件&#xff0c;股票那时正迎来一波疯涨。时也运…

Tickets HDU - 1260

Tickets HDU - 1260 题意&#xff1a; 著名的宫崎骏动画片《千与千寻》在中传1500报重映&#xff0c;中传学子有幸成为全国第一批观众。动画学院学生会负责给大家发票&#xff0c;所有的中传同学只要把中传首映《千与千寻》的推送信息发到朋友圈并集够10个赞&#xff0c;就可…

洛谷P3357:最长k可重线段集问题(网络流)

解析 本题的建模方法有很多&#xff0c;我的做法是补集思想转化成志愿者招募然后按照那道题的做法直接做&#xff0c;看题解更多是采用的对于不冲突的线段首尾加边的做法。 在前一道最长k可重区间问题中这两种做法谈不上孰优孰劣&#xff0c;但本题中题解的做法在处理垂直线段…

程序员修神之路--高并发优雅的做限流(有福利)

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有时间吗&#xff1f;YY妹&#xff0c;什么事&#xff1f;我最近的任务是做个小的秒杀活动&#xff0c;我怕把后端接口压垮&#xff0c;X总说这可关系到公司的存亡简单呀&#xff0c;你就做个限流呗这个没做过呀&#x…

BZOj #4771. 七彩树(主席树+dfn序+lca)

BZOj #4771. 七彩树descriptionsolutioncodedescription 给定一棵n个点的有根树&#xff0c;编号依次为1到n&#xff0c;其中1号点是根节点。每个节点都被染上了某一种颜色&#xff0c;其中第i个节点的颜色为c[i]。如果c[i]c[j]&#xff0c;那么我们认为点i和点j拥有相同的颜色…

免费馅饼 HDU - 1176

免费馅饼 HDU - 1176 题意&#xff1a; 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上…

CF1631F:Flipping Range(dp)

解析 设 x,y∈B,x<yx,y\in B,x<yx,y∈B,x<y&#xff0c;那么也有 x−y∈Bx-y\in Bx−y∈B。 递归下去&#xff0c;根据辗转相减求 gcd⁡\gcdgcd 的方法可知&#xff0c;最终会得到 gcd⁡(x,y)\gcd(x,y)gcd(x,y)。 那么对于整个集合 BBB &#xff0c;它也就等价于所有…

微软 HoloLens 2 正式登场!让你看看什么叫真正的黑科技

北京时间 2 月 25 日凌晨消息&#xff0c;微软在 MWC19 举行新品发布会&#xff0c;正式发布了万众期待的 HoloLens 2 等产品。▲ 认识全新的 Microsoft HoloLens 2微软 HoloLens 全息眼镜是微软推出的一款头戴式混合现实装置&#xff0c;可以完全独立使用&#xff0c;无需线缆…

Piggy-Bank HDU - 1114

Piggy-Bank HDU - 1114 题意&#xff1a; 小猪储钱罐存在一个大的问题&#xff0c;即无法确定其中有多少钱。因此&#xff0c;我们可能在打碎小猪储钱罐之后&#xff0c;发现里面的钱不够。显然&#xff0c;我们希望避免这种不愉快的情况。唯一的可能是&#xff0c;称一下小猪…

BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

#3166. [Heoi2013]AlodescriptionsolutioncodeBZOJ3166 description Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG &#xff0c; 如名字所见&#xff0c;到处充满了数学的谜题。 现在你拥有n颗宝石&#xff0c;每颗宝石有一个能量密度&#xff0c;记…

洛谷P6054:开门大吉

Description\text{Description}Description P6054 开门大吉 nnn 位选手去参加节目“开门大吉”。共有 mmm 套题&#xff0c;每套题包含 ppp 个题目&#xff0c;第 iii 位选手答对第 jjj 套题中第 kkk 道的概率为 fi,j,kf_{i,j,k}fi,j,k​。 若一位选手答对第 iii 题&#xff0…

Docker最全教程之Ubuntu下安装Docker(十五)

前言Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;应用很广。本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker&#xff0c;并且提供了Docker安装的两种方式&#xff0c;希望对大家有所帮助。拥抱Linux&#xff0c;大家可以从Ubuntu开始&#xff01;Ubuntu下…

群论学习笔记

文章目录前言群基本定义&#xff1a;子群陪集拉格朗日定理正规子群交换群商群阶置换定义置换的乘法循环置换群群作用等价类不动点Burnside引理内容证明法1 轨道-稳定子定理法2Polya 定理所谓群论&#xff0c;就是对群体行为问题的讨论。 &#xff08;逃&#xff09; 前言 个人…

Super Jumping! Jumping! Jumping! HDU - 1087

Super Jumping! Jumping! Jumping! HDU - 1087 题意&#xff1a; 给定一条长度为n的序列&#xff0c;其中一定存在一条元素和最大的严格上升子序列&#xff0c;求这条序列的元素和。 题解&#xff1a; 最长上升序列模板题 代码&#xff1a; #include<bits/stdc.h> …

Codeforces Round #727 (Div. 2) 题解

文章目录A. Contest StartB. Love SongC. Stable GroupsD. PriceFixedE. Game with CardsF. Strange Array#727-Div.2A. Contest Start 数学题&#xff0c;分类讨论 一般的&#xff0c;一段区间[l,r][l,r][l,r]会对后面固定人数造成影响&#xff0c;假设是kkk最后kkk个人&…

潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?

三喜临门一 喜今天真是个好日子&#xff0c;“流浪太阳”又回来了&#xff0c;阴雨绵绵长恨无期&#xff0c;今天苏州终于天晴&#xff0c;于是心情大好&#xff01;都说好心情会带来好运气&#xff0c;冥冥感觉要写点啥了&#xff0c;果不其然今天还有另外两喜。大早起来得…

G List it all

传送 题意&#xff1a; 题解&#xff1a; 我们来考虑以下样例&#xff1a;1&#xff0c;1&#xff0c;2 我们先考虑1的贡献&#xff1a;如图(图中只花了) 2&#xff01;表示还剩两个空位&#xff0c;还有两个数未填入&#xff0c;所以是2&#xff01;个 对于n个数重复&#x…

洛谷P4727:图的同构计数(Polya引理)(dfs)

解析 《关于我想了半天 dp 结果看题解 dfs 就行这回事》 我就说 gcd⁡\gcdgcd 这玩意 dp 个锤子啊… 拆分数的增长速度远没有想像中那么大&#xff0c;事实上&#xff0c;n60n60n60 也就 1e6 左右。 据题解说&#xff0c;这玩意的增长速度仅有 O(enn)O(\frac{e^{\sqrt n}}{n})…

ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

一、前言在非静态页面的项目开发中&#xff0c;必定会涉及到对于数据库的访问&#xff0c;最开始呢&#xff0c;我们使用 Ado.Net&#xff0c;通过编写 SQL 帮助类帮我们实现对于数据库的快速访问&#xff0c;后来&#xff0c;ORM&#xff08;Object Relational Mapping&#x…

Codeforces Round #699 (Div. 2) 题解

文章目录A. Space NavigationB. New ColonyC. Fence PaintingD. AB GraphE. Sorting BooksF. AB Tree#699-Div.2A. Space Navigation 对于最终位置(x,y)&#xff0c;我们只关心那两个方向的字符是否足够即可 #include <cstdio> #include <cstring> #define maxn …