HDU 4288
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4288
题意:
有三种操作,添加一个数,删除一个数(每个位置数值为1,添加和删除后保证数组升序),求每个下标i%5==2的点和。
思路:
数据比较水,模拟加数和减数的时候数组整体向后或者向前移动就行,主要是保持数组的有序性。
源码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdlib>
using namespace std;
#define inf (1000000007)
#define LL long long
const int MAXN = 100000 + 5;
int data[MAXN];
char op[5];
bool cmp(int a, int b){return a < b;}
int main()
{
int n;
while(scanf("%d", &n) != EOF){
int rear = 0;
while(n--){
scanf("%s", op);
if(op[0] == 's'){
// sort(data, data + rear, cmp);
// while(rear > 0 && data[rear - 1] == inf) rear--;
LL ans = 0;
for(int i = 2 ; i < rear ; i += 5)
ans += data[i];//, printf("data[%d] = %d\n", i, data[i]);
printf("%I64d\n", ans);
}
else{
int u;
scanf("%d", &u);
if(op[0] == 'a'){
int i;
for(i = rear ; i > 0 ; i--){
if(data[i - 1] > u) data[i] = data[i - 1];
else break;
}
data[i] = u;
rear++;
}
else if(op[0] == 'd'){
int i;
int l = 0, r = rear - 1;
while(l < r - 1){
int mid = (l + r) / 2;
if(data[mid] > u)
r = mid;
else
l = mid;
}
if(data[l] == u)
i = l;
else i = r;
// for(i = 0 ; i < rear ; i++)
// if(data[i] == u) break;
for(; i < rear; i++)
data[i] = data[i + 1];
rear--;
}
}
}
}
return 0;
}