QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#385363 | #7765. Xor Master | valeriu# | 10 | 19ms | 137284kb | C++20 | 5.7kb | 2024-04-10 18:01:37 | 2024-07-04 03:34:51 |
Judging History
answer
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
//#define int ll
#define sz(x) ((int)(x).size())
using pii = pair<int,int>;
using tii = tuple<int,int,int>;
const int bmax = 64;
namespace Basis {
ull pivot[bmax];
ull contrmsk[bmax];
ull control = 0;
ull flippers = 0;
bool add(ull x) {
for(int i = bmax - 1; i >= 0; i--) {
if(pivot[i] == 0 && ((1ull << i) & x)) {
pivot[i] = x;
break;
}
else if(pivot[i] != 0 && ((1ull << i) & x))
x ^= pivot[i];
}
if(x == 0) return 0;
for(int i = 0; i < bmax; i++) {
if(pivot[i] == 0) continue;
for(int j = i + 1; j < bmax; j++) {
if(pivot[j] & (1ull << i))
pivot[j] ^= pivot[i];
}
}
control = 0;
flippers = 0;
for(int contra = 0; contra < bmax; contra++) {
contrmsk[contra] = 0;
if(pivot[contra] != 0) {
control |= (1ull << contra);
continue;
}
for(int i = contra + 1; i < bmax; i++)
if(pivot[i] & (1ull << contra)) contrmsk[contra] |= (1ull << i);
if(__builtin_popcountll(contrmsk[contra]) % 2 == 1)
flippers |= (1ull << contra);
}
return 1;
}
ull get_val(ull a) {
ull R = 0;
for(int i = 0; i < bmax; i++) {
if(pivot[i] != 0) continue;
R |= ((ull)((__builtin_popcountll(a & contrmsk[i]) & 1)
^ ((a & (1ull << i))? 1 : 0))) << i;
}
return R;
}
}
pii operator +(const pii& x, const pii& y) {
return pii{x.first + y.first, x.second + y.second};
}
pii flip(const pii& x) { return pii{x.second, x.first}; }
struct Node {
int cnt[bmax], len;
ull txor;
Node() {
for(int i = 0; i < bmax; i++) cnt[i] = 0;
len = 1;
txor = 0;
}
Node(ull a) {
for(int i = 0; i < bmax; i++) cnt[i] = 0;
len = 0;
txor = a;
}
void pull(const Node L, const Node R) {
for(int i = 0; i < bmax; i++) cnt[i] = L.cnt[i] + ((L.txor & (1ull << i))? R.len - R.cnt[i] : R.cnt[i]);
txor = L.txor ^ R.txor;
len = L.len + R.len;
}
};
template<typename Node>
struct AINT {
vector<Node> aint;
int n;
void init(int n_, Node TMP = Node()) {
n = n_;
aint.assign(2 * n + 5, TMP);
}
template<class CB> void walk(CB&& cb) { walk(cb, 1, n); }
template<class CB> void walk(CB&& cb, int l, int r) { walk(cb, l, r, 1, 1, n); }
template<class CB> void walk(CB&& cb, int l, int r, int node, int cl, int cr) {
if(cr < l || r < cl) return;
if(l <= cl && cr <= r && !cb(aint[node], cl, cr)) return;
int mid = (cl + cr) >> 1, L = node + 1, R = node + (mid - cl + 1) * 2;
walk(cb, l, r, L, cl, mid);
walk(cb, l, r, R, mid + 1, cr);
aint[node].pull(aint[L], aint[R]);
}
};
const int nmax = 5e5 + 5;
const int Jump = 35000;
Node sage[nmax];
bool issage[nmax];
signed main() {
cin.tie(0) -> sync_with_stdio(0);
int n, q;
cin >> n >> q;
AINT<Node> aint;
aint.init(n);
vector<ull> v(n + 1), real(n + 1);
for(auto &x : v | views::drop(1)) cin >> x;
real = v;
auto update = [&](int p, ull x) {
v[p] ^= Basis::get_val(x);
real[p] ^= x;
while(p >= 0 && issage[p] == 0) p--;
if(p == -1) return;
Node val(0);
for(int i = p + Jump - 1; i >= p; i--) {
Node here;
here.pull(Node(v[i]), Node());
val.pull(here, val);
}
sage[p] = val;
//aint.walk([&](Node& val, int cl, int cr) {
//val.pull(Node(v[cl]), Node());
//return 0;
//}, p, p);
};
auto reformat = [&]() {
for(int i = 1; i <= n; i++) v[i] = Basis::get_val(real[i]);
Node val(0);
int timer = 0;
for(int i = n; i > 0; i--) {
Node here;
here.pull(Node(v[i]), Node());
val.pull(here, val);
timer++;
if(timer == Jump) {
issage[i] = 1;
sage[i] = val;
val = Node(0);
timer = 0;
}
else
issage[i] = 0;
}
//aint.walk([&](Node& val, int cl, int cr) {
//if(cl != cr) return 1;
//val.pull(Node(v[cl]), Node());
//return 0;
//});
return;
};
auto query = [&](int l, int r) -> ull {
ull rez = 0;
ull part = Basis::flippers;
while(l <= r) {
if(issage[l] && l + Jump - 1 <= r) {
for(int i = 0; i < bmax; i++)
rez += (1ull << i) * ((part & (1ull << i))? sage[l].len - sage[l].cnt[i] : sage[l].cnt[i]);
part ^= sage[l].txor;
l += Jump;
continue;
}
part ^= v[l];
rez += part;
l++;
}
return rez;
};
reformat();
for(int i = 0; i < q; i++) {
int T;
cin >> T;
if(T == 1) {
int p;
ull x;
cin >> p >> x;
update(p, x);
}
else if(T == 2) {
ull x;
cin >> x;
if(Basis::add(x)) {
reformat();
}
}
else {
int l, r;
cin >> l >> r;
cout << query(l, r) + Basis::control * (ull)(r - l + 1) << '\n';
}
}
}
/**
Anul asta nu se da centroid
-- Rugaciunile mele
*/
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 10
Accepted
Test #1:
score: 10
Accepted
time: 19ms
memory: 137004kb
input:
2000 2000 1860495733 462603674 3739839441 759356520 47330263 550811730 2301200895 989240351 2499503801 2624225494 2123076812 1180966826 238739434 488666688 784742950 2583466952 4111371941 2335988605 2583741355 933716686 1644403538 1970423306 304500250 905101643 1814942168 1136358764 88729799 1577263...
output:
867006634793 3418049036989 1658469159497 794670034691 239792547603 1587489101990 592222190840 1343829229567 971235609706 571701308760 1219913933321 588622962923 2129364200509 1007100395808 3134493164996 3145027621038 2599298085956 1729302186341 837940435945 242569415869 2908005634977 1692554597386 1...
result:
ok 1001 lines
Test #2:
score: 0
Accepted
time: 8ms
memory: 137116kb
input:
2000 2000 836488286 497338588 1858847699 3099907357 1601878363 409027819 646677017 3314413779 3312383261 4245381929 661740170 2016795844 1226219370 1347593623 4008424282 2941543248 1331853899 3217984002 3651447350 1223595274 1733763258 2829453991 3934056384 2556266950 326379115 3240694642 2405972228...
output:
1042755994488 3566460727022 4896344756993 181148455339 5392308096517 128329799686 3895218239827 646945360393 2802192775672 4115818631146 377318752396 3776679332329 1298148822697 1295992748696 1351097540228 3413899110602 2303816407066 1713972222254 3490230048186 359123029421 2753519321710 37163510035...
result:
ok 987 lines
Test #3:
score: 0
Accepted
time: 4ms
memory: 137160kb
input:
2000 2000 934565373 583361217 1928523866 3968138916 58091196 1055428888 754057714 2583245062 1561553117 3803231337 1941815547 3183481079 4033721998 1961504708 1274020496 1413365247 4225380350 910888832 2085306570 4120303112 2310986051 3150392885 1863228247 2487640801 2753501595 1392599097 2663527219...
output:
3557365099431 1521170947970 1408454872311 2097066041438 1547787649380 1699033926121 731607397173 1512504400312 2238024031105 1226691488018 2720868465776 16740827185 1239458195766 34177580110 723038300762 89948012428 1059039811258 999014326614 20524953249 2755015662939 3285388608412 1592295267345 593...
result:
ok 1024 lines
Test #4:
score: 0
Accepted
time: 11ms
memory: 137284kb
input:
2000 2000 3045151729 428960501 1820713794 2282572198 2207348805 3422275025 782655334 2676169210 3422244596 3935592456 3633929583 3812985947 3297835714 1994436805 1574888855 3231965757 2375331974 982931142 234068847 2950645216 1927175875 202726997 3573353370 148578451 1270283373 2390862707 3593433616...
output:
445704627329 4223618535024 2450863577199 179382947501 2163925703050 2473211169137 1406440975573 1486681378298 5485708409222 3247499164866 170969938085 1264328439756 3972780905954 5127064167621 3233154054862 2628294443523 3887884373918 3201286978615 4072438879416 4508920381717 2500182546199 147588087...
result:
ok 975 lines
Subtask #2:
score: 0
Time Limit Exceeded
Test #5:
score: 0
Time Limit Exceeded
input:
500000 100000 12261386944926786495 7846697792998647383 16622924885320463714 170129022271213944 12625257523700625864 7684671687986103560 11532026873918423068 1131776055566669037 8263146651412710501 17872572061246021001 5017109039248728310 11088626167542318645 13810119722795416818 10928315716094262229...
output:
12337138966997790840 11593856511006775316 5653988472748567965 6281173414355612100 18027435777450732541 2903343914316621940 9422461876307420631 76690753587353877 798850376670823348 10137130634921141648 13914431888234873359 10192090671035653185 11569745711967074397 12303071505845046803 637460082558284...
result:
Subtask #3:
score: 0
Skipped
Dependency #2:
0%
Subtask #4:
score: 0
Time Limit Exceeded
Test #15:
score: 0
Time Limit Exceeded
input:
100000 100000 860905160 3192911636 290327446 2020707113 959258245 454185039 421895589 1070265496 2218913641 1684685660 1206723673 2606734467 4247254571 3341954386 3805299640 1702270353 2472053741 2816060613 1307901348 2702949728 879391505 884661815 330738731 1575749344 1239158446 2099693858 67466644...
output:
208755389215975 125497785366837 162446748431411 63166834945113 33018804920229 89343160639243 36805816758195 40790494641758 13928126471189 267168502433672 191989403472418 276350936750564 11189666657474 133862444125402 92684260245650 179275392898572 46159208957881 232612971657325 184946588056252 11022...
result:
Subtask #5:
score: 0
Skipped
Dependency #4:
0%
Subtask #6:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #4:
0%
Subtask #7:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #2:
0%