ZzuliOJ 1877 蛤玮打扫教室(线段树)

题目链接:http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877

#include "algorithm"
#include "iostream"
#include "cstring"
#include "cstdio"
#include "string"
#include "stack"
#include "cmath"
#include "queue"
#include "set"
#include "map"

#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1

typedef long long ll;
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=1e5+5;

int t,n,m;

struct node{
    int l,r;
}qujian[maxn];
bool ok[maxn];

int tree[maxn<<2];
int col[maxn<<2];

void pushUp(int rt)
{
    tree[rt] = min( tree[rt<<1] ,tree[rt<<1|1] );
}
void push_down(int rt)
{
    if(col[rt])
    {
        tree[rt<<1]+=col[rt];
        tree[rt<<1|1]+=col[rt];
        col[rt<<1]+=col[rt];
        col[rt<<1|1]+=col[rt];
        col[rt]=0;
    }
}
void build(int l,int r,int rt)
{
    col[rt]=0;
    if(l==r)
    {
        tree[rt]=0;
        return;
    }
    int m = (l+r)>>1;
    build(lson);
    build(rson);
    pushUp(rt);
}

void update(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        col[rt]++;
        tree[rt]++;
        return ;
    }
    push_down(rt);

    int m = (l+r)>>1;
    if(L<=m)update(L,R,lson);
    if(R>m)update(L,R,rson);
    pushUp(rt);
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l && r<=R)
    {
        return tree[rt];
    }
    push_down(rt);
    int m = (l+r)>>1;
    int ret = inf;
    if(L<=m)ret = min(ret, query(L,R,lson));
    if(R>m)ret=min(ret, query(L,R,rson) );
    return ret;
}
int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);

        build(1,n,1);
        memset(ok,0,sizeof ok);

        int l,r;
        for(int i=0;i<m;++i)
        {
            scanf("%d%d",&l,&r);
            qujian[i].l=l;
            qujian[i].r=r;
            update(l,r,1,n,1);
        }
        int ans=0;
        for(int i=0;i<m;++i)
        {
            if( query(qujian[i].l,qujian[i].r,1,n,1 )>1 )
            {
                ok[i]=1;
                ans++;
            }
        }
        printf("%d\n",ans);
        bool first=1;
        for(int i=0;i<m;++i)
        {
            if( ok[i] )
            {
                if(first)
                {
                    printf("%d",i+1);
                    first=false;
                }
                else
                {
                    printf(" %d",i+1);
                }
            }
        }
        if(ans)printf("\n");

    }

    return 0;
}
时间: 2024-12-20 18:15:48

ZzuliOJ 1877 蛤玮打扫教室(线段树)的相关文章

zzuli 1877 蛤玮打扫教室

1877: 蛤玮打扫教室 Description 现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每个签上写着两个数L,R(L<=R),抽到的人要把[L,R]的教室全部打扫一遍.由于蛤玮是队长而且他很懒,他通过某种交易提前知道了所有m个签上面写的是什么,而且通过某种魔法可以控制自己抽到哪个签.一个教室被打扫一次就干净了,所以蛤玮想知道自己抽哪些签可以不用打扫教室而且不会被教练发现,即他抽到的区间全都会被别人打扫一遍. 蛤玮被教练叫去打扫机房,集训队有很多机房,也有很多队员,现在他

线段树区间覆盖 蛤玮打扫教室(zzuli 1877)

http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877 Description 现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每个签上写着两个数L,R(L<=R),抽到的人要把[L,R]的教室全部打扫一遍.由于蛤玮是队长而且他很懒,他通过某种交易提前知道了所有m个签上面写的是什么,而且通过某种魔法可以控制自己抽到哪个签.一个教室被打扫一次就干净了,所以蛤玮想知道自己抽哪些签可以不用打扫教室而且不会被教练发现,即他抽到的区间全都会

CH Round #52 还教室[线段树 方差]

还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教室的同学们纷纷归还自己当初租借的教室.请你来解决类似于借教室的另一个问题.[问题描述]在接受借教室请求的 n 天中,第 i 天剩余的教室为 a i 个.作为大学借教室服务的负责人,你需要完成如下三种操作共 m 次:① 第 l 天到第 r 天,每天被归还 d 个教室.② 询问第 l 天到第 r 天教室

NOIP2012借教室[线段树|离线 差分 二分答案]

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没

借教室 线段树and二分

描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对

【题解】CODEVS 1217 借教室 zkw线段树(区间最值)

捣鼓了好长时间才终于把zkw线段树的区间最值修改给A掉了 = =zkw神犇的课件里竟然有错! (╯▽╰)下面的伪代码里被注释的是我修改的>< Func Add_x(s,t,x) for (s=s+M-1,t=t+M+1;s^t^1;s>>=1,t>>=1) { if (~s&1) T[s^1]+=x; if ( t&1) T[t^1]+=x; A=min(T[s],T[s^1]),T[s]-=A,T[s^1]-=A, T[s>>1]+=A;

【线段树题解】借教室

2.借教室 (classroom.cpp/c/pas) [问题描述] 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.  面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对于每份

noip 2012 借教室 (线段树 二分)

/* 维护区间最小值 数据不超int 相反如果long long的话会有一组数据超时 无视掉 ll int */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 #define ll int #define inf 0x7fffffff using namespace std; ll n,m,num,a[maxn],falg; struct node { ll lc,r