BZOJ 1135 POI2009 Lyz 线段树+Hall定理

题目大意:有1~n型号的滑冰鞋,每种有k双,一个x号脚的人只能适应[x,x+d]号滑冰鞋,每次增加一些x号脚的人或减少一些x号脚的人,问能否匹配

http://m.blog.csdn.net/blog/u012732945/40707885

OTZ

这题我居然还能贡献一个WA真是醉了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 200200
using namespace std;
struct abcd{
	long long l_max,r_max,_max,sum;
	abcd() {}
	abcd(long long _)
	{
		l_max=max(_,0ll);
		r_max=max(_,0ll);
		_max=max(_,0ll);
		sum=_;
	}
	friend abcd operator + (const abcd &x,const abcd &y)
	{
		abcd re;
		re.l_max=max(x.l_max,x.sum+y.l_max);
		re.r_max=max(y.r_max,y.sum+x.r_max);
		re._max=max(max(x._max,y._max),x.r_max+y.l_max);
		re.sum=x.sum+y.sum;
		return re;
	}
};
long long n,m,k,d;
struct Segtree{
	Segtree *ls,*rs;
	abcd status;
	void* operator new (size_t)
	{
		static Segtree mempool[M<<1],*C=mempool;
		return C++;
	}
	void Build_Tree(int x,int y)
	{
		int mid=x+y>>1;
		if(x==y)
		{
			new (&status)abcd(-k);
			return ;
		}
		(ls=new Segtree)->Build_Tree(x,mid);
		(rs=new Segtree)->Build_Tree(mid+1,y);
		status=ls->status+rs->status;
	}
	void Modify(int x,int y,int pos,int val)
	{
		int mid=x+y>>1;
		if(x==y)
		{
			new (&status)abcd(status.sum+val);
			return ;
		}
		if(pos<=mid)
			ls->Modify(x,mid,pos,val);
		else
			rs->Modify(mid+1,y,pos,val);
		status=ls->status+rs->status;
	}
}*tree=new Segtree;
int main()
{
	int i,x,y;
	cin>>n>>m>>k>>d;
	tree->Build_Tree(1,n);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		tree->Modify(1,n,x,y);
		puts(tree->status._max<=k*d?"TAK":"NIE");
	}
	return 0;
}


你可能感兴趣的:(线段树,bzoj,BZOJ1135)