多校训练hdu --Nice boat(线段树,都是泪)
Nice boat
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 47 Accepted Submission(s): 10
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.
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++)
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
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
给出n个数。两种操作,1 a b x 将a到b的全部数改动为x, 2 a b x将在a到b范围内的全部大于x的数改动为与x的最大公约数
范围改动值不说。在[a,b]内的全部大于x的数 与x去最大公约数,逐步向下分区间,假设该区间都被改动了,而且改动的值大于x。将改动的值于x去最大公约数,否则,继续向下分区间。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int tree[2000000] , u[2000000] ;
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b,a%b);
}
void init(int o,int x,int y)
{
if(x == y)
scanf("%I64d", &tree[o]);
else
{
int mid = (x + y) / 2 ;
init(o*2,x,mid);
init(o*2+1,mid+1,y);
}
}
void f(int o,int x,int y)
{
if( u[o] != -1 )
{
u[o*2] = u[o*2+1] = u[o] ;
u[o] = -1 ;
if(y = x + 1)
tree[o*2] = tree[o*2+1] = u[o] ;
}
}
void update1(int o,int x,int y,int l,int r,int k)
{
if( l <= x && y <= r )
u[o] = k ;
else
{
f(o,x,y) ;
int mid = (x + y) / 2 ;
if( l <= mid )
update1(o*2,x,mid,l,r,k);
if( mid+1 <= r )
update1(o*2+1,mid+1,y,l,r,k);
}
}
void update2(int o,int x,int y,int l,int r,int k)
{
if(x == y && u[o] == -1 )
{
if( tree[o] > k )
tree[o] = gcd(tree[o],k);
return ;
}
if( l <= x && y <= r && u[o] != -1 )
{
if( u[o] > k )
u[o] = gcd(u[o],k);
}
else
{
f(o,x,y) ;
int mid = (x + y) / 2 ;
if( l <= mid )
update2(o*2,x,mid,l,r,k);
if( mid+1 <= r )
update2(o*2+1,mid+1,y,l,r,k);
}
}
int sum(int o,int x,int y,int k)
{
int ans = 0 ;
if( x <= k && k <= y && u[o] != -1 )
return u[o] ;
if( x == y && x == k )
return tree[o] ;
else
{
int mid = (x + y) / 2 ;
if( k <= mid )
ans = sum(o*2,x,mid,k);
else
ans = sum(o*2+1,mid+1,y,k);
}
return ans ;
}
int main()
{
int T , n , m , t , l , r , x , i ;
scanf("%d", &T);
while(T--)
{
memset(tree,0,sizeof(tree));
memset(u,-1,sizeof(u));
scanf("%d", &n);
init(1,1,n);
scanf("%d", &m);
while(m--)
{
scanf("%d %d %d %d", &t, &l, &r, &x);
if(t == 1)
update1(1,1,n,l,r,x);
else
update2(1,1,n,l,r,x);
}
for(i = 1 ; i <= n ; i++)
{
int ans = sum(1,1,n,i);
printf("%d ", ans);
}
printf("\n");
}
return 0;
}
多校训练hdu --Nice boat(线段树,都是泪)的更多相关文章
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 2018多校第十场 HDU 6430 (线段树合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6430 题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的 ...
- HDU 4902 Nice boat --线段树(区间更新)
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- HDU 2795 Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴 ...
随机推荐
- 关于apache access log 统计的那些事儿
统计APACHE ACCESS.LOG IP访问记录 可以根据自己的需要,统计很多,每个IP访问多少个页面等等! cat access.log-20090904 |awk '{print $3}'|s ...
- mybatis-4 mybatis与spring结合使用及原理
1.创建项目maven,方便依赖下载.使用的jar如下: <dependencies> <dependency> <groupId>org.springframew ...
- pycharm 用远程环境时报错bash: line 0: cd: /home/tmp: No such file or directory
delete redundant path
- merge dict key
#!/usr/local/python # -*- coding:utf-8 -*-user_dict = {'python': 23, 'Python': 51, '机器':10, 'PYTHON' ...
- SolrCloud架构
原文链接 https://blog.csdn.net/dingzfang/article/details/42804489 1 核心概念 Collection Shard 均为逻辑上的概念 Core为 ...
- 【Codeforces 1107D】Compression
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 先把所给的压缩形式的字符串转成二进制 然后对获得的01数组做一个前缀和(a[i][j]=以(i,j)为右下角,(1,1)为左上角的矩形内的数字 ...
- 三、Oracle常用内置函数
1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from d ...
- Go map基础
package main import "fmt" //Map //创建:make(map[string]int) //获取元素: m[key] //key不存在时,获得value ...
- rac的不完全恢复
模拟rac的不完全恢复,虽然小鱼对常规的完全和不完全恢复已经轻车熟路了,还是记录一个不完全恢复完整过程记录下来. 1 首先小鱼做了一个完全备份. RMAN> backup database in ...
- python去掉BOM头的方法
今天在写批量生成身份证号造数据的时候出现了问题,其中一个是报不能转成int型,后经查找,发现是utf-8BOM头的问题. 什么是BOM? 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示 ...