正题
题目链接:http://noi.ac/contest/266/problem/794
题目大意
无限多个1∗21*21∗2的砖块交替着
一个砖块会掉落仅当下方两个砖块都掉落,现在抽出nnn个砖块,求掉落多少个砖块。
解题思路
开一个优先队列,若两个连在一起的就把上面那个加进去就好了,然后我们发现这样会TLETLETLE。
我们可以将连着的存在一块里就好了。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=3e5+10;
struct node{ll x,l,r;
}v[N];
bool operator<(const node &x,const node &y)
{return x.x==y.x?x.l>y.l:x.x>y.x;}
ll n,ans,cnt;
priority_queue<node> q;
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){ll x,y;scanf("%lld%lld",&x,&y);q.push((node){x,y,y+1});}while(!q.empty()){ll x=q.top().x;cnt=0;while(!q.empty()&&q.top().x==x)v[++cnt]=q.top(),q.pop();ll l=v[1].l,r=v[1].r;for(ll i=1;i<=cnt;i++){if(r+1>=v[i].l)r=max(v[i].r,r);else{if(l+1!=r)q.push((node){x+1,l+1,r-1});ans+=(r-l+1)/2;l=v[i].l;r=v[i].r;}}if(l+1!=r)q.push((node){x+1,l+1,r-1});ans+=(r-l+1)/2;}printf("%lld",ans);
}