题意:给定一个正整数序列,操作是1.区间赋值,2.区间大于x的数与x取gcd,最后输出操作后的序列

用平衡树维护相同数组成的连续段,每次操作至多增加两个连续段,操作2记录一下区间最小值然后暴力修改,每个数在被修改次数不会超过质因数个数,于是均摊单次修改复杂度在log^2(n)左右

#include<bits/stdc++.h>
char buf[],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int gcd(int a,int b){
for(int c;b;c=a,a=b,b=c%b);
return a;
}
void mins(int&a,int b){if(a<b)a=b;}
int T;
struct node{
int l,r,x,mx,rnd;
node*lc,*rc;
void pr(){
if(!this)return;
lc->pr();
for(int i=l;i<=r;++i)printf("%d ",x);
rc->pr();
}
void up(){
mx=x;
if(lc)mins(mx,lc->mx);
if(rc)mins(mx,rc->mx);
}
void gcds(int v){
if(!this||mx<=v)return;
if(x>v)x=gcd(x,v);
lc->gcds(v);
rc->gcds(v);
up();
}
}ns[],*ss[],*rt;
struct drt{node*lc,*rc;};
int sp=;
node*_new(int l,int r,int x){
node*w=ss[--sp];
w->l=l;w->r=r;w->mx=w->x=x;
return w;
}
void del(node*&w){
if(!w)return;
del(w->lc);
del(w->rc);
ss[sp++]=w;
w=;
}
node*merge(node*a,node*b){
if(!a)return b;
if(!b)return a;
if(a->rnd>b->rnd){
a->rc=merge(a->rc,b);
a->up();
return a;
}
b->lc=merge(a,b->lc);
b->up();
return b;
}
drt split(node*w,int x){
if(!w)return (drt){,};
drt m;
if(w->l>=x){
m=split(w->lc,x);
w->lc=m.rc;
m.rc=w;
w->up();
return m;
}
if(w->r<x){
m=split(w->rc,x);
w->rc=m.lc;
m.lc=w;
w->up();
return m;
}
node*u=m.lc=_new(w->l,x-,w->x);
u->lc=w->lc;
u->up();
m.rc=w;
w->lc=;w->l=x;
w->up();
return m;
}
int main(){
fread(buf,,sizeof(buf),stdin);
srand();
for(int i=;i<=;++i)(ss[sp++]=ns+i)->rnd=rand();
for(T=_();T;--T){
int n=_();
rt=;
for(int i=;i<=n;++i){
node*w=_new(i,i,_());
rt=merge(rt,w);
}
for(int q=_(),o,l,r,x;q;--q){
o=_();l=_();r=_();x=_();
if(o==){
drt a=split(rt,l);
drt b=split(a.rc,r+);
del(b.lc);
node*w=_new(l,r,x);
rt=merge(a.lc,merge(w,b.rc));
}else{
drt a=split(rt,l);
drt b=split(a.rc,r+);
b.lc->gcds(x);
rt=merge(a.lc,merge(b.lc,b.rc));
}
}
rt->pr();
putchar();
del(rt);
}
return ;
}

bzoj 3867: Nice boat的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  3. Lesson 20 One man in a boat

    Text Fishing is my favourite sport. I often fish for hours without catching anything. But this does ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. bzoj2700

    题解: dp dp[i][j]表示i个红,j个绿的最小代价 然后再加上两位k,l,表示k个红连,l个绿连 然后转移 代码: #include<bits/stdc++.h> using na ...

  2. bzoj1269

    题解: splay维护 只不过变成了字符串 代码: #include<bits/stdc++.h> using namespace std; +,BS= + ,BN= + ; ,head, ...

  3. js 删除数组的指定元素

    //为数组对象增加相应的的方法,直接调用数组的removeByValue方法即可删除指定元素 Array.prototype.removeByValue = function (val) { for ...

  4. Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结

    知识背景: 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式.英语叫做IPv4 numbers-and-dots notation. 如果把210.25.132.181转换 ...

  5. ubuntu16扩展屏设置

    new ubuntu system setting - Expansion screen settings. 1,System Settings–>Displays 1,set big scre ...

  6. Android程序员学WEB前端(1)-HTML(1)-标准结构常用标签-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522043觉得博文有用,请点赞,请评论,请关注,谢谢!~ 8月份了,换工作有2个月了 ...

  7. Linux下的Maven安装与配置

    关于Maven的介绍可以参考:Maven详解 这篇在原理上讲得比较详细,在安装上是windows版本的,这里补上linux下的安装和配置: 1.下载maven安装包 http://maven.apac ...

  8. Swift GCD

    var queue: dispatch_queue_t = dispatch_get_main_queue()// 主线程 queue = dispatch_get_global_queue(DISP ...

  9. Android 编程 高德地图 (实现显示地图以及定位功能)

    本文参考文章: http://www.apkbus.com/blog-904057-63610.html 本人实现的 定位代码:(具体配置省略,可见参考文章) package com.example. ...

  10. Python 之文件上传

    基于form表单提交 # 需要指定form-data,不能直接拼键值对 可以指定name照片存在位置 views.py from django.shortcuts import render,redi ...