非确定性有穷状态决策自动机练习题Vol.2 C. 奇袭

题目描述

由于各种原因,桐人现在被困在\(Under World\)(以下简称\(UW\))中,而\(UW\)马上 要迎来最终的压力测试——魔界入侵。

唯一一个神一般存在的\(Administrator\)被消灭了,靠原本的整合骑士的力量 是远远不够的。所以爱丽丝动员了\(UW\)全体人民,与整合骑士一起抗击魔族。

在\(UW\)的驻地可以隐约看见魔族军队的大本营。整合骑士们打算在魔族入侵前 发动一次奇袭,袭击魔族大本营! 为了降低风险,爱丽丝找到了你,一名优秀斥候,希望你能在奇袭前对魔族大本营进行侦查,并计算出袭击的难度。

经过侦查,你绘制出了魔族大本营的地图,然后发现,魔族大本营是一个\(N \times N\)的网格图,一共有\(N\)支军队驻扎在一些网格中(不会有两只军队驻扎在一起)。

在大本营中,每有一个\(k×k(1≤k≤N)\)的子网格图包含恰好\(k\)支军队,我们袭 击的难度就会增加\(1\)点。

现在请你根据绘制出的地图,告诉爱丽丝这次的袭击行动难度有多大。

输入格式

第一行,一个正整数\(N\),表示网格图的大小以及军队数量。

接下来N行,每行两个整数,\(Xi\),\(Yi\),表示第\(i\)支军队的坐标。

保证每一行和每一列都恰有一只军队,即每一个\(Xi\)和每一个\(Yi\)都是不一样 的。

输出格式

一行,一个整数表示袭击的难度。

样例

样例输入

5

1 1

3 2

2 4

5 5

4 3

样例输出

10

样例解释

显然,分别以\((2,2)\)和\((4,4)\)为左上,右下顶点的一个子网格图中有\(3\)支军队,

这为我们的难度贡献了\(1\)点。

类似的子网格图在原图中能找出\(10\)个。

数据范围与提示

对于\(30\%\)的数据,\(N ≤ 100\)

对于\(60\%\)的数据,\(N ≤ 5000\)

对于\(100\%\)的数据,\(N ≤ 50000\)

分析

用线段树即可解决

首先,我们发现,如果要满足 \(k×k(1≤k≤N)\) 的子网格图包含恰好 \(k\) 支军队

那么这 \(k\) 只军队的最大横坐标减去最小横坐标恰好等于这 \(k\) 只军队的最大纵坐标减最小纵坐标

两维不好处理,因此我们把横坐标作为下标,纵坐标作为权值

这样原问题就变成了在一个排列中有多少区间内的数是连续的

我们发现这可以用线段树去维护

我们把线段树的节点定义为以某个点为左端点,以扫到的点为右端点的区间中连续区间的个数

线段树要维护的信息有连续区间个数的最小值,该最小值的个数,以及区间加和操作中的 \(lazy\) 标记

每次从右边新加入一个点 \(i\) 时,我们把区间 \([1,i]\) 整体加 \(1\)

代表此时又多了一个不连续的区间

此时我们去找 \(a[i]+1\) 和 \(a[i]-1\) 的位置,如果它们的位置在 \(i\) 的左边,我们就把 \([1,a[i]-1]\) 或者 \([1,a[i]+1]\) 整体减一,代表包含 \(a[i]+1\) 或者 \(a[i]-1\) 的区间可以与 \(a[i]\) 合并形成一个大区间

每次枚举一个右端点时就单独计算一下价值

代码

#include<cstdio>
#include<algorithm>
#include<cmath>
const int maxn=1e6+5;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int a[maxn],n,wz[maxn];
struct asd{
int l,r,min,cnt,laz;
}tr[maxn<<1];
void push_up(int da){
if(tr[da<<1].min==tr[da<<1|1].min){
tr[da].min=tr[da<<1].min;
tr[da].cnt=tr[da<<1].cnt+tr[da<<1|1].cnt;
} else if(tr[da<<1].min<tr[da<<1|1].min){
tr[da].min=tr[da<<1].min;
tr[da].cnt=tr[da<<1].cnt;
} else {
tr[da].min=tr[da<<1|1].min;
tr[da].cnt=tr[da<<1|1].cnt;
}
}
void push_down(int da){
if(tr[da].laz==0) return;
tr[da<<1].min+=tr[da].laz;
tr[da<<1|1].min+=tr[da].laz;
tr[da<<1].laz+=tr[da].laz;
tr[da<<1|1].laz+=tr[da].laz;
tr[da].laz=0;
}
void build(int da,int l,int r){
tr[da].l=l,tr[da].r=r;
if(l==r){
tr[da].min=1;
tr[da].cnt=1;
return;
}
int mids=(l+r)>>1;
build(da<<1,l,mids);
build(da<<1|1,mids+1,r);
push_up(da);
}
int cx(int da,int l,int r){
if(tr[da].l>=l && tr[da].r<=r){
if(tr[da].min==1) return tr[da].cnt;
return 0;
}
push_down(da);
int mids=(tr[da].l+tr[da].r)>>1;
int ans=0;
if(l<=mids) ans+=cx(da<<1,l,r);
if(r>mids) ans+=cx(da<<1|1,l,r);
return ans;
}
void xg(int da,int l,int r,int val){
if(tr[da].l>=l && tr[da].r<=r){
tr[da].min+=val;
tr[da].laz+=val;
return;
}
push_down(da);
int mids=(tr[da].l+tr[da].r)>>1;
if(l<=mids) xg(da<<1,l,r,val);
if(r>mids) xg(da<<1|1,l,r,val);
push_up(da);
}
int main(){
n=read();
for(int i=1;i<=n;i++){
int aa,bb;
aa=read(),bb=read();
a[aa]=bb;
wz[a[aa]]=aa;
}
build(1,1,n);
long long ans=0;
for(int i=1;i<=n;i++){
if(i>1) xg(1,1,i-1,1);
if(wz[a[i]-1]<=i && wz[a[i]-1]){
xg(1,1,wz[a[i]-1],-1);
}
if(wz[a[i]+1]<=i && wz[a[i]+1]){
xg(1,1,wz[a[i]+1],-1);
}
ans+=(long long)cx(1,1,i);
}
printf("%lld\n",ans);
return 0;
}

非确定性有穷状态决策自动机练习题Vol.2 C. 奇袭的更多相关文章

  1. 非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串

    非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串 题目描述 \(JYY\)有两个长度均为\(N\)的字符串\(A\)和\(B\). 一个"扭动字符串\(S(i,j,k)\)由\( ...

  2. 非确定性有穷状态决策自动机练习题Vol.3 D. Dp搬运工3

    非确定性有穷状态决策自动机练习题Vol.3 D. Dp搬运工3 题目描述 给定两个长度为 \(n\) 的排列,定义 \(magic(A,B)=∑_{i=1}^nmax(Ai,Bi)\) . 现在给定 ...

  3. [火星补锅] 非确定性有穷状态决策自动机练习题Vol.3 T3 && luogu P4211 [LNOI2014]LCA 题解

    前言: 这题感觉还是很有意思.离线思路很奇妙.可能和二次离线有那么一点点相似?当然我不会二次离线我就不云了. 解析: 题目十分清真. 求一段连续区间内的所有点和某个给出的点的Lca的深度和. 首先可以 ...

  4. [火星补锅] 非确定性有穷状态决策自动机练习题Vol.1 T3 第K大区间 题解

    前言: 老火星人了 解析: 很妙的二分题.如果没想到二分答案.. 很容易想到尝试用双指针扫一下,看看能不能统计答案. 首先,tail指针右移时很好处理,因为tail指针右移对区间最大值的影响之可能作用 ...

  5. goroutine 分析 协程的调度和执行顺序 并发写 run in the same address space 内存地址 闭包 存在两种并发 确定性 非确定性的 Go 的协程和通道理所当然的支持确定性的并发方式(

    package main import ( "fmt" "runtime" "sync" ) const N = 26 func main( ...

  6. AC自动机练习题1:地图匹配

    AC自动机板子,学习之前要是忘记了就看一下 1465: [AC自动机]地图匹配 poj1204 时间限制: 1 Sec  内存限制: 256 MB提交: 78  解决: 46[提交] [状态] [讨论 ...

  7. Vue兄弟组件(非父子组件)状态共享与传值

      前言:网上大部分文章写的有点乱,很少有讲得易懂的文章. 所以,我写了篇在我能看得懂的基础上又照顾到大家的文章 =.= 作者:X1aoYE 备注:此文原创,转载请注明~  内容里的<br> ...

  8. 非确定性计算引擎转化为C#版本并重构

    这是之前我写的原始的 VB.NET 版本: http://www.cnblogs.com/RChen/archive/2010/05/17/1737587.html 转化为 C# 版本后,还进行了一些 ...

  9. 小白算法之路-非确定性多项式(non-deterministic polynomial,缩写NP)

    前端小白的算法之路   时隔多日终于解决了埋在心头的一道难题,霎时云开雾散,今天把一路而来碰到的疑惑和心得都记录下来,也算是开启了自己探索算法的大门. 问题背景 曾经有一个年少轻狂的职场小白,在前端圈 ...

随机推荐

  1. 常用CSS颜色表

    1.16进制的CSS颜色代码 > http://www.jsjtt.com/webkaifa/HTML/65.html

  2. Java基础之NIO

    NIO简介: Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同 ...

  3. 01 . RPC简介原理及用Go实现一个简单的RCP

    RPC简介 本地过程调用 // 正常情况下程序的执行和调用情况.例如有如下go语言代码: package main import "fmt" func main() { var a ...

  4. jmeter控制器入门笔记一

    @@@@@@@@@@@@@@@ 千里之行 今天记录一下个人才使用控制器时的一些心得.逻辑控制器在jmeter中有很多种,个人根据官方解释理解的作用就是:通过控制器可以更好地控制请求的执行顺序.jmet ...

  5. Docker引言,由来,思想

    引言 我本地运行没问题啊? 环境不一致? 哪个哥们又写死循环了?,怎么这么卡? 在多用户操作系统下,会相互影响 淘宝在双11的时候,用户量暴增 运维成果过高的问题 学习一门技术,学习安装成本高 关于安 ...

  6. 你一个 F12 能秒我?

    参考文章 思路决定成败:F12给了我黑色的眼睛我却用它来挖洞 前言 了解大佬的思路才知道自己现在学的到底有多浅. 还没有到点,我就已经进入状态了,生而为人,我很抱歉. F12 的骚操作 Element ...

  7. luogu P4884 多少个1?

    LINK:多少个1? 题目要求:\(\sum_{i=0}^{n-1}10^i \equiv k \mod m\) 最小的n. 看起来很难求的样子 这个同余式 看起来只能暴力枚举. 不过既然是同余 我们 ...

  8. [转]Maven类包冲突终极三大解决技巧

    举例 A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过<scope>等若干种方式控制传递依赖).这 ...

  9. 【NOIP2017】跳房子 题解(单调队列优化线性DP)

    前言:把鸽了1个月的博客补上 ----------------- 题目链接 题目大意:机器人的灵敏性为$d$.每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),m ...

  10. 2 DC电参数测试 (1)

    基本常识: (1)Hot switch好的程序应避免使用热切换(这里热的含义类似于热插拔的“热“),热切换是指带点操作,有电流的情况下断开开关或闭合开关的瞬间,有电流通过,这会减少开关的寿命甚至直接损 ...