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

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.mfbz.cn/a/555758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS ------ Block的总结

前面看了Block的基本知识&#xff0c;和一些源码。但对于block怎么用的还不了解&#xff0c;代码中出现block会看不懂&#xff0c;现在来具体看一下Block的用法并做个总结。 1.Block是什么 block对象是一个C语言结构体&#xff0c;可以并入C和OC的代码中&#xff0c;Block本质…

每日OJ题_多源BFS①_力扣542. 01 矩阵(多源BFS解决最短路原理)

目录 多源BFS解决最短路算法原理 力扣542. 01 矩阵 解析代码 多源BFS解决最短路算法原理 什么是单源最短路 / 多源最短路&#xff1f; 之前的BFS解决最短路都是解决的单源最短路。 画图来说&#xff0c;单源最短路问题即为&#xff1a; 而对于多源最短路问题: 如何解决此…

微信小程序之点击事件

微信小程序中常用的点击事件主要是 tap&#xff0c;但除此之外还有其他的触摸类事件&#xff0c;用于不同的交互场景。以下是一些常见的点击和触摸相关的事件及其区别&#xff1a; 1、tap——最基本的点击事件&#xff0c;适用于一般的轻触交互&#xff0c;类似于 HTML 中的 c…

Pixverse:开启文生视频与图生视频新纪元

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

NPU流式输出-torch_npu和transformers框架-多线程Streamer-昇腾910B-EE1001

前情提要 torch_npu框架不支持多线程自动set_device 报错详情 直接使用transformers的TextIteratorStreamer进行流式推理&#xff0c;会报错 Exception in thread Thread-6: Traceback (most recent call last):File "/root/anaconda3/envs/AI/lib/python3.9/threadin…

Linux shell 脚本基础与部署SpringCloud实战

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

L2正则化——解释为什么可以减少模型的复杂度

L2正则化是一种用于机器学习模型的技术&#xff0c;旨在减少模型的复杂度&#xff0c;从而提高其泛化能力。在L2正则化中&#xff0c;通过添加一个惩罚项&#xff0c;模型的权重被迫保持较小的值&#xff0c;这有助于防止过拟合&#xff0c;即模型在训练数据上表现良好但在未见…

python学习笔记B-07:序列结构之列表--列表的常用函数和方法

以xx_函数名(列表名)的形式出现的是函数&#xff1b;以xx_列表名.xx_方法名的形式出现的是方法。 列表常用函数如下&#xff1a; len()&#xff1a;计算列表元素数量 max()&#xff1a;获取列表元素最大值 min():获取列表元素最小值 sum():计算列表中各元素之和 列表常用方法如…

【Java EE】文件操作

目录 1.认识文件 2.树型结构组织和目录 3.文件路径&#xff08;Path&#xff09; 4.其他知识 5.Java中操作文件 5.1File概述 5.1.1属性 5.1.2构造方法 5.1.3方法 5.2代码示例 1.认识文件 我们先来认识狭义的文件&#xff08;file&#xff09;。针对1硬盘这种持久化存…

HTML重要标签梳理学习

1、HTML文件的框架 使用VS Code编码时&#xff0c;输入!选中第一个&#xff01;就可以快速生成一个HTML文件框架。 2、标签 <hr> <!--下划线--> <br> <!--换行--> <strong>加粗</strong> &…

MySQL行级锁——技术深度+1

引言 本文是对MySQL行级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL行级锁 行级锁&#xff08;Row-…

案例研究 | JumpServer助力天虹股份构建可靠的运维安全审计平台

天虹数科商业股份有限公司&#xff08;以下简称为“天虹股份”&#xff09;成立于1984年&#xff0c;是国有控股的上市公司。通过人本、科学的管理&#xff0c;以及专业、高效的运营&#xff0c;天虹股份连续多年入围中国连锁百强企业&#xff0c;拥有全国领先的零售技术研发和…

vue3 项目启动时vite版本问题报错

背景&#xff1a; 我是在项目迁移过程中遇到的这个问题&#xff0c;前提可以看下面这篇 http://t.csdnimg.cn/g70Eq 问题描述 迁移项目时&#xff0c;将项目整体升级到了vue3版本&#xff0c;启动项目时出现下列报错&#xff1a; npm ERR! Found: vite5.1.4 npm ERR! node_…

2024-2.基础操作-Python

Jupiter基本使用 cell有两种模式&#xff1a; codemarkdown 快捷键 新建cell&#xff1a;a,b删除cell&#xff1a;dd&#xff0c;x运行cell&#xff1a;shiftenter切换cell模式&#xff1a; m&#xff1a;将code模式的cell切换到mdy:将md模式的cell切换到code 智能补全&#x…

QT Webengine开发过程报错qml: Render process exited with code 159 (killed)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、解决方法二、补充说明总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 基于QT的Webengine开发过程中&#xff0c;QT的官方示例…

【算法】反转链表

本题来源---《反转链表》 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…

22长安杯电子取证复现(检材一,二)

检材一 先用VC容器挂载&#xff0c;拿到完整的检材 从检材一入手&#xff0c;火眼创建案件&#xff0c;打开检材一 1.检材1的SHA256值为 计算SHA256值&#xff0c;直接用火眼计算哈希计算 9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34 2.分析检材1&am…

50.HarmonyOS鸿蒙系统 App(ArkUI)web组件实现简易浏览器

50.HarmonyOS鸿蒙系统 App(ArkUI)web组件实现简易浏览器 配置网络访问权限&#xff1a; 跳转任务&#xff1a; Button(转到).onClick(() > {try {// 点击按钮时&#xff0c;通过loadUrl&#xff0c;跳转到www.example1.comthis.webviewController.loadUrl(this.get_url);} …

Root mapping definition has unsupported parameters: [all : {analyzer=ik_max_wor

你们好&#xff0c;我是金金金。 场景 我正在使用Springboot整合elasticsearch&#xff0c;在创建索引(分词器) 运行报错&#xff0c;如下 排查 排查之前我先贴一下代码 import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; // 注意这个包SpringBootTe…

Linux中如何安装ImageMagick及其常规使用命令

在Linux中安装ImageMagick可以通过包管理工具进行安装。具体步骤如下&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 使用以下命令更新系统软件包列表&#xff1a; sudo apt update使用以下命令安装ImageMagick&#xff1a; sudo apt install imagemagick安装完…
最新文章