HDU 4902 Nice boat

来源:互联网 发布:java log4j用法 编辑:程序博客网 时间:2024/05/22 13:02

HDU 4902 Nice boat2014年多校联合第四场

离线算法

在读入的同时,用线段树维护区间最大的 1 操作的脚标,

再按照点查询,从该点最后一次 1 操作位置求gcd

#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <climits>#include <complex>#include <fstream>#include <cassert>#include <cstdio>#include <bitset>#include <vector>#include <deque>#include <queue>#include <stack>#include <ctime>#include <set>#include <map>#include <cmath>#define EPS 1e-10#define INF 0x3f3f3f3f#define ll __int64using namespace std;template<class T>inline bool read(T &n){    T x = 0, tmp = 1; char c = getchar();    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();    if(c == EOF) return false;    if(c == '-') c = getchar(), tmp = -1;    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();    n = x*tmp;    return true;}template <class T>inline void write(T n) {    if(n < 0) {        putchar('-');        n = -n;    }    int len = 0,data[20];    while(n) {        data[len++] = n%10;        n /= 10;    }    if(!len) data[len++] = 0;    while(len--) putchar(data[len]+48);}//-----------------------------------------------------------------------const int MAXN=100010;struct Piont{    int l,r;    int po;}arr[8*MAXN];int lazy[8*MAXN];struct Node{    int t,l,r;    ll x;}a[MAXN];ll num[MAXN];ll gcd(ll a,ll b){    return b==0?a:gcd(b,a%b);}void pushdown(int idx){    if(lazy[idx])    {        int lc=idx<<1,rc=idx<<1|1;        if(arr[idx].po>arr[lc].po)            arr[lc].po=arr[idx].po,lazy[lc]=1;        if(arr[idx].po>arr[rc].po)            arr[rc].po=arr[idx].po,lazy[rc]=1;        lazy[idx]=0;    }}void build(int idx,int l,int r){    int lc=idx<<1,rc=idx<<1|1;    arr[idx].l=l,arr[idx].r=r;    arr[idx].po=0;    if(l==r)    {        arr[idx].po=0;        return;    }    int mid=l+(r-l)/2;    build(lc,l,mid);    build(rc,mid+1,r);}void update(int idx,int L,int R,int v){    int lc=idx<<1,rc=idx<<1|1;    int l=arr[idx].l,r=arr[idx].r;    if(L<=l && r<=R)    {        arr[idx].po=v;lazy[idx]=1;        return;    }    pushdown(idx);    if(l<r)    {        int mid=l+(r-l)/2;        if(mid>=L)            update(lc,L,R,v);        if(mid<=R)            update(rc,L,R,v);    }}int query(int idx,int x){    int lc=idx<<1,rc=idx<<1|1;    int l=arr[idx].l,r=arr[idx].r;    if(x<=l&&x>=r)    {        return arr[idx].po;    }    pushdown(idx);    int mid=l+(r-l)/2;    if(mid>=x)        return query(lc,x);    if(mid<x+1)        return query(rc,x);}int main(){    int T,n,m,t,l,r,x;    read(T);    while(T--)    {        read(n);        for(int i=1;i<=n;i++)            read(num[i]);        build(1,1,n);        read(m);        for(int i=1;i<=m;i++)        {            read(a[i].t),read(a[i].l),read(a[i].r),read(a[i].x);            if(a[i].t==1)                update(1,a[i].l,a[i].r,i);        }/*        for(int i=0;i<=2*n;i++)            printf("%d (%d->%d) %d: lazy[%d]\n",i,arr[i].l,arr[i].r,arr[i].po,lazy[i]);*/        for(int i=1;i<=n;i++)        {            int j=query(1,i);            if(a[j].t==1)                num[i]=a[j].x;            for(;j<=m;j++)                if(a[j].t==2&&a[j].x<num[i]&&a[j].l<=i&&i<=a[j].r)                    num[i]=gcd(a[j].x,num[i]);        }        for(int i=1;i<=n;i++)        {            write(num[i]);putchar(' ');        }        putchar('\n');    }    return 0;}


0 0