题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902

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

题目意思:

给出长度为n的数组,m个操作。操作有两种:1、1, l, r, x即把[l,r]段的元素全变为x。2、2,l,r,x即把[l,r]段的大于x的元素全变成该元素与x的最大公约数。

代码例如以下:

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
const int maxn = 111111;
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define lson l, mid, ls
#define rson mid+1, r, rs
//num数组表示该区间是否都是同一个数,假设是num就等于这个数,否则等-1
int num[maxn << 2];
//flag标记,表示该区间是否应该被纯色化(变成一个数)。
int flag[maxn << 2];
//mmax数组表示该区间的最大值,由于gcd仅仅对该区间比x大的起作用
int mmax[maxn << 2];
int GCD(int a, int b)
{
return a ? GCD(b%a,a) : b;
}
void Pushup(int rt)
{
if(num[ls] == num[rs])
num[rt] = num[ls];
else
num[rt] = -1;
mmax[rt] = max(mmax[ls], mmax[rs]);
} void Pushdown(int rt)
{
if(flag[rt] != -1)
{
flag[ls] = flag[rs] = flag[rt];
mmax[ls] = mmax[rs] = mmax[rt];
num[ls] = num[rs] = num[rt];
flag[rt] = -1;
}
} void build(int l, int r, int rt)
{
flag[rt] = -1;
if(l == r)
{
scanf("%d",&num[rt]);
mmax[rt] = num[rt];//初始化
return ;
}
int mid = (l+r) >> 1;
build(lson);
build(rson);
Pushup(rt);
} void update(int L, int R, int x, int l, int r, int rt)
{
if(L <= l && r <= R)
{
flag[rt] = num[rt] = mmax[rt] = x;
return ;
}
Pushdown(rt);
int mid = (l+r) >> 1;
if(L <= mid)
update(L, R, x, lson);
if(mid < R)
update(L, R, x, rson);
Pushup(rt);
} void modify(int L, int R, int x, int l, int r, int rt)
{
if(L <= l && r <= R && num[rt] > x)
{
flag[rt] = num[rt] = mmax[rt] = GCD(num[rt], x);
return ;
}
Pushdown(rt);
int mid = (l+r) >> 1;
if(L <= mid && mmax[ls] > x)
modify(L, R, x, lson);
if(mid < R && mmax[rs] > x)
modify(L, R, x, rson);
Pushup(rt);
} void Cout(int l, int r, int rt)
{
if(l == r)
{
printf("%d ",num[rt]);
return ;
}
Pushdown(rt);
int mid = (l+r) >> 1;
Cout(lson);
Cout(rson);
} int main()
{
int T;
int R, L;
int n, m;
int op,l, r, x;
int i, j, k;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&m);
for(i = 0; i < m; i++)
{
scanf("%d%d%d%d",&op,&l,&r,&x);
if(op == 1)
{
update(l, r, x, 1, n, 1);
}
else if(op == 2)
{
modify(l, r, x, 1, n, 1);
}
}
Cout(1, n, 1);
printf("\n");
}
return 0;
}

hdu 4902 Nice boat(线段树区间改动,输出终于序列)的更多相关文章

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

    题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...

  2. hdu 4902 Nice boat 线段树

    题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...

  3. HDU 4902 Nice boat 线段树+离线

    据说暴力也过了.还傻逼地写了这么长. . . #include <stdio.h> #include <string.h> #include <math.h> #i ...

  4. HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举

    HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...

  5. hdu 1540 Tunnel Warfare(线段树区间统计)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. HDU 3577 Fast Arrangement (线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车 ...

  7. hdu 3397 Sequence operation (线段树 区间合并 多重标记)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意: 给你一串01串,有5种操作 0. 区间全部变为0 1.区间全部变为1 2.区间异或 3.询问 ...

  8. hdu 1698+poj 3468 (线段树 区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...

  9. SPOJ D-query && HDU 3333 Turing Tree (线段树 && 区间不相同数个数or和 && 离线处理)

    题意 : 给出一段n个数的序列,接下来给出m个询问,询问的内容SPOJ是(L, R)这个区间内不同的数的个数,HDU是不同数的和 分析 : 一个经典的问题,思路是将所有问询区间存起来,然后按右端点排序 ...

  10. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

随机推荐

  1. mysql 将多个查询结果合并成一行

    mysql中的多行查询结果合并成一个 SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND ...

  2. ISP模块之RAW DATA去噪(二)--BM3D算法

    在正式开始本篇文章之前,让我们一起回顾一下CFA图像去噪的一些基本思路与方法.接着我会详细地和大家分享自己学习理解的BM3D算法,操作过程,它的优缺点,最后会给出算法效果图供参考. 在ISP模块里,研 ...

  3. 2017.7.21 Linux中ELK服务后台运行方式

    通过 2017.7.18 linux下ELK环境搭建 搭建好服务于之后,一旦按下Ctrl+C或者退出登录会话,服务的进程就随之停止了.要长期在后台运行此程序,有几种方式: 1 nohup 输入Ctrl ...

  4. EffectiveJava(1) 构造器和静态工厂方法

    构造器和静态工厂方法 **构造器是大家创建类时的构造方法,即使不显式声明,它也会在类内部隐式声明,使我们可以通过类名New一个实例. 静态方法是构造器的另一种表现形式** 主题要点:何时以及如何创建对 ...

  5. JAVA Eclipse如何导出APK程序

    为了最快的导出程序,直接导出未签名的APK   但是大部分手机不允许安装未经签名的程序   导出签名的项目   设置密码,后面的都可以随便设置   这样最后生成的APK就可以直接双击完成安装     ...

  6. PS如何使用自定义画笔

    1 没有杂色的白背景不用抠图,GIF格式的透明背景不用抠图,有背景但是不想抠图都可以直接定义为画笔.先选中需要定义的画笔(得到选区),然后单击编辑-定义画笔预设.   2 随后就可以找到我们的画笔工具 ...

  7. vue笔记二

    七.列表渲染 1.示例 <ul id="example-2"> <li v-for="(item, index) in items"> ...

  8. Oracle PLSQL通过SMTP发送E-MAIL邮件代码

    登录到SMTPserver发送邮件,支持HTML CREATE OR REPLACE PROCEDURE send_mail(        p_recipient VARCHAR2, -- 邮件接收 ...

  9. js 导入json配置文件

    import AA from './menu.json' console.log(AA) 匹配好路径

  10. Spark on Intellij IDEA

    添加scala插件 如果网络有问题,可以手动下载插件安装包(http://plugins.jetbrains.com/plugin/?id=1347),在上面选择“Install plugin fro ...