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打广告,但是现在我自己都不太好意思去看那篇文章 ...
随机推荐
- 两个数据库通过DataTable实现差异传输
两个主要方法 /// <summary>/// 用途:/// 用源表和目标表比较,返回差异的数据(目标表为参照物)/// /// 逻辑:/// 1.合并两个表/// 2.循环合并后得到的表 ...
- hive中解析json数组
-- hive中解析json数组 select t1.status ,substr(ss.col,,) as col ,t3.evcId ,t3.evcLicense ,t3.evcAddress , ...
- 27-----BBS论坛
BBS论坛(二十七) 27.首页帖子列表布局完成 (1)apps/models.py 把帖子跟用户关联起来 class PostModel(db.Model): __tablename__ = 'po ...
- Angular JS 1.X 接口拿不到 http post 请求的数据
app上加上配置相关的代码即可 var myApp = angular.module('myApp',[]); myApp.config(function($httpProvider){ $httpP ...
- windows当代理服务器-CCProx的使用
参考 https://jingyan.baidu.com/article/0f5fb099ef3a2c6d8234ea75.html 在ubuntu下设置网络代理,选择手动方式
- spring DelegatingFilterProxy管理过滤器
安全过滤器链 Spring Security的web架构是完全基于标准的servlet过滤器的.它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有 ...
- pat1086. Tree Traversals Again (25)
1086. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- 文本框只允许输入数字.net/javascript
<input type="text" name="test" onKeyUp="test1.value=(this.value=this.val ...
- 在DataColumn.Expression把DateTime转换成String的问题
我在使用MySql5.1的数据库中,使用winForm的DataGridView要把数据库中全称DateTime格式,转换成Date格式,就是把日期时间转换成日期,不要时间.如‘2013-07-08 ...
- hdu 4276 树形m时间1进n出
http://acm.hdu.edu.cn/showproblem.php?pid=4276 一般题目是求回到原地,而这道题规定从1进n出.所以1-n这条路是必走,其他走不走无所谓. 这样很自然通过d ...