zoukankan      html  css  js  c++  java
  • hdu4553约会安排(线段树区间合并)

    链接

    poj3667的加强版 当时的题解

    这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算。

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 #include<vector>
      7 #include<cmath>
      8 #include<queue>
      9 #include<set>
     10 using namespace std;
     11 #define N 100010
     12 #define LL long long
     13 #define INF 0xfffffff
     14 const double eps = 1e-8;
     15 const double pi = acos(-1.0);
     16 const double inf = ~0u>>2;
     17 int lm[N<<2],ll[N<<2],lr[N<<2];
     18 int nlm[N<<2],nll[N<<2],nlr[N<<2];
     19 int lz[N<<2],nlz[N<<2];
     20 void up(int w,int m)
     21 {
     22     ll[w] = ll[w<<1]==(m-m/2)?ll[w<<1|1]+ll[w<<1]:ll[w<<1];
     23     lr[w] = lr[w<<1|1]==(m/2)?lr[w<<1]+lr[w<<1|1]:lr[w<<1|1];
     24     lm[w] = max(max(lm[w<<1],lm[w<<1|1]),lr[w<<1]+ll[w<<1|1]);
     25     nll[w] = nll[w<<1]==(m-m/2)?nll[w<<1|1]+nll[w<<1]:nll[w<<1];
     26     nlr[w] = nlr[w<<1|1]==(m/2)?nlr[w<<1]+nlr[w<<1|1]:nlr[w<<1|1];
     27     nlm[w] = max(max(nlm[w<<1],nlm[w<<1|1]),nlr[w<<1]+nll[w<<1|1]);
     28 }
     29 void down(int w,int m)
     30 {
     31     if(lz[w]!=-1)
     32     {
     33         ll[w<<1] = lr[w<<1] = lm[w<<1] = lz[w]?(m-m/2):0;
     34         ll[w<<1|1] = lr[w<<1|1] = lm[w<<1|1] = lz[w]?(m/2):0;
     35         lz[w<<1] = lz[w<<1|1] = lz[w];
     36         lz[w] = -1;
     37     }
     38     if(nlz[w]!=-1)
     39     {
     40         nll[w<<1] = nlr[w<<1] = nlm[w<<1] = nlz[w]?(m-m/2):0;
     41         nll[w<<1|1] = nlr[w<<1|1] = nlm[w<<1|1] = nlz[w]?(m/2):0;
     42         nlz[w<<1] = nlz[w<<1|1] = nlz[w];
     43         nlz[w] = -1;
     44     }
     45 }
     46 void build(int l,int r,int w)
     47 {
     48     if(l==r)
     49     {
     50         lm[w] = ll[w] = lr[w] = 1;
     51         nlm[w] = nll[w] = nlr[w] = 1;
     52         return ;
     53     }
     54     int m = (l+r)>>1;
     55     build(l,m,w<<1);
     56     build(m+1,r,w<<1|1);
     57     up(w,r-l+1);
     58 }
     59 void update(int a,int b,int d,int flag,int l,int r,int w)
     60 {
     61     if(a<=l&&b>=r)
     62     {
     63         if(flag)
     64         {
     65             nlm[w] = nll[w] = nlr[w] = d*(r-l+1);
     66             nlz[w] = d;
     67         }
     68         lm[w] = ll[w] = lr[w] = d*(r-l+1);
     69         lz[w] = d;
     70         return ;
     71     }
     72     down(w,r-l+1);
     73     int m = (l+r)>>1;
     74     if(a<=m)
     75     update(a,b,d,flag,l,m,w<<1);
     76     if(b>m)
     77     update(a,b,d,flag,m+1,r,w<<1|1);
     78     up(w,r-l+1);
     79 }
     80 int find(int k,int f,int l,int r,int w)
     81 {
     82     if(l==r)
     83     {
     84         return l;
     85     }
     86     int m = (l+r)>>1;
     87     down(w,r-l+1);
     88     if(f)
     89     {
     90         if(lm[w<<1]>=k)
     91         return find(k,f,l,m,w<<1);
     92         else if(lr[w<<1]+ll[w<<1|1]>=k)
     93         return m-lr[w<<1]+1;
     94         else return find(k,f,m+1,r,w<<1|1);
     95     }
     96     else
     97     {
     98         if(nlm[w<<1]>=k)
     99         return find(k,f,l,m,w<<1);
    100         else if(nlr[w<<1]+nll[w<<1|1]>=k)
    101         return m-nlr[w<<1]+1;
    102         else return find(k,f,m+1,r,w<<1|1);
    103     }
    104 }
    105 int main()
    106 {
    107     int n,kk=0,t,q;
    108     int x,y;
    109     char s[20];
    110     scanf("%d",&t);
    111     while(t--)
    112     {
    113         memset(lz,-1,sizeof(lz));
    114         memset(nlz,-1,sizeof(nlz));
    115         scanf("%d%d",&n,&q);
    116         build(1,n,1);
    117         printf("Case %d:
    ",++kk);
    118         while(q--)
    119         {
    120             scanf("%s%d",s,&x);
    121             if(s[0]=='D')
    122             {
    123                 if(lm[1]<x)
    124                 puts("fly with yourself");
    125                 else
    126                 {
    127                     int k = find(x,1,1,n,1);
    128                     update(k,k+x-1,0,0,1,n,1);
    129                     printf("%d,let's fly
    ",k);
    130                 }
    131             }
    132             else if(s[0]=='N')
    133             {
    134                 if(lm[1]>=x)
    135                 {
    136                     int k = find(x,1,1,n,1);
    137                     printf("%d,don't put my gezi
    ",k);
    138                     update(k,k+x-1,0,1,1,n,1);
    139                 }
    140                 else if(nlm[1]>=x)
    141                 {
    142                     int k = find(x,0,1,n,1);
    143                     printf("%d,don't put my gezi
    ",k);
    144                     update(k,k+x-1,0,1,1,n,1);
    145                 }
    146                 else puts("wait for me");
    147             }
    148             else
    149             {
    150                 scanf("%d",&y);
    151                 update(x,y,1,1,1,n,1);
    152                 printf("I am the hope of chinese chengxuyuan!!
    ");
    153             }
    154         }
    155     }
    156     return 0;
    157 }
    View Code
  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/shangyu/p/3760086.html
Copyright © 2011-2022 走看看