HDOJ 4902 Nice boat

暴力线段树......

Nice boat

Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 340    Accepted Submission(s): 163

Problem Description

There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can’t refuse any request from the devil.
Also, this devil is looking like a very cute Loli.

Let us continue our story, z*p(actually you) defeat the ‘MengMengDa‘ party‘s leader, and the ‘MengMengDa‘ party dissolved. z*p becomes the most famous guy among the princess‘s knight party.

One day, the people in the party find that z*p has died. As what he has done in the past, people just say ‘Oh, what a nice boat‘ and don‘t care about why he died.

Since then, many people died but no one knows why and everyone is fine about that. Meanwhile, the devil sends her knight to challenge you with Algorithm contest.

There is a hard data structure problem in the contest:

There are n numbers a_1,a_2,...,a_n on a line, everytime you can change every number in a segment [l,r] into a number x(type 1), or change every number a_i in a segment [l,r] which is bigger than x to gcd(a_i,x) (type 2).

You should output the final sequence.

Input

The first line contains an integer T, denoting the number of the test cases.

For each test case, the first line contains a integers n.

The next line contains n integers a_1,a_2,...,a_n separated by a single space.

The next line contains an integer Q, denoting the number of the operations.

The next Q line contains 4 integers t,l,r,x. t denotes the operation type.

T<=2,n,Q<=100000

a_i,x >=0

a_i,x is in the range of int32(C++)

Output

For each test case, output a line with n integers separated by a single space representing the final sequence.

Please output a single more space after end of the sequence

Sample Input

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

Sample Output

16807 937186357 937186357 937186357 937186357 1 1 1624379149 1624379149 1624379149 

Author

WJMZBMR

Source

2014 Multi-University Training Contest 4

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=101000;

int n,m;

int gcd(int a,int b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

int a[maxn<<2];

void build(int l,int r,int rt)
{
	if(l==r)
	{
		scanf("%d",a+rt);
		return ;
	}
	int m=(l+r)/2;
	build(lson);build(rson);
}

void push_down(int l,int r,int rt)
{
	if(a[rt])
	{
		a[rt<<1]=a[rt<<1|1]=a[rt];
		a[rt]=0;
	}
}

void upd_1(int L,int R,int x,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		a[rt]=x;
		return ;
	}
	push_down(l,r,rt);
	int m=(l+r)/2;
	if(L<=m) upd_1(L,R,x,lson);
	if(R>m) upd_1(L,R,x,rson);
}

void upd_2(int L,int R,int x,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		if(a[rt])
		{
			if(a[rt]>x)
				a[rt]=gcd(a[rt],x);
			return ;
		}
	}
	push_down(l,r,rt);
	int m=(l+r)/2;
	if(L<=m) upd_2(L,R,x,lson);
	if(R>m) upd_2(L,R,x,rson);
}

void overtree(int l,int r,int rt)
{
	if(l==r)
	{
		printf("%d ",a[rt]);
		return ;
	}
	push_down(l,r,rt);
	int m=(l+r)/2;
	overtree(lson);
	overtree(rson);
}

int main()
{
	int t_t;
	scanf("%d",&t_t);
	while(t_t--)
	{
		scanf("%d",&n);
		build(1,n,1);
		scanf("%d",&m);
		while(m--)
		{
			int kind,left,right,xxx;
			scanf("%d%d%d%d",&kind,&left,&right,&xxx);
			if(kind==1)
			{
				upd_1(left,right,xxx,1,n,1);
			}
			else
			{
				upd_2(left,right,xxx,1,n,1);
			}
		}
		overtree(1,n,1);
		putchar(10);
	}
	return 0;
}

HDOJ 4902 Nice boat,布布扣,bubuko.com

时间: 2024-10-06 22:01:28

HDOJ 4902 Nice boat的相关文章

hdoj 4901 The Romantic Hero DP hdoj 4902 Nice boat 线段树

惨遭丽洁乱虐..这一场也是比得乱七八糟的,4902本是丽洁定义比较难的题,结果数据随机的,被许多暴力水过了..4905考察的是四边形不等式优化,但是这道题的dp方程实际上不满足该优化的条件..朴素的o(n^3)会超时,所以这题目前是没有正解了..我还写了个这题的贪心,强度挺高,可以对大概一半数据,错的误差也只有个位数,还揪出官方第五个数据..朴素dp和贪心跑这个数据都比官方数据多了1,也就证明这题不满足四边形不等式优化的条件.. http://acm.hdu.edu.cn/showproblem

HDU 4902 Nice boat(线段树)

HDU Nice boat 题目链接 题意:给定一个序列,两种操作,把一段变成x,把一段每个数字,如果他大于x,就变成他和x的gcd,求变换完后,最后的序列. 思路:线段树,每个结点多一个cover表示该位置以下区间是否数字全相同,然后每次延迟操作,最后输出的时候单点查询即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1

HDU 4902 Nice boat(线段树 区间更新)

Nice boat 大意:给你一个区间,每次可以进行两种操作,1:把区间中的数全都变成x  2:把区间中大于x的数变成gcd(a[i], x),最后输出序列. 思路:线段树成段更行,用num数组的叶子存储数据,节点当作lazy来使用. 1 #include <stdio.h> 2 const int maxn = 100005; 3 4 int num[maxn<<2]; 5 6 int gcd(int a, int b){ 7 return b?gcd(b, a%b):a; 8

HDU - 4902 Nice boat

Description There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can't refuse any re

HDU 4902 Nice boat 多校4 线段树

给定n个数 第一个操作和普通,区间覆盖性的,把l-r区间的所有值改成固定的val 第二个操作是重点,输入l r x 把l-r区间的所有大于x的数,变成gcd(a[i],x) a[i]即指满足条件的序列上的数值 最后才输出所有值 当时苦思这个地方如何优化,想着不可能单点去更新吧,但是区间gcd,不能保存下来,一来他是要>x才有效,本来聪哥想了一种先把各种x gcd一遍,最后在push下去,发现不行,就是因为他对>x才有效,你在区间就直接gcd了,那不是把不该gcd的也给搞了 还想过说先存起来所有

HDU 4902 Nice boat(数据结构-线段树)

Nice boat Problem Description There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and c

hdu 4902 Nice boat(2014多校训练第4场 1006)

Nice boat                                                                           Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description There is an old country and the king fell in love with a d

HDU 4902 Nice boat 成段线段树

操作1 的时候标记deng[rt]表示下面一段数都是与当前节点的值相同 下次操作2时直接对有deng标记的节点gcd更新 (可能还可以更简单) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #incl

多校第4场 HDU 4902 Nice boat 线段树

思路:这题比赛的时候宝哥说的思路我觉得对的,就是当是2操作的时候,先把数放到数组里,最后查询输出的时候再统一计算,不过那时敲得烂死了,debug了两天,靠-- 上午写的vector在pushDown的时候又忘了clear了,然后MLE了一早上,尼玛,还以为用的数组太大超了,然后又改成结构体,还是MLE,最后把别人的代码交上去发现没MLE,疯了一中午,最后无聊的时候才发现这个错误,尼玛--发现自己调试怎么变得这么弱了呢-- 还有一个需要注意的问题是1与2操作的处理上比较容易出错,这也是我WA了一下