[CF500E]New Year Domino

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF500E]New Year Domino相关的知识,希望对你有一定的参考价值。

题意:给一些多米诺骨牌,可以花费$1$的代价延长某个骨牌的生命长度,询问推倒一段区间的骨牌要花多少代价

 

技术分享

这道题我是不是鸽了一个月233333

首先离散化,然后建线段树存哪些区间没有被覆盖

前面的骨牌可能太长以至于影响后面骨牌的统计答案,所以我们要离线询问,从后往前做

添加一个骨牌$\\Rightarrow$区间置$0$

询问$\\Rightarrow$区间求和

单调栈什么的人家不懂啦

#include<stdio.h>
#include<vector>
#include<map>
#include<string.h>
using namespace std;
struct ask{
	int r,id;
	ask(int a=0,int b=0){
		r=a;
		id=b;
	}
};
vector<ask>lr[200010];
vector<ask>::iterator vit;
map<int,int>pos;
map<int,int>::iterator it;
int p[200010],l[200010],ans[200010],laz[1600010],sum[1600010];
void pushup(int x){
	sum[x]=sum[x<<1]+sum[x<<1|1];
}
void build(int l,int r,int x){
	if(l==r){
		sum[x]=laz[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	pushup(x);
}
void pushdown(int x){
	if(laz[x]){
		laz[x<<1]=laz[x<<1|1]=1;
		sum[x<<1]=sum[x<<1|1]=0;
		laz[x]=0;
	}
}
void modify(int L,int R,int l,int r,int x){
	if(L<=l&&r<=R){
		laz[x]=1;
		sum[x]=0;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
	if(L<=mid)modify(L,R,l,mid,x<<1);
	if(mid<R)modify(L,R,mid+1,r,x<<1|1);
	pushup(x);
}
int query(int L,int R,int l,int r,int x){
	if(L<=l&&r<=R)return sum[x];
	pushdown(x);
	int mid=(l+r)>>1,ans=0;
	if(L<=mid)ans+=query(L,R,l,mid,x<<1);
	if(mid<R)ans+=query(L,R,mid+1,r,x<<1|1);
	return ans;
}
int main(){
	int n,q,i,a,b,M;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d%d",p+i,l+i);
		pos[p[i]]=1;
		pos[p[i]+l[i]]=1;
	}
	for(it=pos.begin(),M=1;it!=pos.end();it++,M++){
		(it->second)=M;
		laz[M-1]=(it->first)-laz[M-1];
		laz[M]=(it->first);
	}
	build(1,M-1,1);
	memset(laz,0,sizeof(laz));
	scanf("%d",&q);
	for(i=1;i<=q;i++){
		scanf("%d%d",&a,&b);
		lr[a].push_back(ask(b,i));
	}
	for(i=n;i>0;i--){
		modify(pos[p[i]],pos[p[i]+l[i]]-1,1,M-1,1);
		for(vit=lr[i].begin();vit!=lr[i].end();vit++){
			if((*vit).r==i)
				ans[(*vit).id]=0;
			else
				ans[(*vit).id]=query(pos[p[i]],pos[p[(*vit).r]]-1,1,M-1,1);
		}
	}
	for(i=1;i<=q;i++)printf("%d\\n",ans[i]);
}

以上是关于[CF500E]New Year Domino的主要内容,如果未能解决你的问题,请参考以下文章

Good Bye 2014 E - New Year Domino 单调栈+倍增

CodeForces 611C New Year and Domino (动态规划,dp)

CF - 1106 E Lunar New Year and Red Envelopes DP

CF 750C New Year and Rating(思维题)

cf723a The New Year: Meeting Friends

CF140C New Year Snowmen