求卡时间和空间
查看原帖
求卡时间和空间
554698
Zi_Gao楼主2023/11/9 19:15

做法:先考虑不在线,把询问挂在右端点上面,扫描右端点,动态维护一个左端点到当前的点的区间卜同数xor和。在线就主席树,然后标记永久化,现在会TLE,开打了还会MLE

求卡QAQ


#include<bits/stdc++.h>
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE int
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){if(x<0)x=-x,putchar('-');if(x>9)print(x/10);putchar(x%10^48);return;}

namespace Fread {
const int SIZE = 1 << 21;
char buf[SIZE], *S, *T;
inline char getchar() {
    if (S == T) {
        T = (S = buf) + fread(buf, 1, SIZE, stdin);
        if (S == T) return '\n';
    }
    return *S++;
}
}
namespace Fwrite {
const int SIZE = 1 << 21;
char buf[SIZE], *S = buf, *T = buf + SIZE;
inline void flush() {
    fwrite(buf, 1, S - buf, stdout);
    S = buf;
}
inline void putchar(char c) {
    *S++ = c;
    if (S == T) flush();
}
struct NTR {
    ~ NTR() { flush(); }
} ztr;
}
#ifdef ONLINE_JUDGE
#define getchar Fread :: getchar
#define putchar Fwrite :: putchar
#endif
namespace Fastio {
struct Reader {
    template<typename T>
    Reader& operator >> (T& x) {
        char c = getchar();
        T f = 1;
        while (c < '0' || c > '9') {
            if (c == '-') f = -1;
            c = getchar();
        }
        x = 0;
        while (c >= '0' && c <= '9') {
            x = x * 10 + (c - '0');
            c = getchar();
        }
        x *= f;
        return *this;
    }
    Reader& operator >> (char& c) {
        c = getchar();
        while (c == ' ' || c == '\n') c = getchar();
        return *this;
    }
    Reader& operator >> (char* str) {
        int len = 0;
        char c = getchar();
        while (c == ' ' || c == '\n') c = getchar();
        while (c != ' ' && c != '\n' && c != '\r') { // \r\n in windows
            str[len++] = c;
            c = getchar();
        }
        str[len] = '\0';
        return *this;
    }
    Reader(){}
} cin;
const char endl = '\n';
struct Writer {
    template<typename T>
    Writer& operator << (T x) {
        if (x == 0) { putchar('0'); return *this; }
        if (x < 0) { putchar('-'); x = -x; }
        static int sta[45];
        int top = 0;
        while (x) { sta[++top] = x % 10; x /= 10; }
        while (top) { putchar(sta[top] + '0'); --top; }
        return *this;
    }
    Writer& operator << (char c) {
        putchar(c);
        return *this;
    }
    Writer& operator << (char* str) {
        int cur = 0;
        while (str[cur]) putchar(str[cur++]);
        return *this;
    }
    Writer& operator << (const char* str) {
        int cur = 0;
        while (str[cur]) putchar(str[cur++]);
        return *this;
    }
    Writer(){}
} cout;
}
#define cin Fastio :: cin
#define cout Fastio :: cout
#define endl Fastio :: endl

#define lc (tree[(p)].lChild)
#define rc (tree[(p)].rChild)

const int PSEG_DATA_SIZE=1000010;
const int PSEG_SIZE=PSEG_DATA_SIZE*16;

struct PSEGTREE_NODE{
    int data,lChild,rChild;
};

struct PSEGTREE{
    PSEGTREE_NODE tree[PSEG_SIZE];
    int root[PSEG_DATA_SIZE],tot,L,R;

    int getMem(){
        return tot++;
    }

    int build_(int l,int r){
        int p=getMem();
        if(l==r) tree[p].data=0;
        else{
            int mid=(l+r)>>1;
            tree[p].lChild=build_(l,mid);
            tree[p].rChild=build_(mid+1,r);
        }
        return p;
    }

    int query(int p,int pos,int l,int r){
        if(l==r) return tree[p].data;
        int mid=(l+r)>>1;
        return (pos<=mid?query(lc,pos,l,mid):query(rc,pos,mid+1,r))^tree[p].data;
    }

    int modify(int old,int l,int r,int s,int t,int c){
        int p=getMem();
        tree[p]=tree[old];
        if(s<=l&&r<=t) tree[p].data^=c;
        else{
            int mid=(l+r)>>1;
            if(s<=mid) tree[p].lChild=modify(tree[p].lChild,l,mid,s,t,c);
            if(mid<t) tree[p].rChild=modify(tree[p].rChild,mid+1,r,s,t,c);
        }
        return p;
    }

    void build(int l,int r){
        root[0]=build_(L=l,R=r);
        return;
    }

    void modify(int oldVer,int newVer,int l,int r,int tag){
        root[newVer]=modify(root[oldVer],L,R,l,r,tag);
    }
    int query(int ver,int pos){return query(root[ver],pos,L,R);}
}pseg;

int arr[1000010],xorsum[1000010];
std::map<int,int> latPos;

int main(){
	#ifndef ONLINE_JUDGE
	freopen("name.in", "r", stdin);
	freopen("name.out", "w", stdout);
	#endif

    register int i,l,r;

    int n;
    cin>>n;
    for(i=1;i<=n;++i){
        cin>>arr[i];
        xorsum[i]=xorsum[i-1]^(arr[i]);
    }

    pseg.build(1,n);

    for(i=1;i<=n;++i){
        pseg.modify(i-1,i,latPos[arr[i]]+1,i,arr[i]);
        latPos[arr[i]]=i;
    }

    int q;
    cin>>q;
    for(i=0;i<q;++i){
        cin>>l>>r;
        cout<<(pseg.query(r,l)^xorsum[r]^xorsum[l-1])<<'\n';
    }

	#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	#endif
    return 0;
}
2023/11/9 19:15
加载中...