题意:求矩形覆盖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 ;
}

最新文章

  1. C# 验证类(使用正则表达式 验证文本框)
  2. 【开源】玩的就是开源 - DevFw
  3. sqldeveloper
  4. 【OpenStack】OpenStack系列15之OpenStack高可用详解
  5. selenium webdriver python 元素操作
  6. Node.Buffer
  7. maven project module 依赖项目创建 ---转
  8. JAVA远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
  9. 为什么需要把页面放在WEB-INF文件夹下面?
  10. Leetcode:234 回文链表
  11. 基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化
  12. react与fetch
  13. 最新Android &amp; iOS设计尺寸规范
  14. Images之Dockerfile中的命令1
  15. Python Django 之 Model
  16. mongodb二进制安装与yum安装
  17. django 建立一个简单的应用
  18. 查看哪个用户、IP、什么时间登陆过服务器
  19. Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)
  20. fiddler不经意的功能

热门文章

  1. Android MVP模式实现组件和业务逻辑分离
  2. sql server 字符串转table
  3. bootstrap多选框
  4. oracle Clob类型转换成String类型
  5. 导入AppiumLibrary报错: ImportError: cannot import name &#39;InvalidArgumentException
  6. JS 中Math.ceil()、Math.floor()和Math.round()的区别
  7. wget访问tomcat管理界面
  8. Mybatis学习笔记1 - Hello World
  9. Unity Screen Screen.SetResolution 设置分辨率
  10. UGUI 哪些显示在前方的问题