HDU 4902 Nice boat

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

离线算法

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

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define EPS 1e-10
#define INF 0x3f3f3f3f
#define ll __int64

using namespace std;


template
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 
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=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%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


你可能感兴趣的:(数据结构,&,hash)