标签:ima push str strong 初学 cpp scan 做了 std
一道从初学以来一直没有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
标签:ima push str strong 初学 cpp scan 做了 std
原文地址:https://www.cnblogs.com/cooper233/p/11974274.html