CF641E Little Artem and Time Machine

Super_Cube

2024-11-18 17:29:32

Solution

Solution

很好笑的题。

所有操作只与单个数字相关,那对于每个 x 单独考虑。

现在对于每个值有一个操作序列,内容为在 t 时刻使答案加一或减一。对于查询只需要维护在不超过 t 时刻内一共有多少个加一操作,多少个减一操作,相减即为答案。

你当然可以离线下来通过离散化和树状数组或者在线动态开点线段树做,但是为了偷懒可利用 std::map__gnu_pbds::tree 在不到 500B 代码成功解决。

时间复杂度:O(n\log^2 n)

Code

#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace __gnu_pbds;
std::map<int,tree<int,null_type,std::less<int>,rb_tree_tag,tree_order_statistics_node_update> >mp1,mp2; 
int T;
int main(){
    scanf("%d",&T);
    for(int op,x,y;T--;){
        scanf("%d%d%d",&op,&x,&y);
        if(op==1)mp1[y].insert(x);
        else if(op==2)mp2[y].insert(x);
        else printf("%d\n",mp1[y].order_of_key(x+1)-mp2[y].order_of_key(x+1));
    }
    return 0;
}