这题要注意的是输入是C A B D A 有可能大于 B,代码中的flag标记代表的是此区间是否是纯色。col代表纯色区间的颜色。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define maxn 100000
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;
long ans;
bool vis[35];
struct tree
{
int flagcol;
int slflagcol;
int srflagcol;
int slcol;
int srcol;
int col;
int flag;
}tr[maxn * 4 + 5];
void build(long l, long r, long n)
{
tr[n].flagcol = 1;
tr[n].col = 1;
tr[n].flag = 0;
if(l == r)
return;
long mid = (l + r) / 2;
build(l, mid, n * 2);
build(mid + 1, r, n * 2 + 1);
tr[n].slflagcol = 1;
tr[n].srflagcol = 1;
tr[n].slcol = 1;
tr[n].srcol = 1;
}
void addcol(long l, long r, long n, long ll, long rr, long col)
{
if(l >= ll&&r <= rr)
{
tr[n].col = col;
tr[n].flagcol = 1;
tr[n].flag = 1;
//printf("#%ld %ld %ld\n", l, r, col);
return;
}
if(tr[n].flag)
{
tr[n * 2].col = tr[n * 2 + 1].col = tr[n].col;
tr[n * 2].flagcol = tr[n * 2 + 1].flagcol = 1;
tr[n * 2].flag = tr[n * 2 + 1].flag = 1;
tr[n].flag = 0;
}
long mid = (l + r) / 2;
if(ll <= mid)
addcol(l, mid, n * 2, ll, rr, col);
if(rr > mid)
addcol(mid + 1, r, n * 2 + 1, ll, rr, col);
tr[n].slflagcol = tr[n * 2].flagcol;
tr[n].srflagcol = tr[n * 2 + 1].flagcol;
tr[n].slcol = tr[n * 2].col;
tr[n].srcol = tr[n * 2 + 1].col;
if(tr[n].slflagcol == 1&&tr[n].srflagcol == 1&&tr[n].slcol == tr[n].srcol)
tr[n].flagcol = 1, tr[n].col = tr[n * 2].col;
else
tr[n].flagcol = 0;
}
void res(long l, long r, long n, long ll, long rr)
{
if(tr[n].flag&&l != r)
{
tr[n * 2].col = tr[n * 2 + 1].col = tr[n].col;
tr[n * 2].flagcol = tr[n * 2 + 1].flagcol = 1;
tr[n * 2].flag = tr[n * 2 + 1].flag = 1;
tr[n].flag = 0;
}
if(l != r)
{
tr[n].slflagcol = tr[n * 2].flagcol;
tr[n].srflagcol = tr[n * 2 + 1].flagcol;
tr[n].slcol = tr[n * 2].col;
tr[n].srcol = tr[n * 2 + 1].col;
if(tr[n].slflagcol == 1&&tr[n].srflagcol == 1&&tr[n].slcol == tr[n].srcol)
tr[n].flagcol = 1, tr[n].col = tr[n * 2].col;
else
tr[n].flagcol = 0;
}
if(l >= ll&&r <= rr)
{
if(tr[n].flagcol == 1)
{
if(vis[tr[n].col] == 0)
{
ans++;
//printf("@%ld %ld %ld\n", l, r, tr[n].col);
vis[tr[n].col] = 1;
}
}
else
{
if(l != r)
{
long mid = (l + r) / 2;
res(l, mid, n * 2, ll, rr);
res(mid + 1, r, n * 2 + 1, ll, rr);
}
}
return;
}
long mid = (l + r) / 2;
if(ll <= mid)
res(l, mid, n * 2, ll, rr);
if(rr > mid)
res(mid + 1, r, n * 2 + 1, ll, rr);
}
int main(int argc, char *argv[])
{
long l, t, o, i, j, a, b, c;
char ch;
while(scanf("%ld%ld%ld%*c", &l, &t, &o) != EOF)
{
mem(tr);
build(1, l, 1);
for(i = 0;i < o;i++)
{
scanf("%c", &ch);
if(ch == 'C')
{
scanf("%ld%ld%ld%*c", &a, &b, &c);
if(a < b)
addcol(1, l, 1, a, b, c);
else
addcol(1, l, 1, b, a, c);
}
else if(ch == 'P')
{
scanf("%ld%ld%*c", &a, &b);
ans = 0;
mem(vis);
if(a < b)
res(1, l, 1, a, b);
else
res(1, l, 1, b, a);
printf("%ld\n", ans);
}
}
}
return 0;
}