首页 > 其他分享 >LOJ4222 「IOI2024」马赛克上色 题解

LOJ4222 「IOI2024」马赛克上色 题解

时间:2024-09-11 23:13:38浏览次数:1  
标签:vi res int 题解 LOJ4222 maxn IOI2024 sum col

题目描述

给定长为 \(n\) 、下标从零开始的 \(01\) 序列 \(x,y\) ,保证 \(x_0=y_0\) 。

令 \(col_{0,j}=x_j,col_{i,0}=y_i\) ,对 \(\forall 1\le i\lt n,1\le j\lt n\) , \(col_{i,j}=[col_{i-1,j}=0\and col_{i,j-1}=0]\) 。

\(q\) 次询问,给定 \(u,d,l,r\) ,求 \(\sum_{i=u}^d\sum_{j=l}^rcol_{i,j}\) 。

数据范围

  • \(1\le n,q\le 2\cdot 10^5\) 。
  • \(0\le u\lt d\lt n,0\le l\lt r\lt n\) 。

时间限制 \(\texttt{1s}\) ,空间限制 \(\texttt{2048MB}\) 。

分析

先分析 \(col\) 矩阵的性质。

先暴力求出所有满足 \(\min(i,j)\le 2\) 的位置(即前 \(3\) 行 \(3\) 列)的值,容易发现:

  • 对于数列 \(col_{n-1,1}\cdots,col_{1,1},col_{1,n-1}\) ,不会有连续两个 \(1\) 。

证明:

显然。

  • 对于数列 \(col_{n-1,2},\cdots,col_{2,2},\cdots,col_{2,n-1}\) ,不会有连续两个 \(1\) ,也不会有连续 \(3\) 个 \(0\) 。

证明:

前半部分显然,下面仅考虑后半部分。

若 \(col_{i+1,2}=col_{i,2}=col_{i-1,2}=0\) ,则 \(col_{i+1,1}=col_{i,1}=1\) ,矛盾。

若 \(col_{3,2}=col_{2,2}=col_{2,3}=0\) ,则 \(col_{3,1}=col_{1,3}=1\) ,且 \(col_{2,1}\) 和 \(col_{1,2}\) 至少一个为 \(1\) ,矛盾。

若 \(col_{2,j-1}=col_{2,j}=col_{2,j+1}=0\) ,则 \(col_{1,j}=col_{1,j+1}=1\) ,矛盾。

综上即可得证。

再考虑 \(i\ge 2,j\ge 2\) 时,每个 \(1\) "管辖" 的范围。

它所在斜线一定为 \(1\) ,并且相邻两条斜线一定为 \(0\) ,如下图所示:

image

通过上述性质我们可以按照斜线不重不漏确定整个矩阵,这是因为两条相邻的斜线 \(1\) 之间只能间隔 \(1\) 或 \(2\) 条斜线 \(0\) 。


对询问做二维差分,单独处理前 \(2\) 行 \(2\) 列,转化为求 \(\sum_{i=2}^a\sum_{j=2}^b col_{i,j}\) 。

为方便起见,记 \(m=n-2,a\gets a-1,b\gets b-1\) ,令矩阵下标从 \(1\) 开始。

令 \(o_1,\cdots,o_{2m-1}\) 表示每条斜线的数值,对斜线出发点和穿过询问矩形的边界分类讨论:

  • 出发点在左边界,穿过矩形下边界:贡献 \(\sum(a+i-m)\cdot o_i\) 。
  • 出发点在左边界,穿过矩形右边界:贡献 \(\sum b\cdot o_i\) 。
  • 出发点在上边界,穿过矩形下边界:贡献 \(\sum a\cdot o_i\) 。
  • 出发点在上边界,穿过矩形右边界:贡献 \(\sum(b+m-i)\cdot o_i\) 。

预处理 \(\sum o_i\) 和 \(\sum i\cdot o_i\) 即可做到 \(\mathcal O(1)\) 回答,注意经过左上角和右下角的斜线不要算重。

时间复杂度 \(\mathcal O(n+q)\) 。

#include<bits/stdc++.h>
#include"mosaic.h"
#define ll long long
#define vi vector<int>
using namespace std;
const int maxn=2e5+5;
int m;
int o[2*maxn],s1[maxn],s2[maxn],s3[maxn],s4[maxn];
ll t1[2*maxn],t2[2*maxn];
vi col[maxn];
ll get(int l,int r,int x,int y)
{///\sum_{i=l}^r(x+y*i)*o[i]
    return l<=r?x*(t1[r]-t1[l-1])+y*(t2[r]-t2[l-1]):0;
}
ll calc(int a,int b)
{
    if(min(a,b)<0) return 0;
    ll res=0;
    for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
            if(i<=a&&j<=b) res+=col[i][j];
    if(a>=0) res+=s1[b];
    if(a>=1) res+=s2[b];
    if(b>=0) res+=s3[a];
    if(b>=1) res+=s4[a];
    if(--a>=1&&--b>=1)
    {
        res+=get(m+1-a,min(m,b-a+m),a-m,1);
        res+=get(b-a+m+1,m,b,0);
        res+=get(m+1,b-a+m,a,0);
        res+=get(max(m+1,b-a+m+1),m+b-1,b+m,-1);
    }
    return res;
}
vector<ll> mosaic(vi x,vi y,vi u,vi d,vi l,vi r)
{
    int n=x.size(),q=u.size();
    for(int i=0;i<n;i++)
    {
        col[i].resize(i<3?n:3);
        for(int j=0;j<col[i].size();j++)
        {
            if(!i) col[i][j]=x[j];
            else if(!j) col[i][j]=y[i];
            else col[i][j]=!col[i-1][j]&!col[i][j-1];
        }
    }
    for(int i=2;i<n;i++) s1[i]=s1[i-1]+col[0][i],s2[i]=s2[i-1]+col[1][i];
    for(int j=2;j<n;j++) s3[j]=s3[j-1]+col[j][0],s4[j]=s4[j-1]+col[j][1];
    m=n-2;
    for(int j=1;j<=2*m-1;j++)
    {
        o[j]=j<=m?col[m+2-j][2]:col[2][j-m+2];
        t1[j]=t1[j-1]+o[j],t2[j]=t2[j-1]+o[j]*j;
    }
    vector<ll> vec(q);
    for(int i=0;i<q;i++)
        vec[i]=calc(d[i],r[i])-calc(u[i]-1,r[i])-calc(d[i],l[i]-1)+calc(u[i]-1,l[i]-1);
    return vec;
}

标签:vi,res,int,题解,LOJ4222,maxn,IOI2024,sum,col
From: https://www.cnblogs.com/peiwenjun/p/18409212

相关文章

  • Road of the King 题解
    RoadoftheKing题解形成强连通图的必要条件是点\(1\)能在环中,于是考虑\(1\)号点形成的强连通分量\(x\)。这类图论计数题目往往考虑dp,于是我们设\(dp_{i,j,k}\)表示走了\(i\)步,经过了\(j\)个点,\(1\)号点形成的强连通分量\(x\)的大小为\(k\)时的方案数。转移......
  • 洛谷 P11021 [LAOI-6] 区间测速 题解
    题目传送门使用multisetmultiset可以看成一个序列,支持插入一个数或删除一个数,时间复杂度均为\(O(\logn)\),且能始终保证序列中的数是有序的,而且序列中可以存在重复的数(而set容器要求两两不同,且不保证有序)。一个基本事实:速度最大的时刻必然出现在两个相邻点之间。例如从......
  • CF786B 题解
    题意洛谷题面传送门现有一个图,有\(n\)个节点,从节点\(s\)出发,求到\(n\)个点每一个点的最短路。其中,有三种建边方式:建一条从\(u\)到\(v\)的单向边。从节点\(v\)分别向\([l,r]\)的每个结点连一条边。从节点\([l,r]\)向节点\(v\)连边芝士线段树优......
  • Power Designer 连接 PostgreSQL 逆向工程生成pd表结构操作步骤以及过程中出现的问题
    、使用PowerDesigner16.5链接pg数据库1.1、启动PD.选择CreateModel…。 1.2、选择Modeltypes/PhysicalDataModelPhysicalDiagram:选择pgsql直接【ok】  1.3、选择connect在工具栏选择Database-Connect…快捷键:ctrl+shift+N.如下图:  1.4、选择配置连接......
  • 【洛谷 P5076】【深基16.例7】普通二叉树(简化版)题解(多重集合+lower_bound+upper_bound
    【深基16.例7】普通二叉树(简化版)题目描述您需要写一种数据结构,来维护一些数(都是以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数不超过:查询数的排名(排名定义为比当前数小的数的个数。若有多个相同的数,应输出最小的排名)。查询排名为的数。求的前驱(......
  • P6684 题解
    CF1386CP6684cf上时限\(1\)秒,洛谷\(2\)秒。思路维护是否有奇环可用拓展域并查集。暴力复杂度\(O(mq)\)。发现插入容易删除困难,用不删除的莫队,可撤销并查集,复杂度\(O((n+q)\sqrtm\logn)\)。大概要\(5\)秒左右,只能过洛谷上的前\(5\)个子任务。等价对于每个\(r\)......
  • 单词游戏 题解
    四倍经验51nod2875单词游戏acwing1185.单词游戏洛谷SPOJWORDS1-PlayonWords单词PlayonWords我们可以将每一个字母看成一个节点,这样我们就有了一个包含26个节点的图,对于读入的单词,我们将首字母和尾字母对应的节点之间建有向边(中间的字母没什么用就不管了)。此......
  • 【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解
    ......
  • 【秋招笔试】9.08字节跳动秋招(已改编)-三语言题解
    ......
  • 挑战不可能篇1——洛谷28分钟14道CCF GESP C++ 一级上机题&洛谷14道题题解
    扯谈今天继续挑战不可能:洛谷28分钟14道题这我个人认为不简单,算上编译、提交、命名等杂七杂八的东东之后,只剩下了大约1分钟/题。本次挑战的是CCFGESPC++一级上机题.这竟然能成功!下面附上每一题第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题......