• 【UVa】11983 Weird Advertisement


      1 #include<cstdio>
      2 #include<algorithm>
      3 typedef long long LL;
      4 #define MAXN 30010
      5 using namespace std;
      6 int n,k;
      7 struct Seg
      8 {
      9     int left,right,high,flag;
     10     friend bool operator<(Seg a,Seg b)
     11     {
     12         if(a.high==b.high)
     13             return a.flag<b.flag;
     14         return a.high<b.high;
     15     }
     16 };
     17 struct node
     18 {
     19     int cover,dp[11];
     20 };
     21 node tree[MAXN<<3];
     22 Seg p[MAXN<<1];
     23 int X[MAXN<<1];
     24 void Build(int L,int R,int rt)
     25 {
     26     int i;
     27     for(tree[rt].cover=i=0;i<=k;i++)
     28         tree[rt].dp[i]=0;
     29     if(L!=R)
     30     {
     31         int mid=(L+R)>>1;
     32         Build(L,mid,rt<<1);
     33         Build(mid+1,R,rt<<1|1);
     34     }
     35 }
     36 void PushUp(int L,int R,int rt)
     37 {
     38     int i;
     39     if(tree[rt].cover)
     40     {
     41         for(i=1;i<=k;i++)
     42         {
     43             if(tree[rt].cover>=i)
     44                 tree[rt].dp[i]=X[R+1]-X[L];
     45             else if(L==R)
     46                 tree[rt].dp[i]=0;
     47             else
     48                 tree[rt].dp[i]=tree[rt<<1].dp[i-tree[rt].cover]+tree[rt<<1|1].dp[i-tree[rt].cover];
     49         }
     50     }
     51     else
     52     {
     53         for(i=1;i<=k;i++)
     54         {
     55             if(L!=R)
     56                 tree[rt].dp[i]=tree[rt<<1].dp[i]+tree[rt<<1|1].dp[i];
     57             else
     58                 tree[rt].dp[i]=0;
     59         }
     60     }
     61 }
     62 void Update(int x,int y,int flag,int L,int R,int rt)
     63 {
     64     if(x<=L&&R<=y)
     65     {
     66         tree[rt].cover+=flag;
     67         PushUp(L,R,rt);
     68     }
     69     else
     70     {
     71         int mid=(L+R)>>1;
     72         if(x<=mid)
     73             Update(x,y,flag,L,mid,rt<<1);
     74         if(y>mid)
     75             Update(x,y,flag,mid+1,R,rt<<1|1);
     76         PushUp(L,R,rt);
     77     }
     78 }
     79 int main()
     80 {
     81     LL ans;
     82     int t,ca=1;
     83     int i,x1,y1,x2,y2,cnt;
     84     scanf("%d",&t);
     85     while(t--)
     86     {
     87         scanf("%d%d",&n,&k);
     88         for(ans=cnt=i=0;i<n;i++)
     89         {
     90             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
     91             x2++;
     92             y2++;
     93             p[cnt].left=x1;
     94             p[cnt].right=x2;
     95             p[cnt].high=y1;
     96             p[cnt].flag=1;
     97             X[cnt++]=x1;
     98             p[cnt]=p[cnt-1];
     99             p[cnt].high=y2;
    100             p[cnt].flag=-1;
    101             X[cnt++]=x2;
    102         }
    103         sort(X,X+cnt);
    104         sort(p,p+cnt);
    105         n=unique(X,X+cnt)-X;
    106         Build(0,n-2,1);
    107         for(i=0;i<cnt;i++)
    108         {
    109             x1=lower_bound(X,X+n,p[i].left)-X;
    110             y1=lower_bound(X,X+n,p[i].right)-X;
    111             Update(x1,y1-1,p[i].flag,0,n-2,1);
    112             if(i+1<cnt)
    113                 ans+=(p[i+1].high-p[i].high)*(LL)tree[1].dp[k];
    114         }
    115         printf("Case %d: %lld\n",ca++,ans);
    116     }
    117     return 0;
    118 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    Microsoft To-Do无法同步问题 ke xue上网导致
    学习希尔排序
    查找docker无法启动的原因
    挂载只读分区为可读写
    批量重建索引脚本
    frp nginx 80 端口共用
    vue部署nginx 404
    阿里云服务器,数据库热备、暖备、冷备实战-镜像篇(域环境下配置)
    码农老婆的网店
    Wcf调用方式
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2559741.html
Copyright © 2020-2023  润新知