【线段树】 HDOJ 4288 Coder

刚开始看没什么思路。。。后来用STL的set写了一下,插入和删除都是logn的复杂度。但是查找就是n的复杂度。。。直接超时了。。。别人的博客把这道题分类在了线段树里。。。我就向线段树的方向想。。。。

想了一会儿还是不会写。。后来去百度发现其实不难。。。先对数据离散。。。然后线段树记录区间元素个数和区间元素对5的各个余数和。。。然后就用线段树维护一下三个操作就好了,每个操作复杂度都是logn。。


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 100005
#define eps 1e-6
#define mod 1000000007
#define INF 99999999
#define lowbit(x) (x&(-x))
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;

struct opra
{
    char opr;
    LL x;
}op[maxn];
LL order[maxn];
LL cnt[maxn<<2];
LL sum[5][maxn<<2];
char s[10];
LL n, m, p;

int cmp(LL a, LL b)
{
    return a>1;
    build(lson);
    build(rson);
    pushup(o);
}
void add(LL o, LL L, LL R)
{
    if(L==R){
        sum[1][o]=order[L];
        sum[0][o]=sum[2][o]=sum[3][o]=sum[4][o]=0;
        cnt[o]=1;
        return;
    }
    LL mid=(R+L)>>1;
    if(p<=order[mid]) add(lson);
    else add(rson);
    pushup(o);
}
void del(LL o, LL L, LL R)
{
    if(L==R){
        sum[1][o]=0;
        sum[0][o]=sum[2][o]=sum[3][o]=sum[4][o]=0;
        cnt[o]=0;
        return;
    }
    LL mid=(R+L)>>1;
    if(p<=order[mid]) del(lson);
    else del(rson);
    pushup(o);
}
void solve(void)
{
    for(int i=0;i


你可能感兴趣的:(线段树)