Codeforces 283A Cows and Sequence

本文介绍了解决 CodeForces 283A 题目的方法,采用简单模拟策略,利用数组记录操作1的累积效果,并在执行操作3时更新数组以减少计算复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

http://codeforces.com/problemset/problem/283/A

解法:

刚开始以为是简单的模拟,求平均数只需要知道sum和当前数组的长度即可。

每次进行操作1和2的时候都可以明确地增加sum的值。

但是后来发现进行操作3的时候要sum减去多少值不清楚,原因在于操作1的时候,对整个范围进行了加操作。

既然是对范围操作,有联想到用线段树来存储这个操作。

但是线段树写到一半突然意识到其实不用那么复杂。

主要原因在于:这个题目的场景操作是有序,对于操作3,始终都是从右边pop一个数字出去。

也就是说当pop a[i]的时候肯定已经pop过a[i+1]了。所以只需要新开辟一个数组d[] 来存储将操作1的加法状态即可。

每次进行操作3的时候 d[i-1]+=d[i],即可。


但是!

我的代码wa了,但是又查不出来哪里错误。

刚开始以为思路有误,后来搜了一下。发现

http://codeforces.com/blog/entry/7049

这个人和我解法一模一样。。。


实在查不出来哪写错了。先搁这了,以后再说了。



#include<iostream>
#include<fstream>
#include<map>
#include<vector>
#include<string>
#include<memory.h>
#include<cmath>
#include<algorithm>
#include<queue>
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) (a>0?(a):-(a))
#define llong long long int
using namespace std;
const int N=200005,M=100005,inf=0x7fffffff;
int n,m;
int a[N];
int d[N];
int p;
int sum;
int main()
{
	//freopen("1.txt","r",stdin);
	while(scanf("%d",&n)!=EOF)
	{
		p=1;
		sum=0;
		memset(a,0,sizeof(a));
		memset(d,0,sizeof(d));

		int type,tmp;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&type);
			if(type==3)
			{
				sum -= a[p]+d[p];
				if(d[p])
				{
					d[p-1]+=d[p];
				}
				d[p]=0;
				a[p--]=0;
				
			}
			if(type==2)
			{
				scanf("%d",&tmp);
				a[++p] = tmp;
				sum += tmp;
			}
			if(type==1)
			{
				int fn,x;
				scanf("%d%d",&fn,&x);
				sum += fn*x;
				d[fn]+=x;
			}
			printf("%lf\n",1.0*sum/p);
		}
	}
	return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值