Codeforces Round 924 (Div. 2) ---- F. Digital Patterns ---- 题解

news2024/10/6 1:36:59

F. Digital Patterns:

题目描述:

 

思路解析:

要求在一个方块中,任意相邻的方块中他的透明度系数不能相同,这样的方块称为趣味性方块,问这样的方块有多少种。

那么我们可以相当,假设 a1 == a2, 那么每一列的第一行元素都等于第二行元素。  假设b1==b2,那么每一行的第一列元素都等于第二列元素。那么可以想到 a1 != a2, a3!=a2, b1 != b2, b2 != b3,那么就可以组成3*3的趣味性方块,并且其中2*2和1*1方块皆为趣味性方块。那么通过上述分析知道,只有出现相邻元素时,他们便无法组成趣味性方块。那么我们就可以将整个a数组和b数组分为多个区间块。

那么可以发现最后可以利用八个树状数组来维护a b c d这四个数组信息。

代码实现:

import java.util.*;


import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        int t = 1;
        while (t > 0) {
            solve();
            t--;
        }
        w.flush();
        w.close();
    }
    static TreeSet<Integer> set[] = new TreeSet[2];
    static Fenwick[][] fen = new Fenwick[2][4];
    static int N;
    static long ans;
    public static void solve() throws IOException{
        int n = f.nextInt(); int m = f.nextInt();
        int q = f.nextInt();
        ans = 0;
        for (int i = 0; i < Math.min(n, m); i++) {
            ans += (long) (n - i) * (m - i);
        }
        long[] a = new long[n+1];
        long[] b = new long[m+1];
        N = Math.max(n, m);
        for (int i = 0; i < n; i++) {
            a[i] = f.nextInt();
        }
        for (int i = 0; i < m; i++) {
            b[i] = f.nextInt();
        }
        for (int i = 0; i < 2; i++) {
            set[i] = new TreeSet<>();
            for (int j = 0; j < 4; j++) {
                fen[i][j] = new Fenwick(N+1);
            }
        }
        set[0].add(0); set[0].add(n); set[1].add(0); set[1].add(m);

        fen[0][0].add(n, 1);
        fen[0][1].add(n, n);
        fen[0][2].add(n, S1(n));
        fen[0][3].add(n, S2(n));
        fen[1][0].add(m, 1);
        fen[1][1].add(m, m);
        fen[1][2].add(m, S1(m));
        fen[1][3].add(m, S2(m)); // 初始化

        for (int i = n-1; i > 0; i--) {
            a[i] -= a[i-1];
            if (a[i] == 0){
                insert(0, i);
            }
        }
        for (int i = m-1; i > 0; i--) {
            b[i] -= b[i-1];
            if (b[i] == 0){
                insert(1, i);
            }
        }
        w.println(ans);
        for (int i = 0; i < q; i++) {
            int t = f.nextInt(); int l = f.nextInt() - 1; int r = f.nextInt(); int x = f.nextInt();
            if (x == 0) continue;
            if (t == 1){
                if (l > 0){
                    if (a[l] == 0){
                        earse(0, l);
                    }
                    a[l] += x;
                    if (a[l] == 0){
                        insert(0, l);
                    }
                }
                if (r < n){
                    if (a[r] == 0){
                        earse(0, r);
                    }
                    a[r] -= x;
                    if (a[r] == 0){
                        insert(0, r);
                    }
                }

            }else {
                if (l > 0){
                    if (b[l] == 0){
                        earse(1, l);
                    }
                    b[l] += x;
                    if (b[l] == 0){
                        insert(1, l);
                    }
                }
                if (r < m){
                    if (b[r] == 0){
                        earse(1, r);
                    }
                    b[r] -= x;
                    if (b[r] == 0){
                        insert(1, r);
                    }
                }
            }
            w.println(ans);
        }




    }

    public static void add(int t, int x, int coef){
        ans +=(long) coef * x * fen[t ^ 1][2].sum(x); // n <= m 
        ans += (long) coef * fen[t ^ 1][3].sum(x);
        // n <= m
        ans += (long) coef * S2(x) * fen[t ^ 1][0].rangesum(x, N+1); // n > m
        ans +=(long) coef * S1(x) * fen[t ^ 1][1].rangesum(x, N+1);
        fen[t][0].add(x, coef);
        fen[t][1].add(x, (long) coef *x);
        fen[t][2].add(x, coef * S1(x));
        fen[t][3].add(x, coef * S2(x));

    }

    public static void insert(int t, int i){
        int l = set[t].floor(i);
        int r = set[t].ceiling(i);
        set[t].add(i);
        add(t, r - l, -1);
        add(t, i - l, 1);
        add(t, r - i, 1);

    }

    public static void earse(int t, int i){
        set[t].remove(i);
        int l = set[t].floor(i);
        int r = set[t].ceiling(i);

        add(t, r - l, 1);
        add(t, i - l, -1);
        add(t, r - i, -1);
    }

    public static class Fenwick{
        int n;
        long[] a;
        public Fenwick(int n){
            this.n = n;
            a = new long[n];
        }

        public void add(int x, long val){
            for(int i = x+1; i <= n; i += i & -i) a[i-1] += val;
        }

        public long sum(int x){
            long res = 0;
            for (int i = x; i >= 1; i-= i & -i) {
                res += a[i-1];
            }
            return res;
        }
        public long rangesum(int l, int r){
            return sum(r) - sum(l);
        }
    }

    public static long S1(int x) {return (long) x * (x + 1) / 2;}

    public static long S2(int x) {return (long) x * (x + 1) * (2L * x + 1) / 6 - (long) x * x * (x+1L) / 2;}


    static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));
    static Input f = new Input(System.in);

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() throws IOException{
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                tokenizer = new StringTokenizer(reader.readLine());
            }
            return tokenizer.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public Double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }
    }
}

 

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

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

相关文章

Day 17 计划任务

计划任务&#xff1a;在约定好的时间完成计划好的工作 一次性计划任务&#xff1a;at ①安装一次性计划任务at&#xff1a;yum -y install at ②启动at服务&#xff1a;systemctl start atd 使用at命令 at 执行任务的时间 at> 写入需要执行的命令 at> ...... …

数字营销:细分-目标-定位(STP)模式——如何实现精准营销

细分-目标-定位&#xff08;STP&#xff09;模型是最广为人知的营销策略之一。作为营销人员&#xff0c;我们倾向于追逐新鲜事物&#xff0c;总是追求最新、最闪亮的营销技术&#xff0c;并为自己领先于趋势而感到自豪。与内容营销相结合&#xff0c;STP模式仍然是简化营销运作…

Linux http协议与实现http服务器

目录 一、HTTP与URL 1、HTTP协议 2、URL 3、URL编码 4、报文与报头 报文&#xff08;Message&#xff09; 报头&#xff08;Header&#xff09; 二、HTTP&#xff08;超文本传输协议&#xff09;的内部运作机理 请求部分&#xff1a; 响应部分&#xff1a; 三、实现…

聊聊binlog是什么

1. 上一讲思考題解答:redo日志刷盘策略的选择建议 先给大家解释一下上一讲的思考題&#xff0c;我给大家的一个建议&#xff0c;其实对于redo日志的三种刷盘策略&#xff0c;我们通常建议是设置为1 也就是说&#xff0c;提交事务的时候&#xff0c;redo日志必须是刷入磁盘文件…

Java代码基础算法练习-水仙花数-2024.04.17

任务描述&#xff1a; 水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数。水仙花数是 指一个 3 位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身。 例如: 1的3次方 5的3次方 …

python 海龟画图tutle螺旋线

目录 初识turtle模块 基本绘图概念 示例&#xff1a;绘制一个正方形 示例&#xff1a;绘制彩色螺旋线 附录 常用命令 其它命令 在Python编程中&#xff0c;使用turtle模块进行图形绘制是一种非常有趣和富有教育意义的活动。通过控制一个小海龟&#xff08;Turtle&#x…

2010-2022年各省新质生产力测算数据(含原始数据+计算代码+计算结果)

2010-2022年各省新质生产力测算数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2010-2022年 2、来源&#xff1a;国家统计局、各省年鉴、能源年鉴、环境年鉴 3、范围&#xff1a;31省 4、指标&#xff1a; 省份、年份、分地区授权专利数&…

Java中类加载的机制

Java中类加载的机制 从宏观上看&#xff1a; 加载->链接->初始化 整个生命周期流程&#xff1a; 加载->验证->准备->解析->初始化->使用->卸载 1、加载 查找并加载类的二进制数据&#xff0c;并生成Class对象的实例的过程 也就是将类的.class文件…

excel里如何的科学计数法的数字转换成数值?

比如下图&#xff0c;要想把它们转换成3250跟1780&#xff0c;有什么快捷的办法吗&#xff1f; 科学计数法在excel里的格式&#xff0c;与我们常规在数学上写的有差异。这个转换可以这样做&#xff1a; 1.转换后的效果&#xff1a; 2.问题分析 题目中所附截图&#xff0c;单元…

Docker镜像,什么是Docker镜像,Docker基本常用命令【搜索,镜像下载,镜像删除,创建容器,导入到处镜像】及其镜像的分层

docker镜像 1.1什么是镜像&#xff0c;镜像基础 1.1.1 镜像的简介 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境&#xff0c;具体来说镜像包含运行某个软件所需的所有内容&#xff0c;…

ThingsBoard自定义需求生成告警规则以及清除告警规则

上一章已对基础的生成告警规则进行了介绍&#xff0c;如想查看基础&#xff0c;请查看下面的文章 ThingsBoard实现告警规则创建并生成报警信息-CSDN博客文章浏览阅读991次&#xff0c;点赞9次&#xff0c;收藏25次。发起者警报发起者是警报的实体例如&#xff1a;如果收到来自…

Golang基础-13

Go语言基础 介绍 并发 channel goroutine 互斥锁 读写锁 原子操作 select 超时处理 sync包 runtime包 介绍 本文介绍Go语言中 channel、goroutine、互斥锁、读写锁、原子操作、select、超时处理、sync包、runtime包等相关知识。 并发 进程是是最小的资源管理单元…

ArcGIS多数据框联动批量出图

这次内容是《ArcPy结合数据驱动模块的批量制图》课程的新增内容。学完这个课程大家对arcgis的数据驱动页面的批量出图应该是驾轻就熟&#xff0c;不管是无编程的完全基于ArcGIS数据驱动模块批量出图还是结合ArcPy的Mapping模块批量出图&#xff08;arcpy.mapping&#xff09;。…

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#x…

【技巧】win11 删除网络中心中多余的以太网信息

因为网络环境的变化&#xff0c;系统在识别网络时会出现“以太网1”&#xff0c;“以太网2”&#xff0c;“以太网3”的情况。虽然不影响使用&#xff0c;但是对于一些强迫症来说很不友好&#xff0c;通过以下方式删除&#xff1a; 1、Win R 打开&#xff0c;运行&#xff0c;…

「 安全工具介绍 」软件成分分析工具Black Duck,业界排名TOP 1的SCA工具

在现代的 DevOps 或 DevSecOps 环境中&#xff0c;SCA 激发了“左移”范式的采用。提早进行持续的 SCA 测试&#xff0c;使开发人员和安全团队能够在不影响安全性和质量的情况下提高生产力。前期在博文《「 网络安全常用术语解读 」软件成分分析SCA详解&#xff1a;从发展背景到…

open Gauss 数据库-05 openGauss数据库备份恢复指导手册

发文章是为了证明自己真的掌握了一个知识&#xff0c;同时给他人带来帮助&#xff0c;如有问题&#xff0c;欢迎指正&#xff0c;祝大家万事胜意&#xff01; 目录 前言 openGauss数据库备份恢复 1 实验介绍 1.1 关于本实验 1.2 实验目的 2 实验前提 3 物理备份和恢复…

Day3 权限管理

Day3 权限管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 创建管理员…

技术周刊的转变:如何平衡热爱与现实?

大家好&#xff0c;我是那个自己打脸自己的猫哥&#xff0c;本来说周刊不做订阅制的&#xff0c;现在却推出了订阅专栏。今天想为自己辩护一下&#xff0c;同时聊聊技术周刊今后的发展计划。 首先回顾一下我过去的想法吧&#xff0c;然后再解释为什么会突然出现转变。 出于对…

Stable Diffusion 3 API 发布!超越Midjourney v6和DALL-E 3

Stable Diffusion 3 于 2 月首次宣布作为预览版发布。而今天&#xff0c;StabilityAI 正式推出了 Stable Diffusion 3 和 Stable Diffusion 3 Turbo API 的API接口服务。 Stability AI 称仍在持续改进该模型&#xff0c;并没有说明发布日期。模型还没发布&#xff0c;但API先来…