HDU 4902
数据太弱,直接让我小暴力一下就过了,一开始没注意到时间是15000MS,队友发现真是太给力了
#include <cstdio>
#include <cstring>
int n,q,a[],x[],p,l[],r[],t[];
int tree[];
void build(int l, int r, int rt)
{
tree[rt]=-;
if(l==r){
tree[rt]=;
return;
}
int m=(l+r)/;
build(l,m,rt*);
build(m+,r,rt*+);
}
void update(int x, int y, int z, int l, int r, int rt)
{
if(x<=l&&y>=r){
tree[rt]=z;
return;
}
if(tree[rt]!=-) {
tree[rt*]=tree[rt];
tree[rt*+]=tree[rt];
tree[rt]=-;
}
int m=(l+r)/;
if(x<=m) update(x,y,z,l,m,rt*);
if(y>m) update(x,y,z,m+,r,rt*+);
}
int query(int k, int l, int r, int rt)
{
if(tree[rt]!=-) return tree[rt];
int m=(l+r)/;
if(k<=m) return(query(k,l,m,rt*));
else return(query(k,m+,r,rt*+));
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
memset(tree,-,sizeof(tree));
scanf("%d",&n);
build(,n,);
for(int i=; i<=n; i++)
scanf("%d",&a[i]);
scanf("%d",&q);
for(int i=; i<=q; i++)
{
scanf("%d%d%d%d",&t[i],&l[i],&r[i],&x[i]);
if(t[i]==) update(l[i],r[i],i,,n,);
}
for(int i=; i<=n; i++){
p=query(i,,n,);
if(p) a[i]=x[p];
for(int j=p+; j<=q; j++)
if(t[j]==&&l[j]<=i&&r[j]>=i){
if(a[i]>x[j]){
int aa=a[i],bb=x[j],t=aa%bb;
while(t!=){
aa=bb;
bb=t;
t=aa%bb;
}
a[i]=bb;
}
}
}
for(int i=; i<=n; i++)
printf("%d ",a[i]);
printf("\n");
}
}
CLJ给出的正确题解:

既然gcd(a[i],x)<0.5a[i]
那么最多每个数字修改不会超过32次,
应该便是储存区间最大值以及增加判断区间内数字是否一致的flag
每次对于区间最大值>x的区间进行修改,最差情况无非是每个数字都不同,且数字都大于x,nlgn,而最多就修改32次,因此最差情况nlg^2n。
虽然证明麻烦,但是凭借感觉还是能够明白的。
实现相对简单便不再累赘。
HDU 4902的更多相关文章
- HDU 4902 (线段树)
Problem Nice boat(HDU 4902) 题目大意 维护一个序列,两种操作. 第一种操作,将一段区间[l,r]赋值为x. 第二种操作,将一段区间[l,r]中大于等于x的数与x求gcd. ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 4902 Nice boat (线段树)
Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...
- hdu 4902 线段树+逆向模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4902 出n个数,然后对这n个数进行两种操作: 如果是 1 l r x,则把 [l, r] 区间里面的每一个数都变 ...
- hdu 4902 Nice boat(线段树区间改动,输出终于序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 Problem Description There is an old country and ...
- hdu 4902 Nice boat--2014 Multi-University Training Contest 4
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4902 Nice boat Time Limit: 30000/15000 MS (Java/Othe ...
- HDU 4902 Nice boat --线段树(区间更新)
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...
- 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...
- hdu 4902 Nice boat 线段树
题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...
随机推荐
- javascript_22_for_js控制div每五个换一行
2. 3. css: <style type="text/css"> div{height: 50px; width: 50px; background: #f1161 ...
- HTML5 本地裁剪图片
下面奉上我自己写的一个demo,代码写得比较少,很多细节不会处理.如果有不得当的地方恳请指教,谢谢啦 ^_^ ^_^ 功能实现步奏: 一:获取文件,读取文件并生成url 二:根据容器的大小 ...
- 【BZOJ】【1013】【JSOI2008】球形空间产生器sphere
高斯消元 高斯消元模板题 /************************************************************** Problem: 1013 User: Tun ...
- linux使用:vi编辑器
初学linux,目前是概念多于操作,所以记录下一些操作: 编辑某个文件():vi 文件名 编辑后保存退出::wq 编辑后不保存退出: :q! 参数:-R 只读模式 -x 文件加密(vim命令下使用) ...
- PE工具
PE编辑工具 Stud_PE v. 2.4.0.1 PE工具,用来学习PE格式十分方便. http://www.cgsoftlabs.ro/ 汉化版:http://bbs.pediy.com/show ...
- PHP中如何给日期加上一个月 加一周 加一天
echo date("Y-m-d",strtotime("+1 month",strtotime("2012-02-04"))); 结果 ...
- 01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题
此文由于当时不知道NHibernate的Sava方法不是更新操作,不知道Save就是Add,造成如下荒唐的求证过程,但结论是对的 ,可报废此文,特此声明. NHibernate--Save方法: Cu ...
- Android Dock底座应用开发
很多网友可能发现部分Android手机或平板支持底座,目前比较主流的有摩托罗拉系列,中低端的Milestone和Milestone 2代均可以使用充电底座或多媒体底座,网购大概50元左右.而中高端的A ...
- First Lua function running in C
这是我在C里面跑出来的第一个Lua 文件, 纪念一下. 1.Set up envirnonment: Mac下面 Lua的src (即include) 和lib(binary)是分开的, 所以需要分别 ...
- Java Socket 使用BufferedWriter和BufferedReader要注意readLine 以及换行标志的发送
当接收的类使用的是BufferedReader,发送的类是BufferedWriter的时候,要注意发送的一行要有换行标识符. 请看下面一个例子,服务器接收不到客户端的信息. 服务器: import ...