题目描述

输入

第一行包括两个正整数,N ,M ,分别表示线段树的宽以及询问次数。

以下N-1 行以先序遍历(dfs深搜顺序)描述一个小R线段树,每行一个正整数表示当前非叶子节点的 mid,保证每个节点L<=mid<=r 。

(因为叶子节点不需要mid ,所以在读入时走到叶子节点时回溯即可,所以共N-1 个mid ,而且保证1~N-1 各出现一次)

而后M 行每行包括两个正整数,L,r(1<=L<=r<=N) 描述一个要求区间定位的区间。

输出

M行每行包括一个正整数,表示给出的询问区间在给定的线段树上的区间定位个数。

样例输入

7 3

4

3

1

2

5

6

3 6

2 7

1 6

样例输出

4

3

3

数据范围

样例解释



给定线段树样子如上图。

区间[3,6] 定位出的区间是[3,3][4,4][5,5][6,6] ,共四个。

区间[2,7] 定位出的区间是[2,3],[4,4],[5,7] ,共三个。

区间[1,6] 定位出的区间是[1,4],[5,5],[6,6] ,共两个。

解法

性质:[l,r]的答案=(r-l+1)*2-k (k为[l,r]包含的线段数)

证明:对于线段树里面的线段[l1,r1],这个线段所包含的线段共(r1-l1+1)*2-1。

[l,r]的答案=[l,r]中包含的极大线段,其中每个极大线段都会贡献(r1-l1+1)*2-1个线段被区间包含。

假设[l,r]中有n条极大线段,那么[l,r]所包含的线段就有(r-l+1)*2-n条。

所以n=(r-l+1)*2-[l,r]包含的线段数。

实现:排序后使用树状数组统计区间包含的线段数。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) int(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="aP3.in";
const char* fout="aP3y.out";
const int inf=0x7fffffff;
const int maxn=100007,maxm=maxn*2;
int n,m,i,j,k,l,r,tot,mid,deep;
struct qj{
int l,r,id;
}a[maxm],stack[maxm],b[maxm];
int cd[maxm],ha[maxm];
int c[maxn],ans[maxm];
void add(int a1,int b,int c){
if (c==1) {
a[++tot].l=a1;
a[tot].r=b;
}
if (a1==b) return ;
stack[++deep].l=a1;
stack[deep].r=b;
cd[deep]=c;
}
bool cmp(qj a,qj b){
return a.l<b.l;
}
void change(int v,int v1){
for (;v<=n;v+=v&(-v)) c[v]+=v1;
}
int getsum(int v){
int k=0;
for (;v;v-=v&(-v)) k+=c[v];
return k;
}
int main(){
scanf("%d%d",&n,&m);
add(1,n,1);
while (deep){
if (cd[deep]==1){
scanf("%d",&ha[deep]);
deep--;
add(stack[deep+1].l,stack[deep+1].r,0);
add(stack[deep].l,ha[deep],1);
}else{
deep--;
add(ha[deep+1]+1,stack[deep+1].r,1);
}
}
sort(a+1,a+tot+1,cmp);
for (i=1;i<=m;i++){
scanf("%d%d",&b[i].l,&b[i].r);
b[i].id=i;
}
sort(b+1,b+m+1,cmp);
j=tot;
k=m;
for (i=n;i>=1;i--){
while (j && i==a[j].l) change(a[j--].r,1);
while (k && i==b[k].l) {
ans[b[k].id]=2*(b[k].r-b[k].l+1)-getsum(b[k].r);
k--;
}
}
for (i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

启发

计算答案时:

1.答案由什么构成。

2.本题中什么东西易求。

3.把1中的东西转化为2中的求得答案。

例如本题:

1.显然[l,r]的答案即为包含的极大线段数。

2.[l,r]的所包含的线段数容易求得。

3.极大线段数=(r-l+1)*2-[l,r]的所包含的线段数。

完成转化,本题解决。

【JZOJ4747】【NOIP2016提高A组模拟9.3】被粉碎的线段树的更多相关文章

  1. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  2. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  3. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  4. 【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲

    题目描述 相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映射到该数塔上行 ...

  5. 【JZOJ4745】【NOIP2016提高A组模拟9.3】看电影

    题目描述 听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影.可是省常中OI队的同学们共有 N(N >= K)人.于是机智的你想到了一个 ...

  6. 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导

    题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...

  7. 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子

    题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...

  8. [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)

    题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...

  9. [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)

    题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...

随机推荐

  1. python基础---递归函数真题解析

    方法一.有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中. 即: {'k ...

  2. 【DM642】H.264源代码在DM642上的移植

    TI公司提供了用于C语言开发的CCS(Code Composer Studio),该平台包括了优化的ANSI编译器,使之可以使用C语言开发DSP程序.这种方法不仅使DSP开发的速度大大加快,而且DSP ...

  3. Bootstrap.之模态框 显示在遮罩层后面

    Bootstrap.之模态框 显示在遮罩层后面 问题描述: 在使用bootstrap模态框,弹出的窗口在遮罩层后面,见图: 解决方案: 保证模态框的代码,所在的上一级(父元素)是body标签,即可.例 ...

  4. KOA 学习(六)superAgent

    原文地址 http://www.2cto.com/kf/201611/569080.html 基本请求 初始化一个请求可以通过调用request模块中适当的方法,然后使用.end()来发送请求,例如一 ...

  5. spring-搭建-概念-配置详解-属性注入

    1 spring介绍  三层架构中spring位置 spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还能帮其 ...

  6. 忘记sql server 2008 sa的密码的解决方案

      解决的办法的前提是:可以混合模式登陆1.用windows身份验证登陆.2.新建查询3.输入 EXEC sp_password NULL, 'newPassword', sa搞定了

  7. 开发者说 | 分布式事务中间件 Seata 的设计原理

    导读 微服务架构体系下,我们可以按照业务模块分层设计,单独部署,减轻了服务部署压力,也解耦了业务的耦合,避免了应用逐渐变成一个庞然怪物,从而可以轻松扩展,在某些服务出现故障时也不会影响其它服务的正常运 ...

  8. 基于MaxCompute的媒体大数据开放平台建设

    摘要:随着自媒体的发展,传统媒体面临着巨大的压力和挑战,新华智云运用大数据和人工智能技术,致力于为媒体行业赋能.通过媒体大数据开放平台,将媒体行业全网数据汇总起来,借助平台数据处理能力和算法能力,将有 ...

  9. 【python之路29】python生成器generator与迭代器

    一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...

  10. bzoj 1059 [ZJOI2007]矩阵游戏——匈牙利算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1059 发现不管怎么换,同一列的元素还是在同一列,同一行的元素还是在同一行. 所以必要条件是每 ...