【差分数列】tyvj2042线段问题

线段问题

描述 Description

有N条线段,已知每条线段的起点和终点(50000以内),然后有M个询问,每次询问一个点(50000以内),求这个点在多少条线段上出现过?

输入格式 InputFormat

第一行N线段条数
接下来N行,每行两个数,线段的起点和终点
第N+2行一个数M询问个数
接下来M行,每行一个点

输出格式 OutputFormat

对于每个询问,求答案

样例输入 SampleInput

3
2 5
4 6
0 7
4
2
4
7
6

样例输出 SampleOutput

2
3
1
2

数据范围和注释 Hint

N,M<=50000

思路 thinkings

这道题很水就水在没有要求在线算法,全部读进去让我一起输答案,于是差分数列大行其道……

这题本来是拿来练习线段树的,我是不是太直接了……

代码 code

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
int cf[50005];          //差分数列,表示第i-1个和第i个的差,即cf[i]=数列[i]-数列[i-1];
int sum[50005];      //差分数列的前缀和就是原数列。。。
int main()
{
    int i,j,m,n,p,first,last,size;
    cin>>n;
    memset(cf,0,sizeof(cf));
    memset(sum,0,sizeof(sum));
    size=0;
    for (i=1;i<=n;i++)
    {
        cin>>first>>last;
        cf[first]+=1; cf[last+1]-=1;
        size=max(last,size);
    }
    for (i=0;i<=size;i++)
    sum[i]=sum[i-1]+cf[i];
    cin>>m;
    for (i=1;i<=m;i++)
    {
        cin>>p;
        cout<<sum[p]<<endl;
    }
    return 0;
}

反思

(1)看题目要先看清楚是在线还是离线,没有要求强制在线离线还是好用啊。。。

(2)两句老话:差分数列的前缀和是原数列

前缀和的差分数列是原数列

(3)这题特别坑的地方在于

    for (i=0;i<=size;i++)
    sum[i]=sum[i-1]+cf[i];

如果不幸写成:

    for (i=1;i<=size;i++)
    sum[i]=sum[i-1]+cf[i];

就全WA了。。。。。。

【差分数列】tyvj2042线段问题

时间: 2024-10-25 03:29:19

【差分数列】tyvj2042线段问题的相关文章

hdu4970 Killing Monsters (差分数列)

2014多校9 1011 http://acm.hdu.edu.cn/showproblem.php?pid=4970 Killing Monsters Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 331    Accepted Submission(s): 198 Problem Description Kingdom Rush

差分数列+树状数组

差分数列+树状数组:可以把树状数组的“单点修改,区间查询”-->改变为“区间修改和单点查询” 例题: codevs 1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数

bzoj1789 AHOI 维护数列(线段树)

首先想到线段树,然后刚开始写忽然想到树状数组求和岂不是更快,而且编程复杂度又小,于是把之前写的删掉,写树状数组,写完模版之后忽然发现这题竟然是区间修改! 于是又删掉重写,忽然发现不会处理又加又乘的,果断看题解-- 经过几乎两个小时的调试,终于1A. 需要注意的是,一定要让线段树的每一个区间保存的值时刻为正确的,这样才能在调用时直接返回.比如说这道题的change和query操作的最后一句话: sum:=f(g[k<<1]+g[k<<1+1]) 而不是 sum:=f(t[k<&

COGS 2638. 数列操作ψ 线段树

传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次and,or之后,如果数据分布均匀,那么几乎所有的数在若干次操作后都会变成同一个数 因为我们的and操作中的0位,以及or操作当中的1位,都是可以把整个区间的那一二进制位重置为相同的 我们考虑利用这一个性质 如果我们直接维护一个区间内的值是否是相同的,那么效果会差很多. 我们发现我们在进行and操作的时

无聊的数列【线段树】

题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 L R K D:给出一个长度等于R-L+1的等差数列,首项为K,公差为D,并将它对应加到a[L]~a[R]的每一个数上.即:令a[L]=a[L]+K,a[L+1]=a[L+1]+K+D, a[L+2]=a[L+2]+K+2D--a[R]=a[R]+K+(R-L)D. 2.2 P:询问序列的第P个数

BZOJ_4636_蒟蒻的数列_线段树+动态开点

Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知 道N次操作后数列中所有元素的和.他还要玩其他游戏,所以这个问题留给你解决. Input 第一行一个整数N,然后有N行,每行三个正整数a.b.k. N<=40000 , a.b.k<=10^9 Output 一个数,数列中所有元素的和 Sample Input 4 2 5 1 9 10 4 6

[bzoj4636]蒟蒻的数列_线段树

蒟蒻的数列 bzoj-4636 题目大意:给定一个序列,初始均为0.n次操作:每次讲一段区间中小于k的数都变成k.操作的最后询问全局和. 注释:$1\le n\le 4\cdot 10^4$. 想法:那个操作就是一个不好好说话的操作,说白了就是对区间的每一个数取max 然后我们对于那个序列建立分治线段树.每个操作我都把它挂在对应的log的点上. n个操作都执行完了之后我们从1号节点深搜,更新答案即可. 最后,附上丑陋的代码... ... #include <iostream> #include

[GX/GZOI2019]旧词(树上差分+树剖+线段树)

考虑k=1的做法:这是一道原题,我还写过题解,其实挺水的,但当时我菜还是看题解的:https://www.cnblogs.com/hfctf0210/p/10187947.html.其实就是树上差分后值为1. 考虑k>1的做法:其实可以再次树上差分,给每个点i赋值v[i]=dep[i]k-dep[i-1]k,然后还是和原来一样开一棵线段树,记录一个val[rt]表示当前节点内区间v值的和,以及sum[rt]表示区间值.修改时打标记,只需要将sum[rt]+=v*val[rt],lazy[rt]+

【COGS-2638】数列操作ψ 线段树

题目链接: http://cogs.pro/cogs/problem/problem.php?pid=2638 Solution 用jry推荐的写法即可做到单次$O(logN/log^{2}N)$. 具体的就是维护一个区间的$same$,其二进制下01的意义表示区间中所有数的二进制位第$k$位是否相同. 处理标记,当整个区间的 需要修改 的二进制位相同时即可直接打上标记. 然后就是正常搞了啊..其实当满足上述的情况后修改就可以变成区间加减标记来处理了,只需要一个标记即可,常数会更优一点. Cod