Solved:3

02 Rikka with Cake (树状数组)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; int n, m, K;
int cntx, cnty, cntl, cntr, cntu, cntd;
struct node {
int x, y, tx, ty;
char dir;
}E[100005];
node L[100005], R[100005], U[100005], D[100005];
int idx[100005];
int idy[100005];
char s[5]; bool cmp1(node A, node B) {
return A.x < B.x;
}
bool cmp2(node A, node B) {
return A.y < B.y;
}
bool cmp3(node A, node B) {
return A.y > B.y;
} int sum[100005];
void add(int k) {
for(int i = k; i <= 100000; i += (i & -i)) sum[i]++;
}
int query(int k) {
int res = 0;
for(int i = k; i >= 1; i -= (i & -i)) res += sum[i];
return res;
} int main() {
int T;
scanf("%d", &T);
while(T--) {
cntx = cnty = cntl = cntr = cntu = cntd = 0;
scanf("%d%d%d", &n, &m, &K);
for(int i = 1; i <= K; i++) {
scanf("%d%d", &E[i].x, &E[i].y);
scanf("%s", s + 1); E[i].dir = s[1];
}
sort(E + 1, E + 1 + K, cmp1);
for(int i = 1; i <= K; i++) {
if(E[i].x != E[i - 1].x) E[i].tx = ++cntx;
else E[i].tx = cntx;
}
sort(E + 1, E + 1 + K, cmp2);
for(int i = 1; i <= K; i++) {
if(E[i].y != E[i - 1].y) E[i].ty = ++cnty;
else E[i].ty = cnty;
}
for(int i = 1; i <= K; i++) {
if(E[i].dir == 'U') U[++cntu] = E[i];
else if(E[i].dir == 'D') D[++cntd] = E[i];
else if(E[i].dir == 'L') L[++cntl] = E[i];
else if(E[i].dir == 'R') R[++cntr] = E[i];
}
sort(L + 1, L + 1 + cntl, cmp3);
sort(R + 1, R + 1 + cntr, cmp3);
sort(U + 1, U + 1 + cntu, cmp3);
memset(sum, 0, sizeof(sum)); ll ans = 0;
int tt = 1;
for(int i = 1; i <= cntu; i++) {
while(L[tt].ty >= U[i].ty && tt <= cntl) {
add(L[tt].tx);
tt++;
}
ans += 1LL * (query(100000) - query(U[i].tx - 1));
} tt = 1;
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= cntu; i++) {
while(R[tt].ty >= U[i].ty && tt <= cntr) {
add(R[tt].tx);
tt++;
}
ans += 1LL * query(U[i].tx);
} sort(D + 1, D + 1 + cntd, cmp2);
sort(L + 1, L + 1 + cntl, cmp2);
sort(R + 1, R + 1 + cntr, cmp2);
tt = 1;
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= cntd; i++) {
while(L[tt].ty <= D[i].ty && tt <= cntl) {
add(L[tt].tx);
tt++;
}
ans += 1LL * (query(100000) - query(D[i].tx - 1));
} tt = 1;
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= cntd; i++) {
while(R[tt].ty <= D[i].ty && tt <= cntr) {
add(R[tt].tx);
tt++;
}
ans += 1LL * query(D[i].tx);
}
printf("%lld\n", ans + 1LL);
}
return 0;
}

Rikka with Cake

2019HDU多校 Round9的更多相关文章

  1. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  2. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  3. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

  4. 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化

    题意:有一个n * n的网格,每个网格中间有一颗树,你知道每棵树的高,你可以选择一个矩形区域把里面的树都围起来,但是矩形区域里面任意两棵树的高度差的绝对值不超过m,问这个矩形的最大面积是多少? 思路: ...

  5. 2019HDU多校第九场 Rikka with Quicksort —— 数学推导&&分段打表

    题意 设 $$g_m(n)=\begin{cases}& g_m(i) = 0,     \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ...

  6. 2019HDU多校第7场——构造

    题意 假设现在你在准备考试,明天的考试有 $n$ 道题目,对于分值为 $i$ 的题目至少复习 $i+1$ 小时才能做对,已知总分为$m$,求确保完成 $k$ 道题的最少时间. 分析 手动尝试一下,发现 ...

  7. 2019HDU多校第六场1009 Three Investigators——杨表

    题意 给定一个 n 个元素的数列,从前 k 个元素中取5次不下降子序列,求取得的和的最大值(k从1至n) 分析 考虑将数字 a[i] 拆成 a[i] 个 a[i],比如 “4,1,2”→“4,4,4, ...

  8. 2019HDU多校第六场 6641 TDL——乱搞&&思维题

    题意 设 $f(n, m)$ 为大于 $n$ 且与 $n$ 互质的数中第 $m$ 小的数,求满足 $(f(n, m) - n) \oplus n = k$ 的最小正整数 $n$ 分析 因为 $m \l ...

  9. 2019HDU多校第五场A fraction —— 辗转相除法|类欧几里得

    题目 设 $ab^{-1} = x(mod \ p)$,给出 $x,p$,要求最小的 $b$,其中 $0< a < b, \ 1 < x<p,\ 3 \leq x\leq {1 ...

随机推荐

  1. LeetCode703 流中第k大的元素

    前言: 我们已经介绍了二叉搜索树的相关特性,以及如何在二叉搜索树中实现一些基本操作,比如搜索.插入和删除.熟悉了这些基本概念之后,相信你已经能够成功运用它们来解决二叉搜索树问题. 二叉搜索树的有优点是 ...

  2. 基于 OpenMP 的奇偶排序算法的实现

    代码: #include <omp.h> #include <iostream> #include <cstdlib> #include <ctime> ...

  3. jenkins + Ansible Plugin + ansi-color 让结果显示颜色

    1 安装jenkins: 此处省略百余字......   2 安装jenkins的插件: Ansible Plugin AnsiColor Plugin    3 设置job 内容 让ansible ...

  4. 分别使用 Python 和 Math.Net 调用优化算法

    1. Rosenbrock 函数 在数学最优化中,Rosenbrock 函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock 在 1960 年提出 .也称为 R ...

  5. HTML基础复习1

    网页:HTML(超文本标记语言) 网页分为静态网页和动态网页,区别:动态网页中可以加入脚本代码,还可以动态的引入数据库中的信息. HTML的结构 <html> <head>头信 ...

  6. Linux 安装分区设置分区大小

    一.Linux分区挂载点介绍 Linux分区挂载点介绍,推荐容量仅供参考不是绝对,跟各系统用途以及硬盘空间配额等因素实际调整: 分区类型 介绍 备注 /boot 启动分区 一般设置100M-200M, ...

  7. 权限管理3-整合Spring Security

    一.Spring Security介绍 1.框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安 ...

  8. 阿里云OSS对象存储服务(一)

    一.开通"对象存储OSS"服务 申请阿里云账号 实名认证 开通"对象存储OSS"服务 进入管理控制台 二.控制台使用 1.创建Bucket 命名:guli-fi ...

  9. 【.NET 与树莓派】矩阵按键

    欢迎收看火星卫视,本期节目咱们严重探讨一下矩阵按键. 所谓矩阵按键,就是一个小键盘(其实一块PCB板),上面有几个 Key(开关),你不按下去的时候,电路是断开的,你按下去电路就会接通.至于说有多少个 ...

  10. 3、剑指offer-数组——数组中重复的数字

    *题目描述* **在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输 ...