题意:求矩形覆盖k次以上的区域总面积。

因为k≤10,可以在线段树上维护覆盖次数为0,...,k, ≥k的长度数量。

然后就是一个离散化以后扫描线的问题了。

离散化用的是半开半闭区间,以方便表示没有被覆盖的区间。

/*********************************************************
* --------------Alfheim-------------- *
* author AbyssalFish *
**********************************************************/
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = 3e4+;
const int maxnc = maxn*;
const int maxk = ;
int x[maxnc], y[maxnc];
int xs[maxnc], mpx[maxnc];
int rx[maxnc], ry[maxnc]; int n, nxs, lim_k; #define para int o = 1, int l = 1, int r = nxs
#define lo (o<<1)
#define ro (o<<1|1)
#define Tvar int md = (l+r)>>1;
#define lsn lo,l,md
#define rsn ro,md,r
#define insd ql<=l&&r<=qr const int ST_SIZE = <<; int sum[ST_SIZE][maxk+];
int cnt[ST_SIZE];
#define int_byte 4 void build(para)
{
cnt[o] = ;
memset(sum[o]+,,int_byte*lim_k);
sum[o][] = mpx[r]-mpx[l];
if(r-l>){
Tvar
build(lsn);
build(rsn);
}
} inline void maintain(para)
{
if(cnt[o] >= lim_k) {
memset(sum[o],,int_byte*lim_k);
sum[o][lim_k] = mpx[r]-mpx[l];
}
else if(r - l == ) {
int k = cnt[o];
sum[o][k] = mpx[r]-mpx[l];
if(k > ) sum[o][k-] = ;
if(k < lim_k) sum[o][k+] = ;
}
else {
int lc = lo, rc = ro, c = cnt[o], k;
for(k = ; k < c; k++) sum[o][k] = ;
for(k = c; k <= lim_k; k++){
sum[o][k] = sum[lc][k-c] + sum[rc][k-c];
}
for(k = lim_k - c+; k <= lim_k; k++){
sum[o][lim_k] += sum[lc][k] + sum[rc][k];
}
} } #define upara ql, qr, d
void update(int ql, int qr, int d, para)
{
if(insd){
cnt[o] += d;
}
else {
Tvar
if(ql < md) update(upara,lsn);
if(qr > md) update(upara,rsn);
}
maintain(o,l,r);
} int *c_cmp;
bool cmp_id(int i,int j){ return c_cmp[i] < c_cmp[j]; }
bool cmp_y(int i,int j){ return y[i] < y[j] || (y[i] == y[j] && (i&)>(j&) ); } //出点下标i, i % 2 = 1 int compress(int n, int *a, int *r, int *b, int *mp)
{
for(int i = ; i < n; i++){
r[i] = i;
}
c_cmp = a;
sort(r,r+n,cmp_id);
int k = ;
mp[b[r[]] = ] = a[r[]];
for(int i = ; i < n; i++){
int j = r[i];
if(a[j] != a[r[i-]]){
mp[ b[j] = ++k ] = a[j];
}
else {
b[j] = k;
}
}
return k;
} ll solve()
{
scanf("%d%d",&n,&lim_k);
int nn = n*;
for(int i = ; i < nn; i++){
scanf("%d%d",x+i,y+i);
ry[i] = i;
}
for(int i = ; i < nn; i += ){ //[)
x[i]++; y[i]++;
}
nxs = compress(*n,x,rx,xs,mpx);
build();
sort(ry,ry+nn,cmp_y);
ll res = ;
for(int i = ; i < nn; i++){
int p = ry[i], q = p^;
if(i) res += (ll)sum[][lim_k]*(y[p]-y[ry[i-]]);
if(y[p] < y[q]){
//assert((q&1) == 1);
update(xs[p],xs[q],);
}
else {
update(xs[q],xs[p],-);
} }
return res;
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
//cout<<log2(maxnc);
int T, ks = ; scanf("%d",&T);
while(++ks <= T){
printf("Case %d: %lld\n",ks,solve());
}
return ;
}

UVA 11983 Weird Advertisement的更多相关文章

  1. UVA 11983 Weird Advertisement(线段树求矩形并的面积)

    UVA 11983 题目大意是说给你N个矩形,让你求被覆盖k次以上的点的总个数(x,y<1e9) 首先这个题有一个转化,吧每个矩形的x2,y2+1这样就转化为了求N个矩形被覆盖k次以上的区域的面 ...

  2. uva 11983 Weird Advertisement 扫描线

    Weird Advertisement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/probl ...

  3. UVA 11983 Weird Advertisement --线段树求矩形问题

    题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...

  4. UVA11983 - Weird Advertisement(扫描线)

    UVA11983 - Weird Advertisement(扫描线) 题目链接 题目大意:给你n个覆盖矩形,问哪些整数点是被覆盖了k次. 题目大意:这题和hdu1542是一个题型.可是这题求的是覆盖 ...

  5. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  6. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  7. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  8. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  9. 【转】 线段树完全版 ~by NotOnlySuccess

    载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...

随机推荐

  1. ymPrompt.js消息提示组件

    转载:https://www.cnblogs.com/linzheng/archive/2010/11/15/1878058.html 使用说明: 1.在页面中引入ymPrompt.js.如:< ...

  2. C++文件读写函数之——fopen、fread和fwrite、fgetc和fputc、fgets和fputs、ftellf和fseek、rewind

    由于最近经常使用到c语言中的读写文件,所以在此总结以下,方便以后查找. 在c中,文件操作都是由库函数来实现的,主要是分为读和写两种操作,以下详细讲解以下所有有关文件操作的邯郸乎的用法: //C++写入 ...

  3. python发送微信

    申请企业微信 使用python发送信息到企业微信,同时支持python2与python3环境,需要先申请一个企业微信,然后创建应用,获取以下三个信息 企业IP.Agentid.Secret 网信为创建 ...

  4. 6-----Scrapy框架中Item Pipeline用法

    当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为, ...

  5. 搭建hadpoot平台(集群式分布)

    1.先下载VMware1.2,然后安装. 2.下载ubuntu-1.4.05-desktop-amd64.iso.下载地址:http://mirrors.aliyun.com/ubuntu-relea ...

  6. Hadoop 2.0 安装配置

    1. install jdk 2. install hadoop. 安装包hadoop-2.2.0.tar.gz存放在一个目录.并解压. 3. 修改配置文件,一般配置文件在/etc/hadoop下面. ...

  7. Javascript各种事件汇总

    https://www.cnblogs.com/diligenceday/p/4190173.html#undefined https://www.cnblogs.com/starof/p/40663 ...

  8. regular expression, grep (python, linux)

    https://docs.python.org/2/library/re.html re.match(pattern, string, flags=0)  尝试从字符串的起始位置匹配一个模式 re.s ...

  9. w3schools juerymobile

    http://www.w3schools.com/jquerymobile/jquerymobile_examples.asp <!DOCTYPE html> <html> & ...

  10. eclipse maven程序包org.junit不存在

    今天使用maven打包项目的时候出现下面的错误,提示org.junit不存在. 错误信息内容如下: [ERROR] /Users/aven/Documents/workspace/share/src/ ...