#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
#include <string>
#include <bitset>
#include <map>
#include <set>
#include <tuple>
#include <string.h>
#include <math.h>
#include <random>
#include <functional>
#include <assert.h>
#include <math.h>
#include <sstream>
#include <iterator>
#include <regex>
#define MOD 1000000007
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
class FenwickTree
{
public:
FenwickTree()
{
}
FenwickTree(int k)
{
data.resize(k);
}
i64 sum(int n)
{
i64 ans = 0;
while (n > 0)
{
ans += data[n];
n -= (n & -n);
}
return ans;
}
void add(int n, i64 num)
{
while (n < data.size())
{
data[n] += num;
n += (n & -n);
}
}
private:
vector<i64> data;
};
int total = 1;
vector<FenwickTree> lrZeroNs;
vector<FenwickTree> udZeroNs;
void update(int x, int n, int idx, vector<int>& v, FenwickTree& lr, vector<FenwickTree>& lrs, vector<FenwickTree>& uds, int change)
{
if (n == 1)
return;
int lrt = lr.sum(x + n - 1) - lr.sum(x - 1);
int udCount = uds[idx].sum(1 << idx);
//다 같은 색
if ((lrt == 0 || lrt == n))
{
total -= 4 * udCount;
lrs[idx].add(1 + x / n, 1);
}
else if (((v[change] == 1 && lrt == 1) || (v[change] == 0 && lrt == n - 1))) // 원래 통째로 였다가 나뉜거
{
total += 4 * udCount;
lrs[idx].add(1 + x / n, -1);
}
int hn = n / 2;
if (change < x + hn)
update(x, hn, idx + 1, v, lr, lrs, uds, change);
else
update(x + hn, hn, idx + 1, v, lr, lrs, uds, change);
}
int main()
{
int n, q;
scanf("%d %d", &n, &q);
vector<int> lr((1 << n) + 1);
vector<int> ud((1 << n) + 1);
FenwickTree lrtree((1 << n) + 1);
FenwickTree udtree((1 << n) + 1);
for (int i = 0; i < n; i++)
{
lrZeroNs.emplace_back((1 << i) + 1);
udZeroNs.emplace_back((1 << i) + 1);
for (int j = 1; j <= (1 << i); j++)
{
lrZeroNs[i].add(j, 1);
udZeroNs[i].add(j, 1);
}
}
for (int i = 0; i < q; i++)
{
int t, x;
scanf("%d %d", &t, &x);
vector<int>& v = t == 0 ? lr : ud;
FenwickTree& tree = t == 0 ? lrtree : udtree;
auto& trees = t == 0 ? lrZeroNs : udZeroNs;
auto& others = t == 0 ? udZeroNs : lrZeroNs;
int prev = v[x];
if (v[x] == 0)
v[x] = 1;
else
v[x] = 0;
tree.add(x, v[x] - prev);
update(1, (1 << n), 0, v, tree, trees, others, x);
printf("%d\n", total);
}
return 0;
}
Compilation message
collecting.cpp: In member function 'void FenwickTree::add(int, i64)':
collecting.cpp:55:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while (n < data.size())
^
collecting.cpp: In function 'int main()':
collecting.cpp:102:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &n, &q);
^
collecting.cpp:124:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &t, &x);
^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
1 ms |
376 KB |
Output is correct |
3 |
Correct |
1 ms |
408 KB |
Output is correct |
4 |
Correct |
1 ms |
428 KB |
Output is correct |
5 |
Correct |
2 ms |
428 KB |
Output is correct |
6 |
Correct |
1 ms |
428 KB |
Output is correct |
7 |
Correct |
1 ms |
428 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
476 KB |
Output is correct |
2 |
Correct |
2 ms |
524 KB |
Output is correct |
3 |
Correct |
3 ms |
544 KB |
Output is correct |
4 |
Correct |
3 ms |
692 KB |
Output is correct |
5 |
Correct |
3 ms |
692 KB |
Output is correct |
6 |
Correct |
3 ms |
692 KB |
Output is correct |
7 |
Correct |
2 ms |
692 KB |
Output is correct |
8 |
Correct |
2 ms |
692 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3396 ms |
80840 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |