您的位置:首页 > 其它

Codeforces Round #174 (Div. 1)A

2014-01-12 02:14 288 查看
题不怎么难,按线段树的解法 就是延迟标记,更新 因为找错找了N久 记一篇吧

向下更新时把+=写成了= 还做在了2W组的数据上 那个错找得真费劲。。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;
#define N 200012
int n;
#define LL long long
LL s[N<<2],lz[N<<2];
void down(int w,int m)
{
if(lz[w])
{
s[w<<1]+=lz[w]*(m-m/2);
s[w<<1|1]+=lz[w]*(m/2);
lz[w<<1] += lz[w];
lz[w<<1|1]+=lz[w];
lz[w] = 0;
}
}
void up(int w)
{
s[w] = s[w<<1]+s[w<<1|1];
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
s[w]+=(r-l+1)*d;
lz[w]+=d;
return ;
}
int m = (l+r)>>1;
down(w,r-l+1);
if(a<=m)
update(a,b,d,l,m,w<<1);
if(b>m)
update(a,b,d,m+1,r,w<<1|1);
up(w);
}
void set(int p,int d,int l,int r,int w)
{
if(l==r)
{
s[w] = d;
return ;
}
int  m = (l+r)>>1;
down(w,r-l+1);
if(p>m)
set(p,d,m+1,r,w<<1|1);
else
set(p,d,l,m,w<<1);
up(w);
}
int main()
{

int i,t,x,y,g=1;
cin>>n;
LL sum=0;
for(i = 1; i <= n ; i++)
{
cin>>t;
if(t==1)
{
cin>>x>>y;
update(1,min(g,x),y,1,N-5,1);
sum = s[1];
printf("%.6f\n",double(sum)/g);
}
else if(t==2)
{
cin>>x;
set(g+1,x,1,N-5,1);
sum = s[1];
g++;
printf("%.6f\n",double(sum)/g);
}
else
{
if(g>1)
{
set(g,0,1,N-5,1);
g--;
sum = s[1];
}
printf("%.6f\n",double(sum)/g);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: