社区讨论
问题依然无法解决,求助
灌水区参与者 2已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @losf67j6
- 此快照首次捕获于
- 2023/11/10 17:32 2 年前
- 此快照最后确认于
- 2023/11/10 20:06 2 年前
为什么全是RE啊啊啊啊
CPP#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
int n, m;
int col[maxn << 2], tag[maxn << 2];
void up(int n) {
col[n] = col[n << 1] | col[n << 1|1];
}
void down(int l, int r, int n) {
if(tag[n]) {
tag[n << 1] = tag[n << 1 |1] = (1 << tag[n]);
col[n << 1] = col[n << 1] | (1 << tag[n << 1]);
col[n << 1|1] = col[n << 1|1] | (1 << tag[n <<1|1]);
tag[n] = 0;
}
}
void build(int l, int r, int n) {
if(l == r) {
col[n] = 1;
return;
}
int mid = (l + r) >>1;
build(l, mid, n<<1);
build(mid +1, r, n<<1 |1);
up(n);
}
void change(int a, int b, int k, int l, int r, int n) {
if(a <= l && r <= b) {
tag[n] = (1 << k);
col[n] = (1 << k);
return;
}
down(l, r, n);
int mid = ( l+ r) >> 1;
if(mid >= a) change(a, b, k, l, mid , n<<1);
if(mid < b) change(a, b, k, mid+1, r, n<<1|1);
up(n);
}
int query(int a,int b, int l, int r, int n) {
if(a <= l && r <= b) {
return col[n];
}
down(l, r, n);
int mid = (l + r) >>1;
int ans = 1;
if(mid >=a) ans |= query(a, b, l, mid , n <<1);
if(mid < b) ans |= query(a, b, mid+1, r, n<<1|1);
return ans;
}
int bit[(1 << 16)];
int sol(int a, int b) {
int ans = query(a, b, 1, n , n);
ans = bit[ans >> 16] + bit[ans & ((1 << 16) - 1)];
return ans;
}
int main() {
int t;
cin >> n >> t >> m;
bit[1] =1;
for(int i = 2; i <= (1 << 16); i++) {
bit[i] = bit[(i >> 1)] + (i & 1);
}
build(1, n, n);
while(m--) {
char m[2];
scanf("%s", m);
int a, b;
if(m[0] == 'C'){
int c;
scanf("%d%d%d", &a, &b, &c);
if(a > b) swap(a, b);
change(a, b, c, 1, n, n);
}
else {
scanf("%d%d", &a, &b);
if(a > b) swap(a, b);
int ans = sol(a, b);
printf("%d\n", ans);
}
}
return 0;
}
求助,
P1558
回复
共 9 条回复,欢迎继续交流。
正在加载回复...