背景 Background
AndyBear 生日模拟赛 第一题
描述 Description
BIBO是个贪吃的小熊,她有很多喜欢的食物,但是为了控制体重,她每天不能吃的太多,因此小熊BIBO给每一种食物都赋了一个喜欢程度K,BIBO每天 从她所有喜欢的食物中挑出一件喜欢程度最大的来吃,可能是蜂蜜,也可能是面包,同时小熊BIBO还会更改某一种食物的喜欢程度,或者说自己不喜欢某件食物 了。你,作为小熊BIBO的首席大管家,要告诉她今天该吃的是什么。
输入格式 InputFormat
输入文件的第一行,给出两个数字N和M,分别表示小熊bibo拥有的食物种类以及操作数量。操作有三种:
Yummy 对于每一个Yummy操作,输出一个数字,表示所有食物中喜欢程度的最大值。
Like 对于每一个Like操作,后面会跟着一个数对x y,表示小熊bibo把第x种食物的喜欢程度改为了y。
Unlike 对于每一个Unlike操作,后面会跟着一个数x,表示小熊bibo不再喜欢第x种食物了,你可以认为这种食物的喜欢程度变成了负无穷。但是请注意,bibo是个善变的小熊,她有可能在之后的某次操作中又喜欢上了这种食物。
输入数据保证,不会出现所有食物都不喜欢的情况。
输出格式 OutputFormat
若干行数字,每一行对应一个Yummy操作的输出。
样例输入 SampleInput [复制数据]
10 6
Yummy
Like 5 100
Yummy
Like 6 99
Unlike 5
Yummy
样例输出 SampleOutput [复制数据]
0
100
99
数据范围和注释 Hint
在一开始,所有的食物的喜欢程度都为0。
在数据中,0<=喜欢程度K<=1000000.
对于80%的数据 0<n,m<=1000
对于100%的数据 0<n,m<=100000
思路:两年前做的比赛题了,当时只会暴力,不会线段树
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdlib>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int maxn=111210;
const int INF=100000000;
int a[maxn<<2],n,m,x,y;
char s[20];
void close()
{
exit(0);
}
void pushup(int rt)
{
a[rt]=max(a[rt<<1],a[rt<<1|1]);
}
void upd(int l,int r,int rt,int x,int y)
{
if (l==x && r==x)
{
a[rt]=y;
return;
}
int mid=(l+r)>>1;
if (l<=x && x<=mid)
upd(lson,x,y);
else
upd(rson,x,y);
pushup(rt);
}
void init()
{
scanf("%d %d",&n,&m);
memset(a,0,sizeof(a));
for (int i=1;i<=m;i++)
{
scanf("%s",s);
if (s[0]=='Y')
printf("%d\n",a[1]);
if (s[0]=='L')
{
scanf("%d %d",&x,&y);
upd(1,n,1,x,y);
}
if (s[0]=='U')
{
scanf("%d",&x);
upd(1,n,1,x,-INF);
}
}
}
int main ()
{
init();
close();
return 0;
}