题目链接: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. 发布Android开源库,看这个文章就够了!

    最近在Flipboard实习期间写了一个轮播工具,技术上没什么难点,不过动画效果还是不错的,决定改改代码写个库开源出去.项目地址:http://github.com/chengdazhi/Decent ...

  2. 粗谈CDN

    CDN:内容分发网络(content delivery network) 1.DNS解析到最快(有可能是地理上最近,也有可能是地理上远但是链路最好)的CDN缓存设备 2.从CDN获取已经缓存的资源 3 ...

  3. Kubernetes - 配置Nginx-Ingress 作为服务发现

    添加 Kubernetes ConfigMap配置来自定义端口与服务的映射关系 配置文件, 有二个在默认空间下web服务和api服务分别映射到自定义端口 9001, 9002 apiVersion: ...

  4. javascript 回车实现 tab 切换功能完美解决

    最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过excel录入数据的现在, 在网页上需要实现excel 那样的回车换行的功能在网上找了有关这方面的问题但 ...

  5. Elasticsearch教程(三),IK分词器安装 (极速版)

    如果只想快速安装IK,本教程管用.下面看经过. 简介: 下面讲有我已经打包并且编辑过的zip包,你可以在下面下载即可. 当前讲解的IK分词器 包的 version 为1.8. 一.下载zip包. 下面 ...

  6. red5截屏

    在red5-web.xml添加 <bean id="rtmpSampleAccess" class="org.red5.server.stream.RtmpSamp ...

  7. TCP/IP详解 卷一(第十一章 UDP:用户数据报协议)

    UDP是一个简单的面向数据报的运输层协议. UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地. UDP首部的个字段如下图所示

  8. C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 &amp;&amp; 并查集方法)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. 把数据库里面的stu表中的数据,导出到excel中

    # 2.写代码实现,把我的数据库里面的stu表中的数据,导出到excel中 #编号 名字 性别 # 需求分析:# 1.连接好数据库,写好SQL,查到数据 [[1,'name1','男'],[1,'na ...

  10. mysql学习笔记(编辑中)

    1.LAST_INSERT_ID()依赖于当前服务器会话中自动产生的序列编号.同时括号中也可以赋值更新数据,eg: update test set id = last_insert_id(id+10) ...