http://www.lydsy.com/JudgeOnline/problem.php?id=2300

终于对了。。。

平衡树又写挂了。。。不要忘记清空原先的root和修改root。。。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
const double eps = 1e-;
struct query {
int x, opt;
} q[N];
struct data {
double x, y; int cut;
} a[N];
int m, Q, len;
double ans[N];
double ans1, n;
namespace splaytree
{
int root;
int child[N][], fa[N];
void zig(int x)
{
int y = fa[x];
fa[x] = fa[y]; child[fa[x]][child[fa[x]][] == y] = x;
child[y][] = child[x][]; fa[child[x][]] = y;
fa[y] = x; child[x][] = y;
}
void zag(int x)
{
int y = fa[x];
fa[x] = fa[y]; child[fa[x]][child[fa[x]][] == y] = x;
child[y][] = child[x][]; fa[child[x][]] = y;
fa[y] = x; child[x][] = y;
}
void splay(int x, int t)
{
while(fa[x] != t)
{
int y = fa[x], z = fa[y];
if(z == t)
{
child[y][] == x ? zig(x) : zag(x); break;
}
// child[y][0] == x ? zig(x) : zag(x);
// child[z][0] == x ? zig(x) : zag(x);
else if(y == child[z][] && x == child[y][]) { zig(y); zig(x); }
else if(y == child[z][] && x == child[y][]) { zag(y); zag(x); }
else if(y == child[z][] && x == child[y][]) { zag(x); zig(x); }
else if(y == child[z][] && x == child[y][]) { zig(x); zag(x); }
}
if(!t) root = x;
}
void add(data t, int k)
{
if(!root) { root = k; return; }
int now = root;
while()
{
if(!child[now][t.x > a[now].x])
{
fa[k] = now; child[now][t.x > a[now].x] = k;
splay(k, ); return;
}
now = child[now][t.x > a[now].x];
}
}
void del(int x)
{
splay(x, );
if(child[x][] * child[x][] == )
{
root = child[x][] + child[x][];
fa[root] = fa[x] = child[x][] = child[x][] = ; return;
}
int now = child[x][];
while(child[now][]) now = child[now][];
fa[child[x][]] = now; child[now][] = child[x][];
root = child[x][]; fa[root] = fa[x] = child[x][] = child[x][] = ;
splay(now, );
}
int Pre(int x)
{
splay(x, );
x = child[x][];
if(!x) return ;
while(child[x][]) x = child[x][];
return x;
}
int Next(int x)
{
splay(x, );
x = child[x][];
if(!x) return ;
while(child[x][]) x = child[x][];
return x;
}
double slope(int x, int y)
{
return (a[y].y - a[x].y) / (a[y].x - a[x].x);
}
double sqr(double x)
{
return x * x;
}
double dis(int x, int y)
{
if(!x || !y) return ;
return sqrt(sqr(a[x].x - a[y].x) + sqr(a[x].y - a[y].y));
}
void insert(data t, int x)
{
add(t, x);
int pre = Pre(x), nxt = Next(x);
ans1 += dis(x, pre) + dis(x, nxt) - dis(nxt, pre);
if(!pre || !nxt) return;
splay(pre, x); splay(nxt, x);
if(slope(pre, x) - slope(x, nxt) <= eps) { ans1 -= dis(x, pre) + dis(x, nxt) - dis(pre, nxt); del(x); return; }
int ppre = Pre(pre), nnxt = Next(nxt);
while(ppre && slope(x, pre) - slope(pre, ppre) >= eps)
{
ans1 -= dis(pre, x) + dis(pre, ppre) - dis(x, ppre);
del(pre); pre = ppre; ppre = Pre(pre);
}
while(nnxt && slope(x, nxt) - slope(nxt, nnxt) <= eps)
{
ans1 -= dis(nxt, x) + dis(nxt, nnxt) - dis(x, nnxt);
del(nxt); nxt = nnxt; nnxt = Next(nxt);
}
}
} using namespace splaytree;
int main()
{
// freopen("defense1.in", "r", stdin);
// freopen("defense.out", "w", stdout);
scanf("%lf%lf%lf%d", &n, &a[].x, &a[].y, &m); m += ;
a[].x = n; a[].y = ;
for(int i = ; i <= m; ++i) scanf("%lf%lf", &a[i].x, &a[i].y);
scanf("%d", &Q);
for(int i = ; i <= Q; ++i)
{
scanf("%d", &q[i].opt);
if(q[i].opt == )
{
scanf("%d", &q[i].x);
a[q[i].x + ].cut = ;
}
}
len = ;
for(int i = ; i <= m; ++i) if(!a[i].cut) insert(a[i], i);
for(int i = Q; i; --i)
if(q[i].opt == ) insert(a[q[i].x + ], q[i].x + );
else if(q[i].opt == ) ans[++len] = ans1;
for(int i = len; i; --i) printf("%.2f\n", ans[i]);
// fclose(stdin); fclose(stdout);
return ;
}

bzoj2300的更多相关文章

  1. bzoj2300【HAOI2011】防线修建

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

  2. 【BZOJ2300】[HAOI2011]防线修建 set维护凸包

    [BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...

  3. BZOJ2300: [HAOI2011]防线修建

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2300 (我只是在发以前写过的题.. 因为题目没说强制在线,所以离线乱搞就可以了.先把点删掉然后 ...

  4. BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

  5. 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)

    传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...

  6. bzoj2300#2300. [HAOI2011]防线修建

    题解:带删点的维护凸包,1.删点2.查询凸包周长 题解:倒着做就成了带加点的维护凸包,加点时维护一下周长就没了 //#pragma GCC optimize(2) //#pragma GCC opti ...

  7. 【BZOJ2300】【SCOI2011】糖果

    差点就忘了还有差分约束这个东西……看见了就要学习一个 原题: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要 ...

  8. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...

  9. 【BZOJ2300】【HAOI2011】防线修建

    题目大意:给你m+3个点,有q个操作,每次要么询问当前点集构所构成的上凸壳总长度,要么在当前点集中删除一个点. 这题是吼题啊!!! 刚开始想着如何正常地做,考虑过用线段树维护一个区间内的凸包,发现并不 ...

  10. 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包

    题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...

随机推荐

  1. C语言编辑编译及集成开发环境

    C语言编辑编译及集成开发环境 编辑器 在不同的操作系统上使用不同的编辑器,保存源代码文件时,文件名应指出程序的功能扩展名应为.c. 编译器 编译器把源代码编译成机器语言的二进制指令即目标代码生成目标文 ...

  2. HDU6189 Law of Commutation (数论)

    题意:输入n和a 定义m等于2的n次方 求1-m有多少数使得 a^b = b^a (mod m) 题解:先打表找规律 发现a为奇数的答案只有b = a这一种 (不知道为什么也不想知道为什么 当a为偶数 ...

  3. 关于fragment+viewpager的优化

    上次写了一个问答项目,用的fragment+viewpager架构,后来发现,划了几次之后,再划回来,会重新加载布局,重新获取数据,这样整个程序和卡,并且占用太多的网络资源. 当时的解决办法是,自己重 ...

  4. FZU 1492 地震预测(模拟链表的应用)(Java实现)

    FZU 1492 地震预测(模拟链表的应用)(Java实现) 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一 ...

  5. 【codeforces 3C】Tic-tac-toe

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 写一个函数判断当前局面是否有人赢. 然后枚举上一个人的棋子下在哪个地方. 然后把他撤回 看看撤回前是不是没人赢然后没撤回之前是不是有人赢了. ...

  6. RabbitMQ-rabbitMq各个特性的使用(三)

    准备 1.引入客户端和配置文件依赖类 <dependency> <groupId>com.rabbitmq</groupId> <artifactId> ...

  7. HDU 1212 大整数的取模运算

    因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...

  8. codevs4419 FFF 团卧底的菊花

    题目描述 Description FFF 团卧底在这次出题后就知道他的菊花可能有巨大的危险,于是他提前摆布好了菊花阵,现在菊花阵里有若干朵菊花,出现次数最多的那一朵就是出题人的,你的任务是需要找出出题 ...

  9. codevs3411 洪水

    题目描述 Description 小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质: ①露营地可以被看做是一个N*M的矩形方阵 ...

  10. 编译Linux使用的.a库文件

    编译Linux使用的.a库文件 首先是须要编译成.a的源文件 hello.h: #ifndef __INCLUDE_HELLO_H__ #define __INCLUDE_HELLO_H__ void ...