(来源:XJ高质量原创题)

原题地址

弱化版:CF526F Pudding Monsters

弱化版

题意:\(n\times n\) 的棋盘上有 \(n\) 颗棋子,每行每列都有且仅有一颗棋子,求出有多少个 \(k\times k\) 的子棋盘也满足每行每列只有一颗棋子。

将棋盘的 \(x\) 轴看作上一题中每个点的下标,\(y\) 轴看作这个点的权值。

其实就是树退化为了链,而 \(m=1\) 的情况。

题意

给定一棵树,每一个点有一个权值 \(a_i\) ,\(\{a\}\) 构成一个排列。

询问有多少个点集 \(S={u_1,u_2,\dots,u_k}(1\le j\le n)\) 满足这些点构成联通块不超过 \(m\) 个,且 \(\max_{1\le i\le k}\{a_{u_{i}}\}-\min_{1\le i\le k}\{a_{u_{i}}\}+1=k\) 。

\(n\le 10^5,m\le 7\)

题解

考虑枚举值域的右端点 \(r\),考虑加入这个右端点时,对与 \([1,r-1]\) 中的最短点的联通块个数的变化。

先假设假设这个点与其他无边相连,那么联通块数加 \(1\) 。

对于每一条与点集中的点相连的边 \((num(r),ver)\) ,都会使左端点在 \([1,val(ver)]\) 中的联通块数量 \(-1\) (\(num(x)\) 表示权值为 \(x\) 的点的编号)。

之后我们就将题意简化为:

  • 区间加上一个数

  • 求出整个数列中 \(\le m\) 的数有多少个

  • 保证 \(a[1]=1\)

考虑到 \(m\) 比较小,猜测答案复杂度为 \(O(nm\log n)\) 。

我们将加减操作同普通的线段树操作,主要改变 \(\text{pushup}\) 操作。

在线段树的每一个节点 \([l,r]\) 上维护:

  • \(minn\) : 表示在 \([l,r]\) 区间上数的最小值。

  • \(cnt[7]\) : 表示这段区间内值域在 \([minn,minn+6]\) 之间的数分别有多少。

之后根据两个子区间的最小值就可以愉快地转移啦!!

// Author:A weak man named EricQian
// expect : 100 pts
#include<bits/stdc++.h>
using namespace std;
#define infll 0x7f7f7f7f7f7f7f7f
#define inf 0x3f3f3f3f
#define Maxn 500005
#define Maxm 7
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
int n,m,tot;
int val[Maxn],num[Maxn];
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1];
struct TREE { ll minn,laz,cnt[Maxm]; }tree[Maxn<<2];
ll ans;
inline void add(int x,int y){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot; }
inline void pushup(int p)
{int x=p<<1,y=p<<1|1,tmp;if(tree[x].minn>tree[y].minn) swap(x,y);tree[p].minn=tree[x].minn;for(int i=0;i<m;i++) tree[p].cnt[i]=tree[x].cnt[i];tmp=tree[y].minn-tree[x].minn;for(int i=tmp;i<m;i++) tree[p].cnt[i]+=tree[y].cnt[i-tmp];
}
inline void pushdown(int p)
{tree[p<<1].laz+=tree[p].laz,tree[p<<1].minn+=tree[p].laz;tree[p<<1|1].laz+=tree[p].laz,tree[p<<1|1].minn+=tree[p].laz;tree[p].laz=0;
}
void build(int p,int nl,int nr)
{if(nl==nr) { tree[p].minn=tree[p].cnt[0]=1; return; }int mid=(nl+nr)>>1;build(p<<1,nl,mid),build(p<<1|1,mid+1,nr);pushup(p);
}
void add(int p,int nl,int nr,int l,int r,int k)
{if(nl>=l && nr<=r) { tree[p].minn+=k,tree[p].laz+=k; return; }pushdown(p);int mid=(nl+nr)>>1;if(mid>=l) add(p<<1,nl,mid,l,r,k);if(mid<r) add(p<<1|1,mid+1,nr,l,r,k);pushup(p);
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) val[i]=rd(),num[val[i]]=i;for(int i=1,x,y;i<n;i++) x=rd(),y=rd(),add(x,y),add(y,x);build(1,1,n);for(int r=1;r<=n;r++){if(r!=1) add(1,1,n,1,r-1,1);for(int i=hea[num[r]];i;i=nex[i])if(val[ver[i]]<val[num[r]])add(1,1,n,1,val[ver[i]],-1);for(int i=0;i<m;i++) ans+=tree[1].cnt[i];ans-=(n-r);}printf("%lld\n",ans);return 0;
}

【做题记录】max-min+1=len 区间计数相关推荐

  1. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  2. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

  3. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  4. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  5. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  6. 退役前的做题记录4.0

    退役前的做题记录4.0 最近主要在LOJ上写题 536. 「LibreOJ Round #6」花札 比较显然的二分图博弈模型,先手必胜当且仅当起始点一定在最大匹配中.连边可以对每种颜色以及数字建一个点 ...

  7. 2020.9月做题记录

    八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...

  8. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

  9. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

最新文章

  1. [PyTorch]一个非常好的抢救outofmemory的方法
  2. ABAP--如何在选择屏幕上输出ALV GRID报表
  3. SCRUM 敏捷开发 基础及失败成功案例分析
  4. access 江苏计算机二级_你与计算机二级证书的距离就差这一篇推送了!
  5. git 裁切_Vue + ccropper.js裁切图片(vue-cropper)
  6. jsoup html转义处理,jsoup解析网页出现转义符问题
  7. 渗透测试入门4之内网跨边界应用
  8. 解决sqlalchemy连接mysql报错ModuleNotFoundError: No module named ‘pymysql‘
  9. 为什么要用C语言实现面向对象
  10. 接口设计的一些小总结
  11. [Java][Android] 多线程同步-主线程等待所有子线程完成案例
  12. 【Unity游戏开发基础】如何做可以调整音量的UI滚动条组件
  13. Ubuntu安装JDK6和JDK5
  14. EmEditor16免安装破解版
  15. VM虚拟机BT5下对usb无线网卡的配置
  16. SpringBoot整合MyBatisPlus(十四)
  17. 2018 qs计算机排名,2018年QS世界大学学科排名公布 强势围观
  18. Mina中的多项式承诺方案
  19. 电驴虚拟服务器常用端口选择,为何我的电驴端口映射成功还是Lowid?
  20. 邻接表(Adjacency List)

热门文章

  1. java 异步读写_Java异步与AIO
  2. sm缩写代表什么意思_pe、PE在电气有代表什么意思,你发现没有,电气技术很有意思...
  3. netty springmvc_springmvc源码架构解析之HandlerMapping
  4. Numpy中数组创建函数的辨析
  5. [EDA] 给出一个状态机,请把它的组合进程分为2个,分别命名为COM1和COM2,其中:COM1实现对外的控制信号输出,COM2实现状态译码。
  6. Template Method(模板方法)--类行为型模式
  7. datagridview实时更新数据_旭诺云盒|智能办公新趋势进出口数据自动提取,通关状态实时更新...
  8. 不要666升级版(数位DP,三次方和)
  9. P1848 [USACO12OPEN]Bookshelf G(线段树优化 DP)
  10. 生成函数Euler变换学习笔记(无标号有根树计数)