HDU 4288 暴力

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;
}

你可能感兴趣的:(HDU 4288 暴力)