50分求助QAQ
查看原帖
50分求助QAQ
260710
_Scaley楼主2021/7/19 20:59

评测记录

蒟蒻死活调不出来,求 dalao 帮忙 QAQ

让窝康康我又双叒叕犯了什么 sb 错误

#include <bits/stdc++.h>
#define MAXN 1000010
#define INF 2147483647
#define int long long
using namespace std;
//--------------定义结构体--------------
struct Node {
    int vul, dat, size, cnt, sum;
} e[MAXN];
//---------------定义变量---------------
int n, m, root, cnt = 0, Rank, Sum, pre;
int ch[MAXN][2], A[MAXN];
//---------------定义函数---------------
inline int read() {
    int f = 0, x = 0; char ch = getchar();
    while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
    while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
    return f ? -x : x;
}
void pushup(int id) {
    e[id].size = e[ch[id][0]].size + e[ch[id][1]].size + e[id].cnt;
	e[id].sum = e[id].vul * e[id].cnt + e[ch[id][0]].sum + e[ch[id][1]].sum;
	if (id == 1 || id == 2) e[id].sum = 0;
}
int New(int vul) {
    e[++cnt].vul = vul; e[cnt].dat = rand();
    e[cnt].size = e[cnt].cnt = 1;
    pushup(cnt);
    return cnt;
}
void BuildTree() {
    root = New(-INF);
	ch[root][1] = New(INF);
    pushup(root);
}
void Rotate(int &id, int dir) {
    int now = ch[id][dir ^ 1];
    ch[id][dir ^ 1] = ch[now][dir];
    ch[now][dir] = id;
    id = now;
    pushup(ch[id][dir]), pushup(id);
}
void insert(int &id, int vul) {
    if (id == 0) {
        id = New(vul);
        return ;
    }
    if (vul == e[id].vul) ++e[id].cnt;
    else {
        int dir = vul < e[id].vul ? 0 : 1;
        insert(ch[id][dir], vul);
        if (e[id].dat < e[ch[id][dir]].dat) Rotate(id, dir ^ 1);
    }
    pushup(id);
}
void Remove(int &id, int vul) {
    if (id == 0) return ;
    if (vul == e[id].vul) {
        if (e[id].cnt > 1) {
            --e[id].cnt;
            pushup(id);
            return ;
        }
        if (ch[id][0] || ch[id][1]) {
            if (!ch[id][1] || e[ch[id][1]].dat < e[ch[id][0]].dat)
                Rotate(id, 1), Remove(ch[id][1], vul);
            else Rotate(id, 0), Remove(ch[id][0], vul);
            pushup(id);
        }
        else id = 0;
        return ;
    }
    vul < e[id].vul ? Remove(ch[id][0], vul) : Remove(ch[id][1], vul);
    pushup(id);
}
int GetRank(int id, int vul) {
    if (id == 0) return -2;
    if (vul == e[id].vul) return e[ch[id][0]].size + e[id].cnt;
    else if (vul < e[id].vul) return GetRank(ch[id][0], vul);
    else  return e[ch[id][0]].size + e[id].cnt + GetRank(ch[id][1], vul);
}
int GetPreSum(int vul) {
    int id = root, Pre;
    while (id != 0) {
        if (e[id].vul < vul) {
        	Pre = e[id].vul;
        	Sum += (e[ch[id][0]].sum + e[id].cnt * ((id == 1 || id == 2) ? 0 : e[id].vul));
        	id = ch[id][1];
		}
        else id = ch[id][0];
    }
    return Pre;
}
//----------------主函数----------------
signed main() {
	char opt;
    n = read(); m = read();
    BuildTree();
    for (int i = 1; i <= n; ++i) A[i] = 0, insert(root, 0);
    for (int i = 1, k, a, c, s; i <= m; ++i) {
        cin >> opt;
        if (opt == 'U') {
        	k = read(); a = read();
        	Remove(root, A[k]);
        	insert(root, a);
        	A[k] = a;
		}
		else {
			c = read(); s = read(); Sum = 0;
			pre = GetPreSum(s);
			Rank = GetRank(root, pre) - 1;
//			cout << pre << " " << Rank << " " << Sum << endl;
			if (Sum >= (c - (n - Rank)) * s) printf("TAK\n");
			else printf("NIE\n");
		}
    }
    return 0;
}

求不要在意码风(逃)

其实我已经预见到这个帖子会沉,但我还是义无反顾地挂了上来(万一有 dalao 闲得慌呢)

2021/7/19 20:59
加载中...