hdu - 1823 - Luck and Love(线段树)
版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/SCNU_Jiechao/article/details/24406391
题意:Wiskey招女友,每一个女生看其身高、活泼度和缘分值。如今运行两种操作,1、I。增加一位女生的身高。活泼度和缘分值;2、Q,查询身高在H1, H2之间,活泼度在A1, A2之间的女生的最高缘分值。
题目链接: pid=1823" rel="nofollow">http://acm.hdu.edu.cn/showproblem.php?pid=1823
——>>查询某个区间的最值,若是一维,可用RMQ解法。。也可用线段树解法。。
如今要查身高限一个区间。活泼度限一个区间,是一个二维的情景。
。将线段树扩至二维。。时间复杂度:O(N+M*log(N)^2)。。
——>>坑1:G++的BUG。。
。
。以G++提交数次皆WA。
。
改交C++即过。。有朋友指出是代码触发了没有定义行为,也有朋友说是由于G++的O2 BUG。
。
——>>坑2:题目中说是1位小数。那么。处理方法用scanf("%d.%d", &A1, &A2)。再进行A1 * 10 + A2,会比用scanf("%lf", &A),再进行(int)(A * 10)更精确(自己測下0.0到0.9就能够发现)。。但是,用第一种处理方式却会WA,偏偏要用另外一种不那么精确的处理方式才会AC。。
第一道二维线段树题目,做到想哭了。
。
#include <cstdio>
#include <algorithm>
using namespace std;
#define lc (o<<1)
#define rc ((o<<1)|1)
const int maxh = 100 + 10;
const int maxa = 1000 + 10;
int mmax[maxh<<2][maxa<<2];
void build_A(int O, int o, int L, int R) { //活泼度建树
mmax[O][o] = -1;
if(L == R) return;
int M = (L + R) >> 1;
build_A(O, lc, L, M);
build_A(O, rc, M+1, R);
}
void build_H(int o, int L, int R) { //身高建树
build_A(o, 1, 0, 1000);
if(L == R) return;
int M = (L + R) >> 1;
build_H(lc, L, M);
build_H(rc, M+1, R);
}
void Insert_A(int O, int o, int L, int R, int A, int D) { //依据活泼度建树
if(L == R) {
mmax[O][o] = max(mmax[O][o], D);
return;
}
int M = (L + R) >> 1;
if(A <= M) Insert_A(O, lc, L, M, A, D);
else Insert_A(O, rc, M+1, R, A, D);
mmax[O][o] = max(mmax[O][lc], mmax[O][rc]);
}
void Insert(int o, int L, int R, int H, int A, int D) {
Insert_A(o, 1, 0, 1000, A, D);
if(L == R) return;
int M = (L + R) >> 1;
if(H <= M) Insert(lc, L, M, H, A, D);
else Insert(rc, M+1, R, H, A, D);
}
int query_A(int O, int o, int L, int R, int A1, int A2) { //依据活泼度查询
if(A1 <= L && R <= A2) return mmax[O][o];
int M = (L + R) >> 1;
int Max1 = -1, Max2 = -1;
if(A1 <= M) Max1 = query_A(O, lc, L, M, A1, A2);
if(A2 > M) Max2 = query_A(O, rc, M+1, R, A1, A2);
return (Max1 > Max2) ? Max1 : Max2;
}
int query(int o, int L, int R, int H1, int H2, int A1, int A2) {
if(H1 <= L && R <= H2) return query_A(o, 1, 0, 1000, A1, A2);
int M = (L + R) >> 1;
int Max1 = -1, Max2 = -1;
if(H1 <= M) Max1 = query(lc, L, M, H1, H2, A1, A2);
if(H2 > M) Max2 = query(rc, M+1, R, H1, H2, A1, A2);
return (Max1 > Max2) ?
Max1 : Max2;
}
int main()
{
int M;
char op;
while(scanf("%d", &M) == 1 && M) {
build_H(1, 100, 200);
for(int i = 0; i < M; i++) {
getchar();
op = getchar();
if(op == 'I') {
// int H, A, A1, A2, D, D1, D2;
// scanf("%d %d.%d %d.%d", &H, &A1, &A2, &D1, &D2);
// A = A1 * 10 + A2;
// D = D1 * 10 + D2;
int H, A, D;
double AA, DD;
scanf("%d%lf%lf", &H, &AA, &DD);
A = (int)(AA * 10);
D = (int)(DD * 10);
Insert(1, 100, 200, H, A, D);
}
else {
// int H1, H2, A[6];
// scanf("%d %d %d.%d %d.%d", &H1, &H2, A+2, A+3, A+4, A+5);
// A[0] = A[2] * 10 + A[3];
// A[1] = A[4] * 10 + A[5];
int H1, H2, A1, A2;
double AA, BB;
scanf("%d%d%lf%lf", &H1, &H2, &AA, &BB);
A1 = (int)(AA * 10);
A2 = (int)(BB * 10);
if(A1 > A2) swap(A1, A2);
if(H1 > H2) swap(H1, H2);
// if(A[0] > A[1]) swap(A[0], A[1]);
// int ret = query(1, 100, 200, H1, H2, A[0], A[1]);
int ret = query(1, 100, 200, H1, H2, A1, A2);
ret != -1 ?
printf("%.1f\n", ret/10.0) : puts("-1");
}
}
}
return 0;
}hdu - 1823 - Luck and Love(线段树)的更多相关文章
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- hdu 1754 I Hate It 线段树 点改动
// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数
R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...
随机推荐
- mysql timestamp的默认值
当default 0,default '0000-00-00 00:00:00'都失效的时候,请尝试下 ALTER table `coupon_gift` add column `time_end` ...
- BZOJ-1010 玩具装箱toy (斜率优化)
题目大意:将n个数分成若干组,并且每组的数在原数组中应是连续的,每组会产生的代价为sum(i)-sum(j)+i-j-1-m,m为已知的常数.求最小代价. 题目分析:定义dp(i)表示将前 i 个元素 ...
- 通过一个uri获取一个Bitmap对象
Android 开发过程中,可能会用到的,通过一个uri获取一个Bitmap对象 private Bitmap getBitmapFromUri(Uri uri){ try { // 读取ur ...
- Application 类
Application 类具有用于启动和停止应用程序和线程以及处理 Windows 消息的方法,如下所示: Run 在当前线程上启动应用程序消息循环,并可以选择使某窗体可见. Exit 或 ExitT ...
- WinForm窗体下Excel的导入
一.Winform窗体程序的Excel的导入 把Excel导入到内存中的DataTable 方法实现: #region ExcelToDataTable public static DataTable ...
- Object是个什么鬼
引言 老人常说,在js中,一切皆对象,那对象又是什么涅,最常用的我们都知道,对象有方法和属性.由一些键值对构成的集合,然后随便用个大括号括起来就形成了一个对象.看起来蛮简单的,但是真是这么简单么,当我 ...
- js 实现智能输入数字
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- myeclipse设置jvm参数的三种方式
方法一: 打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面有对勾的JRE,再单击右边的“Edit” ...
- Django(二)创建app,设置相关后台
location 最后一个文件夹名就是project名,我用了DjangoProject. Application 是自动加入的APP名字,我用了DjangoTest 1.添加APP在pycharm的 ...
- php变量和字符串连接符——点
连接符——点,本身也是一种运算符.它真正的名字应该叫“字符运算符”.作用是把两个字符串连接起来. echo 字符 . 变量 . 字符; //点号把三个值连接成为一个,运行正常. 例: 1.字符串+变 ...