NKOJ P1377 火烧赤壁

NKOJ P1377 火烧赤壁

一道从初学以来一直没有A掉的题
果然还是我太菜了
KONO题面哒!

曹操平定北方以后,公元208年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听军声势浩大,吓破了胆,先派人求降了。
孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。
隆冬的十一月,天气突然回暖,刮起了东南风。
没想到东吴船队离开北岸大约二里距离,前面十条大船突然同时起火。火借风势,风助火威。十条火船,好比十条火龙一样,闯进曹军水寨。那里的船舰,都挤在一起,又躲不开,很快地都烧起来。一眨眼工夫,已经烧成一片火海。
曹操气急败坏的把你找来,要你钻入火海把连环线上着火的船只的长度统计出来!
简述:有\(N\)次操作,每一次操作把区间\([X_i,Y_i)\)设为1,最后统计有多少段长度为1的区间标记为1。

数据范围:
\(N\leq20000,-10^9\leq X_i,Y_i\leq10^9\)


妄图用模拟A掉此题的OI萌新一枚


一看到统计区间长度就想到分块线段树。但是看到这个数据范围我们就很怂。于是想到今天刚学的动态开点的线段树。
于是这道题就变成一道模板题了。
感觉拿板题来练数据结构打码还是很不错的。
做了三年终于做出来了我真是太感动了蛤蛤蛤


KONO代码哒!

#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
const int maxn=601000;
struct node{
    int x,y;
}act[maxn];
int n;
int _min=0x3f3f3f3f;
int _max=-0x3f3f3f3f;
int cnt=0;
struct tree{
    int sum[4*maxn];
    int ls[4*maxn],rs[4*maxn];
    inline void pushup(int p,int l,int r){
        if(sum[p]!=r-l+1)
        sum[p]=sum[ls[p]]+sum[rs[p]];
    }
    void ins(int l,int r,int &p,int l1,int r1){
        if(r<l)return;
        if(!sum[p])p=++cnt;
        if(sum[p]==r-l+1)return;
        if(l<=l1&&r>=r1){
            sum[p]=r1-l1+1;
            return;
        }
        int mid=((l1+r1)>>1);
        if(mid>=l)ins(l,r,ls[p],l1,mid);
        if(mid<r)ins(l,r,rs[p],mid+1,r1);
        pushup(p,l1,r1);
    }
}tr;
int p;
main()
{
    int i,j;
    scanf("%lld",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%lld%lld",&act[i].x,&act[i].y);
        _min=min(_min,act[i].x);
        _max=max(_max,act[i].y);
    }
    for(i=1;i<=n;i++)
    {
        tr.ins(act[i].x,act[i].y-1,p=1,_min,_max);
    }
    printf("%lld\n",tr.sum[1]);
    return 0;
}

我的暴力模拟居然拿了90,足以见得我们OJ的数据有多水。

令人不解.jpg

猜你喜欢

转载自www.cnblogs.com/cooper233/p/11974274.html