多校中的线段树,看题解出题人的意思这道题目应该不简单。但是好像数据比较弱啊。竟然可以水过去啊、、、
用一个标记,标记当前这一段是否被更新过,如果更新过就为1,否则为0。
一定要注意最后一个空格输出。
1 10 16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 10 1 3 6 74243042 2 4 8 16531729 1 3 4 1474833169 2 1 8 1131570933 2 7 9 1505795335 2 3 7 101929267 1 4 10 1624379149 2 2 8 2110010672 2 6 7 156091745 1 2 5 937186357
16807 937186357 937186357 937186357 937186357 1 1 1624379149 1624379149 1624379149
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) )
#define Mod 1000000007
#define LL long long
using namespace std;
const int maxn = 100010;
struct node
{
int l, r;
int flag;
LL x;
} f[maxn*4];
LL num[maxn];
void Bulid(int l, int r, int site)
{
f[site].l = l;
f[site].r = r;
f[site].flag = 0;
if(l == r)
{
f[site].x = num[l];
f[site].flag = 1;
return;
}
int mid = (l+r)/2;
Bulid(l, mid, site<<1);
Bulid(mid+1, r, site<<1|1);
}
void Output(int l, int r, int site)
{
if(l == r)
{
printf("%I64d ",f[site].x);
return;
}
if(f[site].flag)
{
f[site<<1].flag = f[site<<1|1].flag = 1;
f[site<<1].x = f[site<<1|1].x = f[site].x;
}
int mid = (l+r)/2;
Output(l, mid, site<<1);
Output(mid+1, r, site<<1|1);
}
void Change(int l, int r, LL x, int site)
{
if(l == f[site].l && r == f[site].r)
{
f[site].x = x;
f[site].flag = 1;
return;
}
if(f[site].flag)
{
f[site<<1].flag = f[site<<1|1].flag = 1;
f[site<<1].x = f[site<<1|1]. x = f[site].x;
f[site].flag = 0;
}
int mid = (f[site].l+f[site].r)/2;
if(r <= mid) Change(l, r, x, site<<1);
else if(l > mid) Change(l, r, x, site<<1|1);
else
{
Change(l, mid, x, site<<1);
Change(mid+1, r, x, site<<1|1);
}
}
void Updata(int l, int r, LL x, int site)
{
if(f[site].l == l && f[site].r == r && f[site].flag)
{
if(f[site].x > x)
f[site].x = __gcd(f[site].x, x);
return;
}
if(f[site].flag)
{
f[site<<1].flag = f[site<<1|1].flag = 1;
f[site<<1].x = f[site<<1|1]. x = f[site].x;
f[site].flag = 0;
}
int mid = (f[site].l+f[site].r)/2;
if(r <= mid) Updata(l, r, x, site<<1);
else if(l > mid) Updata(l, r, x, site<<1|1);
else
{
Updata(l, mid, x, site<<1);
Updata(mid+1, r, x, site<<1|1);
}
}
int main()
{
int T;
cin >>T;
int n, m;
while(T--)
{
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%I64d",&num[i]);
Bulid(1, n, 1);
scanf("%d",&m);
int x, l, r;
LL xx;
while(m--)
{
scanf("%d %d %d %I64d",&x, &l, &r, &xx);
if(x == 1) Change(l, r, xx, 1);
else Updata(l, r, xx, 1);
}
Output(1, n, 1);
puts("");
}
return 0;
}
HDU 4902 Nice boat(线段树),布布扣,bubuko.com
原文:http://blog.csdn.net/xu12110501127/article/details/38331583