1. 程式人生 > >[Luogu] 送花

[Luogu] 送花

targe pan pri 判重 getc urn -- post struct

https://www.luogu.org/problemnew/show/2073

自己yy,明顯錯

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10;
const int oo = 999999999;

#define gc getchar()

struct Node{
    int w, b, bef;
}flower[N];
int Ans1, Ans2, opt, W, B, Max, Min;
map<int, bool> Map;
int js = 1
, tot = 1; inline int read(){ int x = 0, f = 1; char c = gc; while(c < 0 || c > 9) {if(c == -) f = -1; c = gc;} while(c >= 0 && c <= 9) x = x * 10 + c - 0, c = gc; return x * f; } int main() { Max = 1; Min = 1; opt = read();
while(opt != 1) opt = read(); flower[Max].w = read(); flower[Max].b = read(); Map[flower[Max].w] = 1; flower[Max].bef = 1; while(true){ opt = read(); if(opt == -1) break; if(opt == 1){ flower[++ js].w = read(); flower[js].b = read(); W
= flower[js].w; B = flower[js].b; if(Map[W]) {js --; continue ;} else tot ++, Map[W] = 1; if(W > flower[Max].w || ! flower[Max].w) {flower[js].bef = Max; Max = js;} if(W < flower[Min].w || ! flower[Min].w) {flower[js].bef = Min; Min = js;} } else if(opt == 2){ if(tot <= 0) continue; int ma = Max; Map[flower[Max].w] = 0; flower[Max].w = 0; flower[Max].b = 0; Max = flower[ma].bef; flower[ma].bef = 0; tot --; } else { if(tot <= 0) continue; int mi = Min; Map[flower[Min].w] = 0; flower[Min].w = 0; flower[Min].b = 0; Min = flower[mi].bef; flower[mi].bef = 0; tot --; } } for(int i = 1; i<= N - 9; i ++) Ans1 += flower[i].w, Ans2 += flower[i].b; cout << Ans1 << " " << Ans2; return 0; } /* 1 2 2 1 7 20 3 1 16 3 1 2 16 2 -1 */

以權值為下標建立權值線段樹

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls jd<<1
#define rs jd<<1|1

using namespace std;
const int N = 1e6 + 10;
const int inf = 0x7f7f7f7f;

int opt;
bool vis[N];//用來判重;
struct Tree {int l, r, sumw, sumc, Min,Max;} T[N<<2];

void build(int jd, int ll, int rr) {
    T[jd].l = ll, T[jd].r = rr, T[jd].Min = inf;
    if(ll == rr) return;
    int m = ll + rr >> 1;
    build(ls, ll, m), build(rs, m + 1, rr);
}

void update(int jd, int pos, int val1, int val2, int val3, int val4) {
    if(T[jd].l == pos && T[jd].r == pos) {
        T[jd].sumc = val1;
        T[jd].sumw = val2;
        T[jd].Min = val3;
        T[jd].Max = val4;
        return;
    }
    if(T[ls].r >= pos) update(ls, pos, val1, val2, val3, val4);
    else update(rs, pos, val1, val2, val3, val4);
    T[jd].sumc = T[ls].sumc + T[rs].sumc;
    T[jd].sumw = T[ls].sumw + T[rs].sumw;
    T[jd].Min = min(T[ls].Min, T[rs].Min);
    T[jd].Max = max(T[ls].Max, T[rs].Max);
}

int main() 
{
    int n = N - 10;
    build(1, 1, n);
    while(scanf("%d", &opt) == 1 && opt != -1) {
        int w, c;
        if(opt == 1) {
            scanf("%d %d", &w, &c);
            if(vis[c]) continue;
            update(1, c, c, w, c, c);
            vis[c] = true;
        }
        if(opt == 3) {
            if(T[1].Min == inf) continue;//此時無花,下同;
            vis[T[1].Min] = false, update(1, T[1].Min, 0, 0, inf, 0);
        }
        if(opt == 2) {
            if(T[1].Max == 0) continue;
            vis[T[1].Max] = false, update(1, T[1].Max, 0, 0, inf, 0);
        }
    }
    printf("%d %d",T[1].sumw, T[1].sumc);
}

[Luogu] 送花