惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
人人都是产品经理
人人都是产品经理
月光博客
月光博客
V
V2EX
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
博客园 - 聂微东
博客园 - 司徒正美
博客园 - 【当耐特】
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志

某岛

AtCoder Beginner Contest 409 Luogu P5325. 【模板】Min_25 筛 UOJ #188. 【UR #13】Sanrd AtCoder Beginner Contest 371 AtCoder Beginner Contest 369 RPGMaker 2k3 百科 OneShot 的考古 2024“开创拓芯”游戏创享节的相关记录 CJ 回来后的戒断反应 Luogu P10221. [省选联考 2024] 重塑时光 Luogu P5308 [COCI2018-2019#4] Akvizna wqs 二分 歌唱王国 Lean 相关 BZOJ 3153. Sone1 The 2023 ICPC World Finals Luxor 新巴别塔 Sora 的想象与思考 Facebook Hacker Cup 2023 Round 1 AtCoder Beginner Contest 322 LLaMA 2 相关 HuggingFace AI Game Jam ACL 2023 Trans 相关… Luogu P2053. [SCOI2007] 修车 Luogu P1973. [NOI2011] NOI 嘉年华 Luogu P1933. [NOI2010] 旅行路线 Luogu P1954. [NOI2010] 航空管制 Luogu P2048. [NOI2010] 超级钢琴 Luogu P2046. [NOI2010] 海拔
HDU 3303. Harmony Forever
2023-05-12 · via 某岛

题意

对于集合S,有两种操作:1、B X;2、A Y。B X代表将X加入集合S,并赋予X一个序号,代表它是第几个数;A Y代表从集合S中找出mod Y最小的数,输出的是该数的序号。

做法

非常厉害的一个题。

对 y 进行讨论,小的 y 每次加数的时候暴力更新,而大的 y 转换成 rmq 问题。
(这个我觉得是这题的难点,对于取模操作我很难去往看起来复杂度更高的 rmq 上面想。)

注意到这个 rmq 我们是可以离线的,而对于静态的问题是可以单调栈的(参考之前的 O(n)-O(1) RMQ),而只有加数操作,可以变成集合分裂,反过来就变成并查集。

const int N = int(4e4) + 9, M = int(5e5) + 9, SM = 1009;
char T[N]; int n, A[N], AA[N], P[M+1], id[M], nn;
VI res;

int Find(int x){
    return P[x] == x ? x : P[x] = Find(P[x]);
}

void Union(int x, int y){
    x = Find(x), y = Find(y);
    assert(x != y);
    P[x] = y;
}


int main(){

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif

    //cout << sqrt(M) << endl;

int __size__ = 256 << 20; // 256MB
char *__p__ = (char*)malloc(__size__) + __size__;
__asm__("movl %0, %%esp\n" :: "r"(__p__));

    while(RD(n)){

        printf("Case %d:\n", ++Case);

        nn = 0; REP_1(i, M) P[i] = i;

        RST(id); REP_1(i, n){
            RC(T[i]); RD(A[i]);
            if (T[i] == 'B') AA[++nn] = A[i], id[A[i]] = -nn;
        }

        FOR(i, 1, M){
            if (!id[i]) Union(i, i+1);
        }

        CLR(res); DWN_1(i, n, 1) if (T[i] == 'B'){
            Union(A[i], A[i]+1);
            --nn;
        }
        else{

            int r = A[i]; if (Find(1) == M){
                res.PB(-1);
                continue;
            }

            if (r < SM){
                PII ar = MP(INF, 0);
                DWN_1(t, nn, 1){
                    checkMin(ar, MP(AA[t]%r, -t));
                    if (!ar.fi) break;
                }
                res.PB(-ar.se);
                continue;
            }

            PII a=MP(INF,0); int tt;

            for(int it=Find(1);it!=M;it=Find(min(M, it+(r-tt)))){
                checkMin(a, MP(tt=it%r, id[it]));
            }
            res.PB(-a.se);
        }

        RVS(res); ECH(it, res) OT(*it);
        puts("");
    }

}

Posted by xiaodao
Category: 日常