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;
}

注:不开longlong见祖宗警告
我的暴力模拟居然拿了90,足以见得我们OJ的数据有多水。

令人不解.jpg

posted @ 2019-12-03 00:27  国土战略局特工  阅读(199)  评论(0)    收藏  举报