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打广告,但是现在我自己都不太好意思去看那篇文章 ...
随机推荐
- build-helper-maven-plugin
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven ...
- struts1学习
转载:https://blog.csdn.net/toyouheart/article/details/4509466
- 使用wget下载oracle jdk1.8
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com% ...
- js网页瀑布流布局
瀑布流布局思路: 1.css样式,图片的父级div样式设置为定位或者浮动 2.找出图片父级元素(box)和最外元素(main):获取box的宽度和main的宽,然后计算main容器一行能容纳多少个bo ...
- 《我在谷歌大脑见习机器学习的一年:Node.js创始人的尝试笔记》阅读笔记
文章来源:https://www.toutiao.com/i6539751003690893828/?tt_from=weixin_moments&utm_campaign=client_sh ...
- 3DSMAX 卸载
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- jemalloc报 Unsupported system page size错误
- 性能测试工具Jmeter04-脚本录制
Jmeter脚本录制:不推荐使用,这里就不介绍了 Badboy脚本录制 下载地址:http://www.badboy.com.au Badboy是一个强大的工具,旨在帮助测试和开发复杂的动态应用.Ba ...
- jQuery OCUpload一键上传文件
1 引入相关的js文件 <!--引入OCUpload的js文件,之前需要引入jQuery的js文件 --> <script type="text/javascript&qu ...
- 我使用的brackets插件
livereload atom dark theme autoprefixer auto save files on window blur beautify brackets file icons ...