Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // xorcontest
- //
- // Created by Trần Nam KhĂ¡nh on 11/25/20.
- //
- #include <iostream>
- #include <cmath>
- using namespace std;
- long long a[3],b[3],dp[100][1ll<<3][1ll<<3];
- long long cal(long long ind,long long oka,long long okb)
- {
- if(ind<0)return 0;
- if(dp[ind][oka][okb]!=-1ll)return dp[ind][oka][okb];
- long long res=0;
- long long newoka=oka,newokb=okb,id[3];
- for(long long i=0;i<(1ll<<3);i++)
- {
- newoka=oka;
- newokb=okb;
- long long cur=0;
- for(long long j=0;j<=2;j++)
- {
- id[j]=((1ll<<j)&i)!=0;
- cur^=id[j];
- }
- for(long long j=0;j<=2;j++)
- {
- long long sta=(oka&(1ll<<j))!=0;
- long long stb=(okb&(1ll<<j))!=0;
- long long ida=(a[j]&(1ll<<ind))!=0;
- long long idb=(b[j]&(1ll<<ind))!=0;
- if(sta==0&&id[j]<ida)
- {
- newoka=-1ll;
- break;
- }
- if(stb==0&&id[j]>idb)
- {
- newokb=-1ll;
- break;
- }
- long long tmp=(id[j]>ida);
- newoka|=(tmp<<j);
- tmp=(id[j]<idb);
- newokb|=(tmp<<j);
- }
- if(newoka==-1ll||newokb==-1ll)continue;
- res=max(res,cal(ind-1ll,newoka,newokb)+(cur<<ind));
- }
- return dp[ind][oka][okb]=res;
- }
- long long cal2(long long ind,long long oka,long long okb)
- {
- if(ind<0)return 0;
- if(dp[ind][oka][okb]!=-1ll)return dp[ind][oka][okb];
- long long res=(long long)1e18;
- long long newoka=oka,newokb=okb,id[3];
- for(long long i=0;i<(1ll<<3);i++)
- {
- newoka=oka;
- newokb=okb;
- long long cur=0;
- for(long long j=0;j<=2;j++)
- {
- id[j]=((1ll<<j)&i)!=0;
- cur^=id[j];
- }
- for(long long j=0;j<=2;j++)
- {
- long long sta=(oka&(1ll<<j))!=0;
- long long stb=(okb&(1ll<<j))!=0;
- long long ida=(a[j]&(1ll<<ind))!=0;
- long long idb=(b[j]&(1ll<<ind))!=0;
- if(sta==0&&id[j]<ida)
- {
- newoka=-1ll;
- break;
- }
- if(stb==0&&id[j]>idb)
- {
- newokb=-1ll;
- break;
- }
- long long tmp=(id[j]>ida);
- newoka|=(tmp<<j);
- tmp=(id[j]<idb);
- newokb|=(tmp<<j);
- }
- if(newoka==-1ll||newokb==-1ll)continue;
- res=min(res,cal2(ind-1ll,newoka,newokb)+(cur<<ind));
- }
- return dp[ind][oka][okb]=res;
- }
- int main() {
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- freopen("xor3.inp","r",stdin);
- freopen("xor3.out","w",stdout);
- long long l=0;
- for(long long i=0;i<=2;i++)
- {
- cin>>a[i]>>b[i];
- l=max(l,(long long)log2(b[i]));
- }
- for(long long i=0;i<=l;i++)
- {
- for(long long j=0;j<(1ll<<3);j++)
- {
- for(long long z=0;z<(1ll<<3);z++)
- {
- dp[i][j][z]=-1ll;
- }
- }
- }
- cout<<cal2(l,0,0)<<endl;
- for(long long i=0;i<=l;i++)
- {
- for(long long j=0;j<(1ll<<3);j++)
- {
- for(long long z=0;z<(1ll<<3);z++)
- {
- dp[i][j][z]=-1ll;
- }
- }
- }
- cout<<cal(l,0,0)<<endl;
- return 0;
- }
- #include <bits/stdc++.h>
- #define task "XOR3"
- #define all(v) (v).begin(), (v).end()
- #define rep(i, l, r) for (int i = (l); i <= (r); ++i)
- #define Rep(i, r, l) for (int i = (r); i >= (l); --i)
- #define DB(X) { cerr << #X << " = " << (X) << '\n'; }
- #define DB1(A, _) { cerr << #A << "[" << _ << "] = " << (A[_]) << '\n'; }
- #define DB2(A, _, __) { cerr << #A << "[" << _ << "][" << __ << "] = " << (A[_][__]) << '\n'; }
- #define DB3(A, _, __, ___) { cerr << #A << "[" << _ << "][" << __ << "][" << ___ << "] = " << (A[_][__][___]) << '\n'; }
- #define PR(A, l, r) { cerr << '\n'; rep(_, l, r) DB1(A, _); cerr << '\n';}
- #define SZ(x) ((int)(x).size())
- #define pb push_back
- #define eb emplace_back
- #define pf push_front
- #define F first
- #define S second
- #define by(x) [](const auto& a, const auto& b) { return a.x < b.x; } // sort(arr, arr + N, by(a));
- #define next ___next
- #define prev ___prev
- #define y1 ___y1
- #define left ___left
- #define right ___right
- #define y0 ___y0
- #define div ___div
- #define j0 ___j0
- #define jn ___jn
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- using namespace std;
- typedef pair<int, int> ii;
- typedef pair<ii, int> iii;
- typedef vector<int> vi;
- typedef vector<ii> vii;
- typedef vector<ll> vl;
- ll A[3], B[3], mem[51][2][2][2][2][2][2];
- ll dp(int pos, int grt0, int les0, int grt1, int les1, int grt2, int les2, bool ty)
- {
- if (pos == 50)
- {
- if (ty) return ((grt0 && grt1 && grt2 && les0 && les1 && les2) ? 0 : -1e18);
- else return ((grt0 && grt1 && grt2 && les0 && les1 && les2) ? 0 : 1e18);
- }
- ll &res = mem[pos][grt0][les0][grt1][les1][grt2][les2];
- if (res != -1) return res;
- res = (ty ? -1e18 : 1e18);
- rep(i, 0, 1) rep(j, 0, 1) rep(k, 0, 1)
- {
- int ngrt0, nles0, ngrt1, nles1, ngrt2, nles2;
- if (i > (A[0] >> pos & 1)) ngrt0 = 1;
- else if (i < (A[0] >> pos & 1)) ngrt0 = 0;
- else ngrt0 = grt0;
- if (j > (A[1] >> pos & 1)) ngrt1 = 1;
- else if (j < (A[1] >> pos & 1)) ngrt1 = 0;
- else ngrt1 = grt1;
- if (k > (A[2] >> pos & 1)) ngrt2 = 1;
- else if (k < (A[2] >> pos & 1)) ngrt2 = 0;
- else ngrt2 = grt2;
- if (i < (B[0] >> pos & 1)) nles0 = 1;
- else if (i > (B[0] >> pos & 1)) nles0 = 0;
- else nles0 = les0;
- if (j < (B[1] >> pos & 1)) nles1 = 1;
- else if (j > (B[1] >> pos & 1)) nles1 = 0;
- else nles1 = les1;
- if (k < (B[2] >> pos & 1)) nles2 = 1;
- else if (k > (B[2] >> pos & 1)) nles2 = 0;
- else nles2 = les2;
- if (ty) res = max(res, dp(pos + 1, ngrt0, nles0, ngrt1, nles1, ngrt2, nles2, 1) * 2 + (i ^ j ^ k));
- else res = min(res, dp(pos + 1, ngrt0, nles0, ngrt1, nles1, ngrt2, nles2, 0) * 2 + (i ^ j ^ k));
- }
- if (res < 0) res = -1e18;
- if (res > 1e15) res = 1e18;
- return res;
- }
- int main()
- {
- freopen(task".inp", "r", stdin);
- freopen(task".out", "w", stdout);
- ios_base::sync_with_stdio(false); cin.tie(nullptr);
- rep(i, 0, 2) cin >> A[i] >> B[i];
- memset(mem, -1, sizeof(mem));
- cout << dp(0, 1, 1, 1, 1, 1, 1, 0) << '\n';
- memset(mem, -1, sizeof(mem));
- cout << dp(0, 1, 1, 1, 1, 1, 1, 1);
- return 0;
- }
- // Created by BJMinhNhut
- #include <bits/stdc++.h>
- using namespace std;
- #define all(x) (x).begin(), (x).end()
- #define rall(x) x.rbegin(), x.rend()
- #define pb push_back
- #define mp make_pair
- #define F first
- #define S second
- typedef int64_t ll;
- typedef vector<int> vi;
- typedef vector<ll> vll;
- void fast_io() {ios::sync_with_stdio(0); cin.tie(0);}
- /***Main Code***/
- #define DEBUG 0
- #define FILE_IO 1
- ll a[6];
- const int D = 60;
- const ll oo = 1e16;
- ll dp[D][100];
- void Input() {
- for(int i = 0; i < 6; ++i) cin >> a[i];
- }
- bool getBit(ll t, ll i) {return (t>>i)&1;}
- int check(int d, int st, int ok) {
- int ok1 = 0;
- for(int i = 0; i < 6; ++i) {
- if (i%2 == 0) {
- if (getBit(ok, i)) ok1 ^= (1<<i);
- else {
- if (getBit(a[i], d) < getBit(st, i>>1)) ok1 ^= (1<<i);
- if (getBit(a[i], d) > getBit(st, i>>1)) return -1;
- }
- } else {
- if (getBit(ok, i)) ok1 ^= (1<<i);
- else {
- if (getBit(a[i], d) > getBit(st, i>>1)) ok1 ^= (1<<i);
- if (getBit(a[i], d) < getBit(st, i>>1)) return -1;
- }
- }
- }
- return ok1;
- }
- ll getMin(ll i, int ok) {
- if (i == -1) return 0;
- ll &res = dp[i][ok];
- if (res != -1) return res;
- res = oo;
- for(int st = 0; st < (1<<3); ++st) {
- int ok1 = check(i, st, ok);
- if (ok1 == -1) continue;
- ll d = __builtin_popcount(st)&1;
- res = min(res, ll(d<<i) + getMin(i-1, ok1));
- }
- return res;
- }
- ll getMax(ll i, int ok) {
- if (i == -1) return 0;
- ll &res = dp[i][ok];
- if (res != -1) return res;
- res = 0;
- for(int st = 0; st < (1<<3); ++st) {
- int ok1 = check(i, st, ok);
- if (ok1 == -1) continue;
- ll d = __builtin_popcount(st)&1;
- res = max(res, ll(d<<i) + getMax(i-1, ok1));
- }
- return res;
- }
- void Solve() {
- memset(dp, -1, sizeof dp);
- cout << getMin(D-1, 0) << "\n";
- memset(dp, -1, sizeof dp);
- cout << getMax(D-1, 0) << "\n";
- }
- int main()
- {
- fast_io();
- if (FILE_IO) {
- #define task "XOR3"
- freopen(task".inp", "r", stdin);
- freopen(task".out", "w", stdout);
- }
- Input(), Solve();
- if (DEBUG) cout << "\nTime: " << clock()/1000.0 << "s";
- return 0;
- }
Add Comment
Please, Sign In to add comment