[ABC260G] Scalene Triangle Area题解

[ABC260G] Scalene Triangle Area

题意

有一个 \(n \times n\) 的矩阵,里面由 XO 组成,对于一个 O,如果它的坐标是 \((u, v)\) 那么它所可以影响的点的坐标是 \((x, y)\),其中 \((x, y)\) 满足以下条件:

  • \(u\le x\)

  • \(v\le y\)

  • \((x-u)+\dfrac{(y-v)}{2}<M\)

给定 \(N,M,Q\)\(Q\) 次询问 \(X_i,Y_i\),询问这个位置被几个 O 控制。

思路

1.暴力(虽然也能过)

对于一个 O,它肯定可以影响几行,而每一行也肯定是连续的一段,那么可以枚举行然后计算连续的一段的左端点和右端点,然后前缀和计算(由于后面有正解,这里就不详细解释了)。

#include <iostream>

using namespace std;

const int MaxN = 2010;

int f[MaxN][MaxN], n, m, l, r, q, ans;
char c[MaxN][MaxN];

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cin >> c[i][j], f[i][j] = f[i][j - 1] + (c[i][j] == 'O');
    }
  }
  for (cin >> q; q; q--) {
    cin >> l >> r, ans = 0;
    for (int i = max(l - m, 1); i <= l; i++) {
      int j = max(r - (m - (l - i)) * 2, 0);
      (j <= r) && (ans += f[i][r] - f[i][j]);
    }
    cout << ans << '\n';
  }
  return 0;
}

2.正解 差分

我们来看这样一组数据

OXXXXXXXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX

\(m\) 设为
\(3\),那么可以得知 O 所影响的点是(\(1\) 表示影响了):

111111000
111100000
110000000
000000000
……………………

那么由于是二位差分所以先以列的方向做差分,可以得到:

1,0,0,0,0,0,-1,0,0
1,0,0,0,-1,0,0,0,0
1,0,-1,0,0,0,0,0,0
……………………

得到这个后会发现如果直接以行的方向做差分是不行的所以可以把它拆开得到:

1,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0
……………………

和:

0,0,0,0,0,0,-1,0,0
0,0,0,0,-1,0,0,0,0
0,0,-1,0,0,0,0,0,0
……………………

这时第一个矩阵可以做以行的方向做差分了:

1,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
-1,0,0,0,0,0,0,0,0
……………………

那第二个矩阵怎么办?很简单,只要以斜着做差分就行了,如下图所示:

0,0,0,0,0,0,-1,0,0
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0
……………………


这样就可以了,这四个差分点分别就是(\(i, j\) 表示 O 的位置):\((i, j), (i + m, j), (i, j + 2 \times m), (i + m, j)\)

最后反着还原原数组即可。

#include <iostream>

using namespace std;

const int MaxN = 2010;

int n, m, t, l, r;
char c[MaxN][MaxN];
int q[MaxN * 3][MaxN], x[MaxN * 3][MaxN * 5], st[MaxN * 3][MaxN * 5];

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cin >> c[i][j];
      if (c[i][j] == 'O') {
        q[i][j]++, q[i + m][j]--, x[i][j + 2 * m]--, x[i + m][j]++;
      }
    }
  }
  for (int i = 1; i <= n + m; i++) {
    for (int j = 1; j <= n + 2 * m; j++) {
      x[i][j] += x[i - 1][j + 2];
    }
  }
  for (int i = 1; i <= n + m; i++) {
    for (int j = 1; j <= n; j++) {
      q[i][j] += q[i - 1][j];
    }
  }
  for (int i = 1; i <= n + m; i++) {
    for (int j = 1; j <= n + 2 * m; j++) {
      st[i][j] = q[i][j] + x[i][j];
    }
  }
  for (int i = 1; i <= n + m; i++) {
    for (int j = 1; j <= n + 2 * m; j++) {
      st[i][j] += st[i][j - 1];
    }
  }
  for (cin >> t; t; t--) {
    cin >> l >> r;
    cout << st[l][r] << '\n';
  }
  return 0;
}

这是本蒟蒻的第一篇题解,请管理大大放宽放宽吧。

本文转载于网络 如有侵权请联系删除

相关文章

  • 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题…

    是按照以下步骤检查的除了ACCESS_TOKEN没有缓存其他都可以如果是invalidsignature签名错误。建议按如下顺序检查:1.确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign页面工具进行校验。2.确认config中nonceStr(js中驼峰标准大写S),timestamp与用以签名中的对应noncestr,timestamp一致。3.确认url是页面完整的url(请在当前页面alert(location.href.split(‘#’)[0])确认),包括’http(s)://’部分,以及’?’后面的GET参数部分,但不包括’#’hash后面的部分。4.确认config中的appid与用来获取jsapi_ticket的appid一致。5.确保一定缓存access_token和jsapi_ticket。这个是重点: 确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去

  • 微博新财报:老玩家有新挑战

    配图来自Canva可画近期粉丝为《青春有你3》的选手应援而引发的“倒奶”事件,微博在电话会议中也被问及影响,铺天盖地的的舆论和八卦似乎成为了微博的一种标签。而日前,微博也发布了最新季度财报,2021年第一个季度微博的表现又会如何呢?用户体量大且仍在增长微博2021年Q1财报数据显示,2021年3月,微博MAU(月活跃用户人数)为5.3亿,同比下降4%,环比增长2%,移动客户端MAU占比94%;微博DAU(平均每日活跃用户人数)为2.3亿,同比增长5%,环比增长2%。从社会大环境来看,2021年Q1中国新冠疫情得到了有效的控制,人们的生活恢复正常,不像在2020年上半年无法外出。所以相对于2020年Q1用户的高基数,2021年Q1的同比参考性比较小。而且在2020年Q1,微博抓住节点,积极推送当时人们最为关注的疫情信息,使得微博的用户量和用户活跃度得到大幅度上涨。因此,在这波流量红利过去后,微博用户数据在2021年Q1同比下降是无法避免的。但是在后疫情时代,微博CEO王高飞称微博得益于获客渠道的改善,以强化微博热点和社交方面的独特优势,使得微博的用户量和用户活跃度环比保持稳定增长。从数据

  • 从Hexo迁移到Hugo-送漂亮的Hugo Theme主题

    自从Hugo出来后,作为Go语言(golang)的重度用户的重度用户,一直想把自己的博客迁移到Hugo,但是一直没有行动,主要原因在于,我的博客使用的一款主题maupassant非常简洁、响应速度快,但是在Hugo上并没有类似一的主题,再加上从Hexo迁移到Hugo还有好多要修改的,所以一直迟迟没有行动。Hugo的maupassant主题前段时间在Github上闲逛,竟然发现了有人基于Hugo制作了maupassant主题,就clone下来看了一下,发现的确实现了maupassant主题的大部分功能,可以用,但是也存在很多问题。比如:不支持最近文章,我现在的Hexo的maupassant主题是支持的。分类不支持文章数量的显示。不支持标签云RSS支持,但是不能自动被发现。有菜单,但是不是Hugo的菜单功能,灵活性不足。不支持友情链接。没有文档归档功能。GA统计分析不支持。没有代码高亮。其他小细节还有很多,这里就不一一列举了,总之,如果按这个模板进行迁移,那么我的博客网站原来的很多功能都没有了,这是我不能接受的。完善Hugo的maupassant主题既然很多功能都不支持,而且我又想迁移到H

  • cs224d-第二课-word2vec

    首先我想说下为什么会去学习cs224d,原先我一直是做工程的,做了大概3年,产品做了好多,但是大多不幸夭折了,上线没多久就下线,最后实在是经受不住心灵的折磨,转行想做大数据,机器学习的,前不久自己学习完了Udacity的深度学习,课程挺好,但是在实际工作中,发现课程中的数据都是给你准备好的,实践中哪来这么多好的数据,只能自己去通过各种手段搞数据,苦不堪言。在找数据的过程中,发现做多的数据还是文本数据,不懂个nlp怎么处理呢,于是就来学习cs224d这门课程,希望在学习过程中能快速将课程所学应用到工作中,fighting! 以下文字都是从一个初学者角度来写的,如有不严肃不正确的,请严肃指出。 语言模型 刚接触nlp的时候,经常看到有个词叫languagemodel,于是先回答下什么语言模型?语言模型简单点说就是评价一句话是不是正常人说出来的,然后如果用一个数学公式来描述就是: 举一个具体例子来说明上面公式的含义: 我喜欢自然语言处理,这句话分词后是:"我/喜欢/自然/语言/处理",于是上面的公式就变为: P(我,喜欢,自然,语言,处理)=p(我)p(喜欢|我)p(自然

  • 老码农眼中的简明AI

    AI,ArtificialIntelligence,人工智能。就像每个人眼中都有一个自己的哈姆雷特一样,每一个看AI都是不一样的。作为一个老程序员,也只是一个工作时间长一些的程序员而已,本没有什么资格定义AI,但是面对这样的问题,还是强作镇定,从一个工程师角度阐述一下,“什么是AI?”以及AI和大数据,机器学习,神经网络,自然语言处理等诸多名词到底有什么关系呢?什么是AI?AI,来自于维基百科的解释是这样的:Artificialintelligenceisintelligenceexhibitedbymachines,ratherthanhumansorotheranimals.Incomputerscience,thefieldofAIresearchdefinesitselfasthestudyof"intelligentagents":anydevicethatperceivesitsenvironmentandtakesactionsthatmaximizeitschanceofsuccessatsomegoal.Colloquially,theterm&q

  • 直方图均衡化及matlab实现

    在处理图像时,偶尔会碰到图像的灰度级别集中在某个小范围内的问题,这时候图像很难看清楚。比如下图:它的灰度级别,我们利用一个直方图可以看出来(横坐标从0到255,表示灰度级别,纵坐标表示每个灰度级别的像素出现个数)可以看出,上图是由于灰度级过于集中,导致图片难以看清。这时候我们可以把灰度级别“拉开”,使得灰度级多且分布均匀,让图片具有高对比度和多变的灰度色调。那么如何拉开才能使得灰度级别占据从0到255的整一个范围呢?我们可以先利用概率,计算出原图中每一个灰度级别的像素个数占所有像素个数的比例,然后比例逐个灰度级别地累加,接着把累加比例乘以256,得出该灰度级别“拉开”之后应该在哪一个级别。举一个例子,假设一张图片像素点对应的矩阵为f=[100,100,100,100,100; 110,110,110,110,110; 120,120,120,120,120; 130,130,130,130,130; 140,140,140,140,140];那么我们可以看到灰度级别为100的像素个数的比例为1/5,那么现在灰度级别应该改为round(1/5*256-1)。之所以-1是因为灰度级从0到2

  • 64位内开发第二十一讲,内核下的驱动程序与驱动程序通讯

    目录驱动程序调用驱动程序一丶驱动调用驱动介绍.1.1驱动调用驱动介绍1.2驱动程序调用驱动程序流程图1.3内核通信方式二丶文件句柄形式调用驱动程序2.1文件句柄-同步方式2.1.1文件句柄形式和简介2.1.2文件句柄同步与异步2.1.3准备DriverB驱动2.1.4DriverA的驱动代码-同步方式2.1.5效果2.2文件句柄-第一种异步方式2.2.1异步方式简介2.2.2内核下的异步处理方式第一种2.2.3准备异步处理驱动DriverB2.2.4DriverA驱动代码以及注意事项2.2.5效果2.3文件句柄-第二种异步方式2.3.1结构与简介2.3.2API编程获取方式2.3.3DriverA异步处理2代码实现.2.3.4效果3.1文件句柄-符号链接方式3.1.1符号链接方式简介3.1.2DriverA代码演示3.1.3效果演示.三丶高级驱动程序调用IRP方式3.1设备调用方式-同步调用3.1.1IRP方式调用简介3.1.2API简介3.1.3模拟调用核心思想3.1.4DriverA的核心代码3.1.5效果3.2设备调用方式-异步方式3.2.1异步IRP申请说明3.2.2异步IRP

  • HTML复选框_HTMLcheckbox代码

    大家好,又见面了,我是你们的朋友全栈①将type类型设为”checkbox”②name=””用来设置变量名③value=””用来设置变量默认值④<input>此处设置需要显示的内容<br>代码示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>html复选框</title></head><body><form><label>请选择你喜欢的水果:</label><br><inputtype="checkbox"name="apple"value="苹果">苹果<br><inputtype="checkbox"name="banana"value="香蕉"&g

  • 网工学Python——模块和包

    阅读目录 一模块3.1import3.2from...import...3.3把模块当做脚本执行3.4模块搜索路径3.5编译python文件二包2.2import2.3from...import...2.4__init__.py文件2.5fromglance.apiimport*2.6绝对导入和相对导入2.7单独导入包 一模块 1、什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。但其实import加载的模块分为四个通用类别:  1使用python编写的代码(.py文件)2已被编译为共享库或DLL的C或C++扩展3包好一组模块的包4使用C编写并链接到python解释器的内置模块 2、为何要使用模块 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过pythontest.py方式去执行,此时test.py被称为脚本script。随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时

  • 数据恢复原理实验

    一、预备知识           硬盘存储原理    硬盘存储是指以硬盘为存储介质的存储方式,是一种采用磁介质的数据存储设备,数据存储在密封于洁净的硬盘驱动器内腔的若干个磁盘片上。这些盘片一般是在以铝为主要成分的片基表面涂上磁性介质所形成,在磁盘片的每一面上,以转动轴为轴心、以一定的磁密度为间隔的若干个同心圆就被划分成磁道(track),每个磁道又被划分为若干个扇区(sector),数据就按扇区存放在硬盘上。在每一面上都相应地有一个读写磁头(head),所以不同磁头的所有相同位置的磁道就构成了所谓的柱面(cylinder)。    传统的硬盘读写都是以柱面、磁头、扇区为寻址方式的(CHS寻址)。硬盘在上电后保持高速旋转(5400转/min以上),位于磁头臂上的磁头悬浮在磁盘表面,可以通过步进电机在不同柱面之间移动,对不同的柱面进行读写。所以在上电期间如果硬盘受到剧烈振荡,磁盘表面就容易被划伤,磁头也容易损坏,这都将给盘上存储的数据带来灾难性的后果

  • pandas dataframe apply 传入外部参数 args

    #!/usr/bin/python3 importpandasaspd #如果x小于threshold就等于1,否则等于0 defjuege_threshold(x,threshold): return1ifx<=thresholdelse0 data_dict={"values":[1,3,5,7,9,11,13,15,17,19]} data_df=pd.DataFrame(data_dict) print(data_df) data_df["values_7"]=data_df["values"].apply(juege_threshold,threshold=7) data_df["values_10"]=data_df["values"].apply(juege_threshold,threshold=10) print(data_df) 复制

  • 我的职业生涯总结---班门弄斧之我们该怎样从零开始学习.NET

         标题说的很清楚了,这篇文章纯属班门弄斧,大神可随意喷。我只是结合自己4年不到的学习与使用.NET的水平。         首先说下这篇博客的背景吧。前两天有个我的读者加我微信,然后就有了下面这样的对话,   可能有些人第一眼看到这段对话会觉得我有点装13的感觉,后来想想我这样的回复可能真的会让一个刚入行的兄弟感到心凉,在这里说声抱歉。当时我回复他说有点忙的时候是已经过了一个小时,但当时确实在研究支付宝的一些东西给忙忘记了,还请谅解。我当时并没有给他什么实质性的建议,原因是我确实不知道该怎样来告诉他怎么来学习,因为我的经历并不是适用于所有的人,但我觉得我确实应该总结下我现在的职业生涯了,或许能给那些同我的情况相似的朋友们在职业道路上提供一个参考。            我来自安徽一个偏远的农村,上高中之前没怎么进过城,更没有近距离的接触过电脑,只是在初一的时候跟电脑有

  • CF1187E Tree Painting

    前言 一道挺好的思维题。 本人蒟蒻一枚,这题是本人独立A掉的第一道洛谷蓝色难度的CF思维题,极具纪念意义。故本人会将思考过程尽量全面地记录下来,以观察思考的不足之处。 题意简述 题目链接   给定一棵树,初始时全为白点,要求按以下方法进行n次染色操作:   1.第一次可以任意选择一个节点染成黑色。   2.以后每一次任意选择一个与黑点有直接边相连的白点,将其染成黑色。   定义每次染色可获得的权值为该次染色时,所染的白点所在连通块的大小。   要求n次染色后所获得的权值之和最大,求这个最大值。 算法概述   最优化问题,优先考虑DP。   首先很容易发现一个很显然的性质:当第一次染色的节点确定下来之后,以后染色所能获得的权值之和就确定了。   暴力枚举第一次染色的节点显然不行,所以可以考虑用dp来计算这个权值之和。   f[u]表示以u为一号染色点时所能获得的权值之和。   我们关键来看这个f[u]如何计算。不难发现f[u]可分成两部分:   ①从u出发向以u为根的子树染色,所能获得的权值之和。   ②从u出发向u的父亲方向染色,所能获得的权值之和。   子树的信息还是比较方

  • JVM 参数及各部分含义(转)

    转自:https://www.jianshu.com/p/1c6b5c2e95f9 JVM参数分类 JVM参数分为标准参数和非标准参数: 标准参数:"-"开头的参数,如-client,-server等 非标准参数:"-X"和"-XX"开头的参数,如-Xmx,-XX:+DisableExplicitGC 或者简单分为三类: "-"开头的参数 "-X"开头的参数 "-XX"开头的参数 标准参数("-"开头的参数) -client 选择client模式的VM。客户端常使用 -server※ 选择server模式的VM。服务端常使用 -agentlib:libname[=options] Loadsnativeagentlibrarylibname,forexample: -agentlib:hprof -agentlib:jdwp=help -agentlib:hprof=help SeeJVMTIAgentCommand-LineOptionsat http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.htm

  • 哪些反常识的现象

    1<5<2==>truehttps://blog.csdn.net/qq_39657585/article/details/105317915 2||3 ==>2 (不是布尔值)

  • CSS的属性-列表属性

    列表属性可以用来: 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 值 描述 list-style:none 去除标记 list-style:disc 实心圆(默认) list-style:circle 空心圆 list-style:square 实心方块 list-style:decimal 数字,1,2,3… list-style:decimal-leading-zero 01,02,03… list-style:lower-roman i,ii,iii,iv,v… list-style:upper-roman I,II,III,IV,V… list-style:lower-alpha/lower-latin a,b,c,d,e… list-style:upper-alpha/upper-latin A,B,C,D,E… list-style:cjk-ideographic 一、二、三… list-style:url("") 利用图像替换列表项的标记  

  • windows 下安装venv慢,更换国内豆瓣源

    pip3install--index-urlhttps://pypi.douban.com/simplevirtualenv 复制

  • Python基础笔记系列三:list列表

      本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!   python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔用方括号括起来,和字符串一样可以通过索引index和切片来访问某个元素或子列表。   元组相当于一个只读的列表,它的元素不可修改。  字典是一种键值对。 list列表可以类比于其它语言(如,C语言)的数组,其起始下标为也为0。1.列表的索引访问  1)通过list_name[index]来访问,每个列表的起始下标为0。例子: 1demolist=[1,2,3,4]#列表的定义 2printtype(demolist)#打印类型 3printdemolist[0]#输出第一个元素 4printdemolist[1]#输出第二个元素复制 输出: <type'list'> 1 2复制   2)可以通过dellist_name[index]来删除列表的下标是index的数据。例子: 1demolist=[1,2,3,4]#列表的定义 2deldemolist[2]#

  • 数据结构与面向对象程序设计(第一周作业)

    20192309金一非作业一 作业一 1.对于这门课没有多少的认识,希望通过这门课,能熟练自己的编程能力,加深对计算机的认识。 2.对与10000行代码量在脑袋中没有一个概念,上学期c语言oj平台上大概完成了150道的题,这学期对于10000的代码量应该能完成。 3.还行。马马虎虎,没啥学习经验,感觉就是看书。 作业二 学习过程: 首先是基于virtualbox虚拟机安装ubuntu安装Linus操作系统,这一部分参考了娄老师的安装教程(https://www.cnblogs.com/rocedu/p/6012545.html) 教程很详细,但在安装过程中会出现从官网下载非常慢的情况,可以通过清华的镜像网站下载。在配置虚拟机的过程中发现了如下问题: 会发现存储没有分配盘片,选择第二主通道,点击右侧小盘片,选择之前下载的.iso文件,就可以成功配置了。 成功之后 之后就可以顺利在自己的电脑上安装Linus系统了。 之后学习Linus系统的命令 学习的主要命令如下: 快捷键: ls命令: ~$ls(~$ls.)查看当前目录的文件 ~$ls-a(查看当前目录所有文件,包括隐藏文件) 关

  • Vue 多层级目录拖动排序

    本示例基于Vue.Draggable中Nested示例,git地址:https://github.com/SortableJS/Vue.Draggable 需求描述 基于多表头列表的一种后台设置: 1.列字段可以拖进表头目录中(文件与文件夹的关系) 2.可修改表头目录名称 3.可删除表头目录(删除后目录内部的列重排) 效果图如下:   设置完成后在前台列表的展示: 代码 1.nested-main.vue <template> <divclass="row"> <divclass="col-8"> <nested-draggable:tasks="list"/> </div> <rawDisplayer class="col-3" :value="list" title="List" /> </div> </template> <script> importnestedDraggablefrom'./infra/nested'; exportdefault{ n

  • BUUCTF-2020寒假刷题记录

    BUUCTF-2020寒假刷题记录 Web [RoarCTF2019]EasyCalc 打开源码,看到calc.php,打开看到源码。 在num前面加个空格即可绕过 ?num=phpinfo(); calc.php?num=print_r(scandir(chr(47))) 列出目录 ?%20num=file_get_contents(chr(47).f1agg) 拿到flag [RoarCTF2019]EasyJava 这道题在开学初的时候在嘶吼做过了2333~ POST方式请求即可下载help.docx ?filename=WEB-INF/web.xml 复制 请求获取web.xml可以获取站点信息 发现FlagController控制器,并且可以获得class文件 /WEB-INF/classes/com/wm/ctf/FlagController.class 复制 下载class文件后 放入luyten反编译。 把flag字段的base64解码即可获得flag [SUCTF2019]EasySQL 输入1;showtables#可以看到一个Flag表。 输入*,1列出所有

相关推荐

推荐阅读