luogu P1047 校门外的树(我只会做这个难度的题啦p_q

传送门

代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000000
int n,m,x,y,z,ans;

struct TreeType{
    int l,r,f,w;
}tree[maxn<<2];

void tree_up(int k) { tree[k].w=tree[k<<1|1].w+tree[k<<1].w; }

void tree_down(int k)
{
    tree[k<<1].f+=tree[k].f;
    tree[k<<1|1].f+=tree[k].f;
    tree[k<<1].w+=(tree[k<<1].r-tree[k<<1].l+1)*tree[k<<1].f;
    tree[k<<1|1].w+=(tree[k<<1|1].r-tree[k<<1|1].l+1)*tree[k<<1|1].f;
    tree[k].f=0;
}

void tree_build(int l,int r,int k)
{
    tree[k].l=l; tree[k].r=r;
    if(l==r)
    {
        tree[k].w=1;
        return ;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    tree_build(l,mid,k<<1);
    tree_build(mid+1,r,k<<1|1);
    tree_up(k);
}

void tree_change(int l,int r,int k,int x)
{
    if(tree[k].l==l&&tree[k].r==r)
    {
        tree[k].w+=(tree[k].r-tree[k].l+1)*x;
        tree[k].f+=x;
        tree_down(k);
        return ;
     }
    if(tree[k].f) tree_down(k);
    int mid=(tree[k].l+tree[k].r)>>1;
    if(l>mid)  tree_change(l,r,k<<1|1,x);
    else if(r<=mid) tree_change(l,r,k<<1,x);
    else {
        tree_change(l,mid,k<<1,x);
        tree_change(mid+1,r,k<<1|1,x);
    }
}

int tree_find(int k,int to)
{

    if(tree[k].l==tree[k].r)    return tree[k].w;
    if(tree[k].f) tree_down(k);
    int mid=(tree[k].r+tree[k].l)/2;
    if(to>mid) return tree_find(k*2+1,to);
    else return tree_find(k*2,to);
}

int main()
{
    scanf("%d%d",&n,&m);
    tree_build(0,n,1);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        tree_change(x,y,1,-1);
    }
    for(int i=0;i<=n;i++)
        if(tree_find(1,i)>0) ans++;
    cout<<ans;
    return 0;
}

时间: 2025-01-15 01:59:50

luogu P1047 校门外的树(我只会做这个难度的题啦p_q的相关文章

luogu P1047 校门外的树

题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 输入输出格式 输入格式: 输入文

P1047 校门外的树

P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 输入输出

Luogu P1276 校门外的树(增强版)

Luogu P1276 校门外的树(增强版) 本来看着是道普及-,就不打算写博客了,结果因为出了3次错,调试了15min就还是决定写一下-- 本题坑点: 1.每个位置有三种情况:空穴,树苗,树(而不只有空穴和树). 2.每个位置初始是种了树的(注意是树). 3.第二个输出是被砍后又种上的树苗数. 总而言之,一道普及-的题都有那么多细节,所以以后真要好好读题了-- #include<bits/stdc++.h> using namespace std; int l,n,s,e,op,cnt1,c

洛谷P1047校门外的树题解

摘要: 此题是一个模拟题,但需要注意的一点就是它的树是从数轴的0开始,所以我们也要从0开始,这样才能实现代码. 代码: #include<iostream> using namespace std; int s[100000]; int main() { int l,m,x,y,d=0; cin>>l>>m; for(int i=0; i<=l; i++) s[i]=1; for(int i=0; i<m; i++) { cin>>x>&g

C语言 &#183; 校门外的树

算法提高 校门外的树 时间限制:1.0s   内存限制:256.0MB 问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算

Vijos1448校门外的树 题解

Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 输入格式: 第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出格式: 对于每个k=2输出一个答案 样例输入:

NOIP200502校门外的树

试题描述     某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树.由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 输入 第一行有两个整数L和

Tyvj - 1286 - 校门外的树2

描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 输入格式 I

Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 格式 输入格式 第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 样例1 样例输入1 5 4 1 1