题解:P11754 [COCI 2024/2025 #5] 绘图 / Crtež
思路
我在做完这道题后想出了一个更好理解的推结论过程,所以这里附出更简单的版本。至于更丑陋的考场版本有兴趣可以看看。
答案显然是每一段连续的
随后,不难发现,对于一个已经被选择为
然后我们的问题就变成了如何求出每次询问里序列
时间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll (k<<1)
#define rr (k<<1|1)
#define mid ((l+r)>>1)
const int mod = 1e9 + 7;
int qpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
struct que {
int l, r;
} p[1000005];
map <int, int> mp;
int num[1000005], cnt, ls[1000005], un;
struct tree {
int l, r, lazy, num, sum;
} t[4000005];
int n, q;
inline void pushup(int k) {
t[k].num = t[ll].num + t[rr].num;
}
void build(int k, int l, int r) {
t[k].l = l;
t[k].r = r;
if (l == r) {
t[k].num = num[l];
t[k].sum = num[l];
return ;
}
build(ll, l, mid);
build(rr, mid + 1, r);
pushup(k);
t[k].sum = t[ll].sum + t[rr].sum;
return ;
}
inline void pushdown(int k) {
if (t[k].lazy) {
t[ll].lazy ^= 1;
t[rr].lazy ^= 1;
t[ll].num = t[ll].sum - t[ll].num;
t[rr].num = t[rr].sum - t[rr].num;
t[k].lazy = 0;
}
}
void update(int k, int l, int r) {
if (t[k].r < l || t[k].l > r) return ;
if (t[k].r <= r && t[k].l >= l) {
t[k].lazy ^= 1;
t[k].num = t[k].sum - t[k].num;
return ;
}
pushdown(k);
update(ll, l, r);
update(rr, l, r);
pushup(k);
return ;
}
signed main() {
cin >> n >> q;
for (int i = 1; i <= q; i++) {
cin >> p[i].l >> p[i].r;
ls[i * 2 - 1] = p[i].l, ls[i * 2] = p[i].r;
}
sort(ls + 1, ls + q * 2 + 1);
un = unique(ls + 1, ls + q * 2 + 1) - ls - 1;
for (int i = 1; i <= un; i++) {
num[i * 2 - 1] = ls[i] - ls[i - 1] - 1;
num[i * 2] = 1;
mp[ls[i]] = i * 2;
}
num[un * 2 + 1] = n - ls[un];//num 数组保存的是这一个新点存储了几个点
build(1, 1, un * 2 + 1);
for (int i = 1; i <= q; i++) {
p[i].l = mp[p[i].l];
p[i].r = mp[p[i].r];
update(1, p[i].l, p[i].r);
cout << qpow(3, t[1].num) % mod << "\n";
}
return 0;
//}
关于更多
这里附考场思路:
首先只考虑对一段连续的
接下来对这个情况进行简单的讨论:
- 当有
1 个0 时,显然对于第1 个数有两种选择:染色或不染。 - 当有
2 个0 时,对于第2 个数,前一个数未被染色的情况有1 个,此时这一个数也只能不染色,因为按照操作2 的定义,不可能存在两段染了色的段中间有一段未染色的情况。因此前一个数未染色而这一个数未染色的情况有一种;而前一个数被染色的情况有1 种,那这个点有三种选择:染前一个点的颜色,染新的颜色,不染。最后总情况为4 种,这个点未被染色的有2 种,被染色的有2 种。 - 当有
3 个0 时,根据上一种情况可得前一个数未染色可推出的情况有1\times 2=2 种,而前一个数被染色的情况有3\times 2=6 种,总情况有8 种,这个点未被染色的有4 种,被染色的有4 种。
接着根据这个规律,显然可得有
接下来,我们加入第
根据牛顿二项式定理(或者打一点表出来看)可得此式为