hdu 4614 선분 트 리 + 2 분
구 와 조작 은 선분 트 리 로 해결 할 수 있 습 니 다. 조작 1 의 시작 위 치 는 2 분 구 를 통 해 구 할 수 있 습 니 다.
#include
#include
#include
#include
#include
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define maxn 100009
using namespace std;
int n, m, a[maxn * 8], is[8 * maxn];
void build (int x, int l, int r)
{
if (l == r)
{
a[x] = 1;
is[x] = -1;
return;
}
int mid = (l + r) >> 1;
build (2 * x, l, mid);
build (2 * x + 1, mid + 1, r);
a[x] = a[2 * x] + a[2 * x + 1];
is[x] = -1;
return;
}
int ask (int x, int l, int r, int la, int ra)
{
if (l > ra || r < la)
return 0;
if (la <= l && r <= ra)
{
if (is[x] == 0)
return 0;
if (is[x] == 1)
return r - l + 1;
return a[x];
}
int mid = (l + r) >> 1;
if (is[x] != -1)
{
is[2 * x] = is[2 * x + 1] = is[x];
a[2 * x] = is[x] * (mid - l + 1);
a[2 * x + 1] = is[x] * (r - mid);
a[x] = is[x] * (r - l + 1);
is[x] = -1;
}
return ask (2 * x, l, mid, la, ra) + ask (2 * x + 1, mid + 1, r, la, ra);
}
void set (int x, int l, int r, int la, int ra, int color)
{
//printf ("========== set (%d %d) %d %d ==%d
", l, r, la, ra, color);
if (l > ra || r < la)
return;
if (la <= l && r <= ra)
{
is[x] = color;
a[x] = color * (r - l + 1);
return;
}
int mid = (l + r) >> 1;
if (is[x] != -1)
{
is[2 * x] = is[2 * x + 1] = is[x];
a[2 * x] = is[x] * (mid - l + 1);
a[2 * x + 1] = is[x] * (r - mid);
a[x] = is[x] * (r - l + 1);
is[x] = -1;
}
set (2 * x, l, mid, la, ra, color);
set (2 * x + 1, mid + 1, r, la, ra, color);
a[x] = a[2 * x] + a[2 * x + 1];
}
void print (int x, int l, int r)
{
// printf (" %d (%d, %d) == %d -> %d
", x, l, r, a[x], is[x]);
if (l == r)
return;
int mid = (l + r) >> 1;
print (2 * x, l, mid);
print (2 * x + 1, mid + 1, r);
}
void debug ()
{
printf ("==================================================
");
print (1, 1, n);
}
int main ()
{
int ti;
cin >> ti;
rep (f1, 1, ti)
{
cin >> n >> m;
build (1, 1, n);
while (m--)
{
//printf (" (ask 1-n) %d
", ask (1, 1, n, 1, n));
//debug ();
int col, x, y;
scanf ("%d%d%d", &col, &x, &y);
if (col == 1)
{
x++;
int Max = ask (1, 1, n, x, n), L, R;
//printf ("Max -----------------------------------%d
", Max);
if (Max == 0)
{
printf ("Can not put any one.
");
continue;
}
int l = x, r = n;
while (l <= r)
{
int mid = (l + r) >> 1;
int p = ask (1, 1, n, x, mid);
if (p == 1)
L = mid;
if (p >= 1)
r = mid - 1;
else
l = mid + 1;
}
/*if (Max <= y)
{
printf ("%d %d
", L - 1, n - 1);
set (1, 1, n, L, n, 0);
continue;
}*/
//last
l = L, r = n;
while (l <= r)
{
int mid = (l + r) >> 1;
int p = ask (1, 1, n, L, mid);
//printf ("er fen %d ---- %d
", mid, p);
if (p == min (y, Max) )
R = mid;
if (p >= min (y, Max) )
r = mid - 1;
else
l = mid + 1;
}
printf ("%d %d
", L - 1, R - 1);
set (1, 1, n, L, R, 0);
//printf ("ask ------ %d
", ask (1, 1, n, L, R));
}
else
{
x++, y++;
printf ("%d
", y - x + 1 - ask (1, 1, n, x, y));
set (1, 1, n, x, y, 1);
}
}
printf ("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
|NOIOJ|2분|04: 네트워크 관리자심판위원회는 인터넷 라인을 구매하기 위해 현지의 한 인터넷 솔루션 제공 업체에 연락하여 일정한 수량의 등장망 라인을 제공할 수 있도록 요구했다.심판위원회는 네트워크가 길어질수록 좋아져 선수들 사이의 거리가 가능한 한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.