HDU 5861 Road(线段树)

来源:互联网 发布:乐清市知临学校招聘 编辑:程序博客网 时间:2024/05/23 16:15

n1
线
线线


代码

#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define   MAX           200005#define   MAXN          1000005#define   maxnode       205#define   sigma_size    26#define   lson          l,m,rt<<1#define   rson          m+1,r,rt<<1|1#define   lrt           rt<<1#define   rrt           rt<<1|1#define   middle        int m=(r+l)>>1#define   LL            long long#define   ull           unsigned long long#define   mem(x,v)      memset(x,v,sizeof(x))#define   lowbit(x)     (x&-x)#define   pii           pair<int,int>#define   bits(a)       __builtin_popcount(a)#define   mk            make_pair#define   limit         10000//const int    prime = 999983;const int    INF   = 0x3f3f3f3f;const LL     INFF  = 0x3f3f;const double pi    = acos(-1.0);const double inf   = 1e18;const double eps   = 1e-4;const LL    mod    = 1e9+7;const ull    mx    = 133333331;/*****************************************************/inline void RI(int &x) {      char c;      while((c=getchar())<'0' || c>'9');      x=c-'0';      while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; }/*****************************************************/int a[MAX];int sum[MAX<<2];int mini[MAX<<2],maxv[MAX<<2];int l[MAX],r[MAX];int tot;struct Edge{    int ti,x,flag;    bool operator<( const Edge&e)const{        if(ti==e.ti) return flag<e.flag;        return  ti<e.ti;    }}p[MAX*2];void pushup(int rt){    sum[rt]=sum[lrt]+sum[rrt];}void build(int l,int r,int rt){    sum[rt]=0;    mini[rt]=INF;    maxv[rt]=0;    if(l==r){        return;    }    middle;    build(lson);    build(rson);}void pushdown(int rt){    if(mini[rt]!=INF){        mini[lrt]=min(mini[lrt],mini[rt]);        mini[rrt]=min(mini[rrt],mini[rt]);    }    if(maxv[rt]!=0){        maxv[lrt]=max(maxv[lrt],maxv[rt]);        maxv[rrt]=max(maxv[rrt],maxv[rt]);    }}void update(int l,int r,int rt,int L,int R,int d){    if(L<=l&&r<=R){        mini[rt]=min(mini[rt],d);        maxv[rt]=max(maxv[rt],d);        return;    }    pushdown(rt);    middle;    if(L<=m) update(lson,L,R,d);    if(R>m) update(rson,L,R,d);}void query(int l,int r,int rt){    if(l==r){        if(mini[rt]!=INF) p[tot++]=(Edge){mini[rt],l,1};        if(maxv[rt]!=0) p[tot++]=(Edge){maxv[rt]+1,l,0};        //cout<<maxv[rt]<<" "<<mini[rt]<<" "<<l<<endl;        return ;    }    middle;    pushdown(rt);    query(lson);    query(rson);}void up(int l,int r,int rt,int pos,int d){    if(l==r){        sum[rt]+=d;        return;    }    middle;    if(pos<=m) up(lson,pos,d);    else up(rson,pos,d);    pushup(rt);}int main(){   int n,m;   while(cin>>n>>m){        for(int i=1;i<n;i++) scanf("%d",&a[i]);        build(1,n-1,1);        for(int i=1;i<=m;i++){            scanf("%d%d",&l[i],&r[i]);            if(l[i]>r[i]) swap(l[i],r[i]);            r[i]--;            update(1,n-1,1,l[i],r[i],i);        }        tot=0;        query(1,n-1,1);        sort(p,p+tot);        int tmp=0;        build(1,n-1,1);        for(int i=1;i<=m;i++){            while(tmp<tot&&p[tmp].ti<=i){                if(p[tmp].flag==1) up(1,n-1,1,p[tmp].x,a[p[tmp].x]);                else up(1,n-1,1,p[tmp].x,-a[p[tmp].x]);                tmp++;            }            printf("%d\n",sum[1]);        }   }   return 0;}
0 0
原创粉丝点击