UVA 11983 Weird Advertisement
题意:求矩形覆盖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的更多相关文章
- UVA 11983 Weird Advertisement(线段树求矩形并的面积)
UVA 11983 题目大意是说给你N个矩形,让你求被覆盖k次以上的点的总个数(x,y<1e9) 首先这个题有一个转化,吧每个矩形的x2,y2+1这样就转化为了求N个矩形被覆盖k次以上的区域的面 ...
- uva 11983 Weird Advertisement 扫描线
Weird Advertisement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/probl ...
- UVA 11983 Weird Advertisement --线段树求矩形问题
题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...
- UVA11983 - Weird Advertisement(扫描线)
UVA11983 - Weird Advertisement(扫描线) 题目链接 题目大意:给你n个覆盖矩形,问哪些整数点是被覆盖了k次. 题目大意:这题和hdu1542是一个题型.可是这题求的是覆盖 ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- 《完全版线段树》——notonlysuccess
转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...
随机推荐
- 字符串 Instant 互转
Instant inst = Instant.now(); System.out.println(inst);//2018-05-15T02:27:09.909Z String s1 = s.subs ...
- 轻量级RPC框架-motan
https://github.com/weibocom/motan/wiki/zh_quickstart#%E7%AE%80%E5%8D%95%E8%B0%83%E7%94%A8%E7%A4%BA%E ...
- vue(1)安装
1.安装node.js(https://nodejs.org/en/),我安装的是 v10.15.1 1).在nodejs安装路径下,新建node_global和node_cache两个文件夹 2). ...
- TCP/IP协议中几个缩写词的含义 MSL、TTL和RTT 报文最大生存时间 跳数(即生存时间) cs往返时间 MSL要大于TTL知道为什么吗?
MSL.TTL和RTT简介 1.MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃.因为 ...
- Turing Year 2012
Turing LectureFrom cryptanalysis to cognitive neuroscience - a hidden legacy of Alan Turinghttp://co ...
- RTT设备与驱动之串口
有一般收发.中断方式.DMA方式: rt_device_t rt_device_find(const char* name); rt_err_t rt_device_open(rt_device_t ...
- 断路器hystrix
分布式系统中不可避免的会出现一些故障,因为服务间错综复杂的依赖关系,有时候一个服务出现问题后,会导致依赖于它的服务出现远程调度的线程受阻,给服务造成压力,当然同样的,祖父级调用者(暂且这么叫吧)当然也 ...
- poj1092. To Buy or Not to Buy (20)
1092. To Buy or Not to Buy (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- GOPS 2018全球运维大会上海站 参会感悟梳理
今天遇到很多优秀的讲师.业界的大伽,很开心 现在把get到的信息梳理一下:(1)想解决性能问题,一定要在缓存上下功夫:[nginx上有好多文章可以做,真是博大精深呢<深入理解Nginx:模块开发 ...
- linux创建用户与删除用户及问题解决(ubuntu)
创建的用户不正确,一直在删除创建,发现了挺多问题也学到了一些东西如下是我的总结. (root用户设置: 由于ubtun系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在终端 ...