比赛 |
[不是Rapiz出的]农场主钦定NOIP模拟赛1 |
评测结果 |
EEEEEEEEEE |
题目名称 |
Color the Axis |
最终得分 |
0 |
用户昵称 |
Tabing010102 |
运行时间 |
1.026 s |
代码语言 |
C++ |
内存使用 |
0.31 MiB |
提交时间 |
2016-11-08 18:41:11 |
显示代码纯文本
#include <cstdio>
using namespace std;
const int maxn = 2000000+100;
const int INF = 0x3f3f3f3f;
FILE *fin, *fout;
int n, m;
inline int max(int a, int b) { return a<b?b:a; }
inline int min(int a, int b) { return a<b?a:b; }
struct SEG {
int n;
int sumv[maxn<<2];
int setv[maxn<<2];
SEG(int n) {
this->n = n;
build(1, 1, n);
}
void build(int o, int L, int R) {
setv[o] = INF;
if(L == R) {
sumv[o] = 1;
} else {
int lc=o*2, rc=o*2+1;
int M = L + (R-L)/2;
build(lc, L, M);
build(rc, M+1, R);
sumv[o] = sumv[lc] + sumv[rc];
}
}
void upcurpinfo(int o, int L, int R) {
int lc=o*2, rc=o*2+1;
if(setv[o] != INF) sumv[o] = setv[o] * (R-L+1);
else if(R > L) sumv[o] = sumv[lc]+sumv[rc];
}
int oL, oR;
void set(int o, int L, int R) {
if(L>=oL && R<=oR) {
setv[o] = 0;
} else {
int lc=o*2, rc=o*2+1;
int M = L + (R-L)/2;
if(M >= oL) set(lc, L, M); else upcurpinfo(lc, L, M);
if(M < oR) set(rc, M+1, R); else upcurpinfo(rc, M+1, R);
}
upcurpinfo(o, L, R);
}
int _sum;
void qsum(int o, int L, int R) {
if(setv[o] != INF) {
_sum += setv[o] * (min(R,oR)-max(L,oL)+1);
} else if(L>=oL && R<=oR) {
_sum += sumv[o];
} else {
int lc=o*2, rc=o*2+1;
int M = L + (R-L)/2;
if(M >= oL) qsum(lc, L, M);
if(M < oR) qsum(rc, M+1, R);
}
}
void execute_command() {
int l, r;
fscanf(fin, "%d%d", &l, &r);
oL = l; oR = r;
set(1, 1, n);
_sum = 0;
oL = 1; oR = n;
qsum(1, 1, n);
fprintf(fout, "%d\n", _sum);
}
};
int main() {
fin = fopen("Axis.in", "r");
fout = fopen("Axis.out", "w");
fscanf(fin, "%d%d", &n, &m);
SEG *D = new SEG(n);
for(int i = 1; i <= m; i++) D->execute_command();
return 0;
}