Submission #883619

# Submission time Handle Problem Language Result Execution time Memory
883619 2023-12-05T14:17:22 Z Requiem XOR (IZhO12_xor) C++17
0 / 100
2000 ms 236776 KB
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define fast ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
#define MOD 1000000007
#define INF 1e18
#define fi first
#define se second
#define endl "\n"
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a;i>=b;i--)
#define sz(a) ((int)(a).size())
#define pi 3.14159265359
#define TASKNAME "Xor"
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
using namespace std;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
const int MAXN = 250009;
const int block = 500;
int n,k;
int a[MAXN],prexor[MAXN];
struct TrieNode{
    int child[2];
    TrieNode(){
       memset(child,0,sizeof(child));
    }
};
struct Trie{
    vector<TrieNode> Trie = {TrieNode(),TrieNode()};
    void addnum(int x){
        int p = 1;
        for(int i=30;i>=0;i--){
            int bit = (x>>i)&1;
            if (Trie[p].child[bit] == 0){
                Trie[p].child[bit] = Trie.size();
                Trie.pb(TrieNode());
            }
            p = Trie[p].child[bit];
        }
    }
    bool check(int pre,int x){
        int p = 1, mx = 0;
        for(int i=30;i>=0;i--){
            int bitpre = (pre>>i)&1;
            int pw2 = (1LL<<i);
            if (Trie[p].child[!bitpre]){
                if (x >= pw2 * 2) return false;
                x -= pw2;

                p = Trie[p].child[!bitpre];
            }
            else{
                p = Trie[p].child[bitpre];
            }
        }
        return (x <= 0);
    }
};
Trie TrieBlock[2003];
int starting[MAXN],ending[MAXN];
int maxlen, minpos,x;
void update(int node,int l,int r,int pos,int pre){
    TrieBlock[node].addnum(pre);
    if (l==r) return;
    int mid = (l+r)>>1;
    if (pos <= mid) update(node<<1,l,mid,pos,pre);
    else update(node<<1|1,mid+1,r,pos,pre);
}
int getminblock(int node,int l,int r,int u,int v,int pre){
    int mid = (l+r)>>1;
    if (l>=u and r<=v){
        if (l==r) return l;
        if (TrieBlock[node<<1].check(pre,x)){
            return getminblock(node<<1,l,mid,u,v,pre);
        }
        else if (TrieBlock[node<<1|1].check(pre,x)){
            return getminblock(node<<1|1,mid+1,r,u,v,pre);
        }
        else return INF;
    }
    if (l>v or r<u) return INF;
    return min(getminblock(node<<1,l,mid,u,v,pre),
               getminblock(node<<1|1,mid+1,r,u,v,pre));

}
main()
{
    fast;
   if (fopen(TASKNAME".inp","r")){
        freopen(TASKNAME".inp","r",stdin);
        freopen(TASKNAME".out","w",stdout);
   }
   cin>>n>>x;
   for(int i=1;i<=n;i++){
       cin>>a[i];
       prexor[i] = prexor[i-1] ^ a[i];
   }
   for(int i=0;i<n;i++){
       starting[i/block] = (starting[i/block] == -1) ? i : starting[i/block];
       ending[i/block] = i;
   }
   for(int i=0;i<=2000;i++){
       TrieBlock[i].addnum(0);
   }
   int MXBLOCK = (n-1) / block;
   int minblock = 0, idblock;
   for(int i=0;i<=n;i++){
       idblock = i / block;
       minblock = getminblock(1,0,MXBLOCK,0,idblock,prexor[i]);
       if (minblock != INF){
           for(int j=starting[minblock];j<=ending[minblock];j++){
                if ((prexor[i] ^ prexor[j]) >= x){
                   if (maximize(maxlen,i - j)){
                       minpos = j + 1;
                   }
                   else if (maxlen == i - j){
                       minimize(minpos, j + 1);
                   }
               }
           }
       }
       update(1,0,MXBLOCK,idblock,prexor[i]);
   }
   cout<<minpos<<' '<<maxlen<<endl;
}

Compilation message

xor.cpp: In member function 'bool Trie::check(long long int, long long int)':
xor.cpp:45:20: warning: unused variable 'mx' [-Wunused-variable]
   45 |         int p = 1, mx = 0;
      |                    ^~
xor.cpp: At global scope:
xor.cpp:89:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   89 | main()
      | ^~~~
xor.cpp: In function 'int main()':
xor.cpp:93:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         freopen(TASKNAME".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
xor.cpp:94:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         freopen(TASKNAME".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6492 KB Output is correct
2 Correct 2 ms 6492 KB Output is correct
3 Correct 4 ms 6492 KB Output is correct
4 Correct 3 ms 7004 KB Output is correct
5 Correct 83 ms 18960 KB Output is correct
6 Correct 157 ms 22312 KB Output is correct
7 Correct 177 ms 22872 KB Output is correct
8 Correct 220 ms 25308 KB Output is correct
9 Correct 1502 ms 218468 KB Output is correct
10 Correct 1416 ms 209020 KB Output is correct
11 Correct 1478 ms 220648 KB Output is correct
12 Correct 1427 ms 217400 KB Output is correct
13 Correct 1480 ms 214928 KB Output is correct
14 Correct 1390 ms 212272 KB Output is correct
15 Correct 1425 ms 212376 KB Output is correct
16 Correct 1460 ms 216372 KB Output is correct
17 Execution timed out 2068 ms 236776 KB Time limit exceeded
18 Halted 0 ms 0 KB -