HDU 5722 Jewelry

时间:2021-09-29 20:07:10

矩形面积并。

需要转化一下思路:记录每一个位置的数以及位置。

对数字进行从小到大排序,数字一样的按位置从小到大排。

这样,一样的数就在一起了。连续的相同的x个数就可以构成很多解,这些解对应于二维平面上某矩形内整点个数(包括边界)。

这样就处理出很多很多的矩形,因为重复只能计算一次,所以可以采用矩形面积并计算。

PS:计算整点个数的话,可以讲每一个矩形的左下角左边-1 -1,这样就直接当面积来算就可以了。

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1 const long long maxn = + ;
struct XX
{
long long num;
long long pos;
}s[maxn];
long long cnt[maxn << ];
long long sum[maxn << ];
long long X[maxn];
struct Seg {
long long h, l, r;
long long s;
Seg(){}
Seg(long long a, long long b, long long c, long long d) : l(a), r(b), h(c), s(d) {}
bool operator < (const Seg &cmp) const {
return h < cmp.h;
}
}ss[maxn];
void PushUp(long long rt, long long l, long long r) {
if (cnt[rt]) sum[rt] = X[r + ] - X[l];
else if (l == r) sum[rt] = ;
else sum[rt] = sum[rt << ] + sum[rt << | ];
}
void update(long long L, long long R, long long c, long long l, long long r, long long rt) {
if (L <= l && r <= R) {
cnt[rt] += c;
PushUp(rt, l, r);
return;
}
long long m = (l + r) >> ;
if (L <= m) update(L, R, c, lson);
if (m < R) update(L, R, c, rson);
PushUp(rt, l, r);
}
long long Bin(long long key, long long n, long long X[]) {//离散化
long long l = , r = n - ;
while (l <= r) {
long long m = (l + r) >> ;
if (X[m] == key) return m;
if (X[m] < key) l = m + ;
else r = m - ;
}
return -;
}
bool cmp(const XX&a, const XX&b)
{
if (a.num == b.num) return a.pos<b.pos;
return a.num<b.num;
}
int main() {
long long T, sz, h;
scanf("%lld", &T);
while (T--){ scanf("%lld%lld", &sz, &h);
for (long long i = ; i <= sz; i++)
{
scanf("%lld", &s[i].num);
s[i].pos = i;
} sort(s + , s + + sz, cmp); long long m = ; for (long long i = ; i <= sz; i++)
{
if (i + h - >sz) break;
if (s[i].num != s[i + h - ].num) continue; long long Lmin, Lmax, Rmin, Rmax; if (i == || s[i - ].num != s[i].num) Lmin = ;
else Lmin = s[i - ].pos + ;
Lmax = s[i].pos; Rmin = s[i + h - ].pos;
if (i + h - == sz || s[i + h].num != s[i + h - ].num) Rmax = sz;
else Rmax = s[i + h].pos - ; long long x1 = Lmin - , y1 = Rmin - , x2 = Lmax, y2 = Rmax; long long a = x1, b = y2, c = x2, d = y1;
X[m] = a;
ss[m++] = Seg(a, c, b, );
X[m] = c;
ss[m++] = Seg(a, c, d, -);
} sort(X, X + m);
sort(ss, ss + m);
long long k = ;
for (long long i = ; i < m; i++) {
if (X[i] != X[i - ]) X[k++] = X[i];
}
memset(cnt, , sizeof(cnt));
memset(sum, , sizeof(sum));
long long ret = ;
for (long long i = ; i < m - ; i++) {
long long l = Bin(ss[i].l, k, X);
long long r = Bin(ss[i].r, k, X) - ;
if (l <= r) update(l, r, ss[i].s, , k - , );
ret += sum[] * (ss[i + ].h - ss[i].h);
}
printf("%lld\n", ret);
}
return ;
}

HDU 5722 Jewelry的更多相关文章

  1. hdu 5268 ZYB loves Score 水题

    ZYB loves Score Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  2. HDOJ 2111&period; Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  4. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  5. HDU 4569 Special equations&lpar;取模&rpar;

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  6. HDU 4006The kth great number&lpar;K大数 &plus;小顶堆&rpar;

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  7. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  8. hdu 4481 Time travel&lpar;高斯求期望&rpar;&lpar;转&rpar;

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. HDU 3791二叉搜索树解题&lpar;解题报告&rpar;

    1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...

随机推荐

  1. 与PostgreSQL相关的工具

    Pentaho Data Integration(kettle):一个优秀的抽取.转换.加载(Extract Transform and Load,ETL)工具 Pentaho  Report Ser ...

  2. QEvent整理归纳:140种类型,29个继承类,7个函数,3种事件来源

    140种事件类型: QEvent::None QEvent::AccessibilityDescription QEvent::AccessibilityHelp QEvent::Accessibil ...

  3. PHP变量传值赋值和引用赋值,变量销毁

    <?php $a = 100; $b = 200; var_dump($a,$b); //int(100) int(200) ?> php中,上面的代码,变量是怎么存放的呢? 上面的代码变 ...

  4. CentOS 7 安装Apache 2&period;4&period;39

    使用源码在CentOS 7下安装 apache 2.4.39,之前趟了一遍,简单做个笔记. STEP 1 安装apr STEP 1.1 检查是否安装apr [root@study ~]# yum li ...

  5. bs4爬虫入门

    # -*- coding: utf-8 -*- """ Created on Fri Nov 16 13:35:33 2018 @author: zhen "& ...

  6. 11月26日 用seed,预加载种子文件; Case 条件语句。网址的参数如何传递&comma;&semi; Query--自定义scopes

    在seed文件中输入一些预加载的种子job,注意属性和值都要有:  ❌错误,我输入contact_email的时候value值是空的,这样不能正确生成. 正确✅: for i in 1..10 do ...

  7. 3&period;Python3标准库--数据结构

    (一)enum:枚举类型 import enum ''' enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个为值创建明确定义的符号,而不是使用字面量整数或字符串 ''' 1.创建枚举 im ...

  8. iOS开发中&OpenCurlyDoubleQuote;此证书的签发者无效”的解决方式

    iOS开发过程中有时候会出现证书所有变成无效,例如以下图 然后进行打包的时候会提演示样例如以下警告:  解决方法:  第一步: 下载https://developer.apple.com/certif ...

  9. 「暑期训练」「基础DP」 Piggy-Bank (HDU-1114)

    题意与分析 完全背包问题. 算法背包九讲里面都有提到过,我自己再说下对完全背包的理解. 为什么01背包中遍历状态从VV到00?考虑一下基本方程$dp[i][j]=max(dp[i-1][j-w[i]] ...

  10. DAY16-Django之MTV

    MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的时候 ...