您的位置:首页 > 其它

Codeforces 85 D. Sum of Medians

2017-03-24 20:18 295 查看
题目链接:http://codeforces.com/contest/85/problem/D

做法果然男默女泪啊.....

大概就是直接开了一个$vector$每次插入删除都用自带的$insert$和$erase$,然后查询也是暴力搞。

那么为啥么过得很有理有据呢?

  1.首先考虑如果没有修改我就能继承上一次的答案...

  2.修改我们假设(就是)${O(logn)}$的。

  3.每次暴力查询是$5$个数字一步。

  4.显然一开始并不是上来就有${100000}$个数字

所以大概复杂度会是${O(n^{2}/40)}$的....

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10010
#define llg int
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,w,x;
vector<llg>a;
long long ans;
bool pd;
char s[6];
inline int getint()
{
int w=0,q=0; char c=getchar();
while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar();
while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
}

int main()
{
yyj("sum");
cin>>n;
while (n--)
{
scanf("%s",s);
if (s[0]=='s')
{
if (!pd) {printf("%lld\n",ans); continue;}
ans=0;
w=a.size();
for (llg i=2;i<w;i+=5) ans+=a[i];
pd=false;
printf("%lld\n",ans);
}
else
{
x=getint();
if (s[0]=='a') a.insert(lower_bound(a.begin(),a.end(),x),x);
else a.erase(lower_bound(a.begin(), a.end(), x));
pd=true;
}
}
return 0;
}


当然正解也是可以想出来的,就是一个线段树每个点维护所有数字%5=x的数字和,然后记录右移多少。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: