zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    要如何用[ZT]sendmessage來切換PageControl1 的TabSheet2呢
    Delphi 常用API 函数
    [ZT]如何得到其他程序的Richedit中的RTF数据
    转帖一篇关于DELPHI调试的文章AQTime
    讀取股票資料檔與指標計算方法之封裝
    GC的三代回收机制
    SQL语句的解析过程
    .Net 垃圾回收机制整理
    美国人吃了交通罚单怎么办?
    Ihttphandler,Ihttpmodule
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2559741.html
Copyright © 2011-2022 走看看