zoukankan      html  css  js  c++  java
  • P7502 「HMOI R1」不知道是啥的垃圾题 题解

    Luogu

    Description.

    给定一个二元组集合 \(S\),要求支持:

    • 插入一个二元组 \((a,b)\)
    • 删除一个二元组 \((a,b)\)
    • 给定 \((x,y)\),求 \(\sum_{(a,b)\in S}[x\oplus a>y\oplus b]\)

    Solution.

    启发:Trie 可以不是严格二叉树。

    直接维护一个四叉 Trie,然后就有了一个 \(O(n^2)\) 的暴力做法。
    发现如果当前 \(\oplus\) 相同才会有问题,所以直接对 \(a\oplus b\) 建立 Trie。
    复杂度变成了 \(O(n\log V)\)

    Coding.

    点击查看不行代码
    //是啊……你就是那只鬼了……所以被你碰到以后,就轮到我变成鬼了{{{
    #include<bits/stdc++.h>
    using namespace std;typedef long long ll;
    template<typename T>inline void read(T &x)
    {
        x=0;char c=getchar(),f=0;
        for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
        for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
        f?x=-x:x;
    }
    template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}/*}}}*/
    int ch[12000005][2],sn[12000005][4],tt,rt;
    #define bit(x) ((x>>d)&1)
    inline void ins(int &x,ll a,ll b,int c,int d=60)
    {
    	if(!~d) return;else sn[x?x:x=++tt][bit(a)<<1|bit(b)]+=c;
    	ins(ch[x][bit(a)^bit(b)],a,b,c,d-1);
    }
    inline int qry(int x,ll a,ll b,int d=60)
    {
    	if(!x||!~d) return 0;
    	return sn[x][(bit(a)^1)<<1|bit(b)]+qry(ch[x][bit(a)^bit(b)],a,b,d-1);
    }
    inline void solve() {int fg;ll a,b;read(fg,a,b);if(fg^3) ins(rt,a,b,fg&1?1:-1);else printf("%d\n",qry(rt,a,b));}
    int main() {int Ca;for(read(Ca);Ca--;) solve();return 0;}
    
  • 相关阅读:
    【Java学习】向上和向下转型
    【Java学习】java抽象类的作用
    【Java学习】追踪
    【Java学习】@Override 解释
    【Java学习】Java 中带包(创建及引用)的类的编译与调试
    【Java学习】相关基础算法
    【Java学习】import和import static的区别
    【testNG学习】testng.xml文件
    Reshape the Matrix
    Distribute Candies
  • 原文地址:https://www.cnblogs.com/pealfrog/p/15189236.html
Copyright © 2011-2022 走看看