QOJ.ac

QOJ

Limite de temps : 5 s Limite de mémoire : 60 MB - 2048 MB Points totaux : 100 Difficulté: [afficher]

#18227. 追憶desuwa

Statistiques

注意:本題除第一個子任務外,空間限制為 60MB。

Zhengxu Sakiko 是一位著名的演算法競賽選手。只不過他由於記性太差,經常忘記學過的演算法。

這就是為什麼他常常追憶過去。

請注意本題特殊的空間限制。

給定 $m$ 個三元組 $(l, r, v)$。

有 $q$ 個操作,每次給出 $x, y$,表示查詢滿足 $l \le x \le r$ 且 $v \le y$ 的三元組中,$v$ 的最大值是多少。

如果不存在滿足條件的三元組,輸出 $0$。

本題強制在線。

輸入格式

第一行兩個整數 $m, q$。

接下來 $m$ 行,每行三個整數表示一組 $(l, r, v)$。

接下來 $q$ 行,每行兩個整數 $p, q$ 表示當前詢問滿足 $x = p \oplus ans, y = q \oplus ans$,其中 $\oplus$ 表示異或操作,$ans$ 表示上次詢問的答案與 $2^{21}-1$ 按位與(AND)的值。初始的 $ans$ 為 $0$。

輸出格式

對於每個詢問輸出一行,表示答案。

範例

輸入格式 1

5 5
3 5 3
4 5 10
3 4 2
1 4 13
1 1 6
1 6
7 11
9 14
2 1
5 14

輸出格式 1

6
13
3
0
10

輸入格式 2

15 15
3 9 9
3 5 10
8 15 10
4 6 4
8 13 6
3 7 0
11 11 11
8 10 11
3 3 14
3 15 13
4 15 9
6 11 7
4 5 12
6 12 10
10 10 14
9 5
1 5
8 11
14 9
8 14
3 11
7 1
4 3
3 1
12 15
9 4
13 15
0 3
13 12
6 13

輸出格式 2

0
0
11
0
13
0
0
0
0
13
9
4
4
7
0

資料範圍

子任務名稱 子任務編號 分值 限制
用腳維護 1 25 空間限制為 2048MiB
不勞而獲 2 25 $q \le 3 \times 10^4$
資料結構大師 3 25 $q \le 10^5$
我即是虛像 4 25 無特殊限制

對於所有資料:$1 \le m, q \le 10^6, 1 \le l \le r \le 2 \times 10^6, 0 \le v < 2^{31}, 1 \le x \le 2 \times 10^6, 0 \le y < 2^{31}$。

說明

另外,這裡有一份小 Z 編寫的區間第 $k$ 小值的程式碼,可能對你有所幫助。

#include <bits/stdc++.h>
using namespace std;
constexpr int Spp{1<<20},S2{1<<20};
char buf[Spp],*p1,*p2,buf2[S2],*l2=buf2,_st[22];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,Spp,stdin),p1==p2)?EOF:*p1++)
#define putchar(c) (l2==buf2+S2&&(fwrite(buf2,1,S2,stdout),l2=buf2),*l2++=(c))
template <typename T>
void read(T &x) {
    char c;int f{1};
    do x=(c=getchar())^48;
    while (!isdigit(c)&&c!='-');
    if (x==29) f=-1,x=0;
    while (isdigit(c=getchar()))
        x=(x*10)+(c^48);
    x*=f;
}
template <typename T,typename ...Args>
void read(T& x,Args&... args) {read(x);read(args...);}
template<typename T>
void write(T x,char c='\n') {
    if (x<0) putchar('-'),x*=-1;
    int tp=0;
    do _st[++tp]=x%10; while (x/=10);
    while (tp) putchar(_st[tp--]+'0');
    putchar(c);
}
struct OI{~OI(){fwrite(buf2,1,l2-buf2,stdout);}}oi;
using LL=unsigned long long;
// wavelet
struct bits {
    vector<LL> bl;
    vector<int> c;
    void resize(int num) {
        bl.resize(((num+1)>>6)+1);
        c.resize(bl.size());
    }
    void set(int i,LL val) {bl[i>>6]|=(val<<(i&63));}
    void build() {
        for (int i=1;i<bl.size();++i)
            c[i]=c[i-1]+popcount(bl[i-1]);
    }
    int rk1(int i) {return c[i>>6]+popcount(bl[i>>6]&((1uLL<<(i&63))-1));}
    int rk0(int i) {return i-rk1(i);}
};
struct wavelet {
    int h;
    vector<bits> B;
    vector<int> pos;
    void init(vector<int>& v) {
        h=__lg(*max_element(v.begin(),v.end()))+1;
        B.resize(h);pos.resize(h);
        for (int i=0;i<h;++i) {
            B[i].resize(v.size());
            for (int j=0;j<v.size();++j)
                B[i].set(j,(v[j]>>(h-i-1)&1));
            B[i].build();
            pos[i]=stable_partition(v.begin(),v.end(),[&](int c){
                return !(c>>(h-i-1)&1);
            })-v.begin();
        }
    }
    int qry(int i,int j,int k,int l,int r,int x) {
        if (i==j) return 0;
        if (r==l+1) return l;
        int mid=l+r>>1;
        int L{B[x].rk0(i)},R{B[x].rk0(j)};
        if (R-L>=k) return qry(L,R,k,l,mid,x+1);
        else return qry(pos[x]+B[x].rk1(i),pos[x]+B[x].rk1(j),k-(R-L),mid,r,x+1);
    }
} tr;
int main() {
    int n,m;read(n,m);
    vector<int> a(n);
    for (int i=0;i<n;++i) read(a[i]);
    tr.init(a);
    while (m--) {
        int l,r,k;read(l,r,k);
        write(tr.qry(l-1,r,k,0,1<<tr.h,0));
    }
    return 0;
}

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.