您的位置:首页 > 其它

【洛谷 2161】 [Shoi2009]Booking 会场预约

2016-03-10 19:01 232 查看
洛谷真良心 这是BZOJ的权限题.....

明明树状数组很好做 我偏偏用线段树

明明在线很好做 我偏偏离线

.

.

.

.

简直作死 又调试了一下午 !!

线段树 最小值 区间标记时注意下!!! 宁可多取几次min 做几个无用功没事 说不定少了那个就wa上半天!!!

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAXN 1000000
using namespace std;
int init[200000+1][3]; //0 A B   1s 2t
bool b[200000+1];
int cnt[200000+1];
int n;
int a[100000*4],m[100000*4];
void Pushdown(int now)
{
m[now*2]=min(m[now*2],m[now]); a[now*2]=min(a[now*2],m[now*2]);
m[now*2+1]=min(m[now*2+1],m[now]); a[now*2+1]=min(a[now*2+1],m[now*2+1]);
//  m[now]=100000000;
}
void Change(int now,int L,int R,int s,int t,int k)
{
//  cout<<now<<' '<<a[now]<<' '<<L<<' '<<R<<' '<<s<<' '<<t<<' '<<k<<endl;

if(s<=L&&R<=t)
{
m[now]=min(m[now],k);
a[now]=m[now];
return ;
}
if(m[now]!=100000000)
Pushdown(now);
int mid=(L+R)/2;
if(s<=mid) Change(now*2,L,mid,s,t,k);
if(mid+1<=t) Change(now*2+1,mid+1,R,s,t,k);
a[now]=min(a[now*2],a[now*2+1]);
}
int Query(int now,int L,int R,int s,int t)
{
//cout<<now<<' '<<a[now]<<' '<<L<<' '<<R<<' '<<s<<' '<<t<<' '<<endl;

if(s<=L&&R<=t) return a[now];
if(m[now]!=100000000)
Pushdown(now);
int mid=(L+R)/2,ans=100000000;
if(s<=mid) ans=min(ans,Query(now*2,L,mid,s,t));
if(mid+1<=t) ans=min(ans,Query(now*2+1,mid+1,R,s,t));
return ans;
}
int main()
{
//  fr0eopen("a.in","r",stdin);
//  fr0eopen("test.out","w",stdout);
for(int i=1;i<100000*4;i++) m[i]=100000000,a[i]=100000000;
cin>>n; char c;
for(int i=1;i<=n;i++)
{
cin>>c;
if(c=='A') init[i][0]=0,scanf("%d %d",&init[i][1],&init[i][2]);
else init[i][0]=1;
}
for(int i=n;i>=1;i--)
if(init[i][0]==0)
{
int tmp=Query(1,1,100000,init[i][1],init[i][2]);// cout<<i<<' '<<tmp<<endl;
if(tmp==100000000)
b[i]=true;
else
cnt[tmp]++;
Change(1,1,100000,init[i][1],init[i][2],i);
}
int sum=0;
for(int i=1;i<=n;i++)
{

if(init[i][0]==0) sum=sum+1-cnt[i],printf("%d\n",cnt[i]);
if(init[i][0]==1) printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: