【BZOJ4311】向量

原创 2015年11月20日 17:47:36

Description

你要维护一个向量集合,支持以下操作:
1.插入一个向量(x,y)
2.删除插入的第i个向量
3.查询当前集合与(x,y)点积的最大值是多少。如果当前是空集输出0
Input

第一行输入一个整数n,表示操作个数
接下来n行,每行先是一个整数t表示类型,如果t=1,输入向量
(x,y);如果t=2,输入id表示删除第id个向量;否则输入(x,y),查询
与向量(x,y)点积最大值是多少。
保证一个向量只会被删除一次,不会删没有插入过的向量
Output

对于每条t=3的询问,输出一个答案
Sample Input

5

1 3 3

1 1 4

3 3 3

2 1

3 3 3
Sample Output

18

15
HINT

n<=200000 1<=x,y<=10^6

Source

动态维护凸包.答案在凸包上三分.
可以高级数据结构.
还是线段树分治好T_T

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 200010
#define GET (ch>='0'&&ch<='9')
#define LL long long
#define lchild rt<<1,l,mid
#define rchild rt<<1|1,mid+1,r
#define ln rt<<1
#define rn rt<<1|1
using namespace std;
int n,tp1,tp2,top,tp,newtp;
LL ans[MAXN];
void in(int &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
struct Query
{
    int x,y,l,r;
    friend LL operator *(Query a,Query b)   {return (LL)a.x*b.x+(LL)a.y*b.y;}
    bool operator <(const Query& a)const    {return x==a.x?y>a.y:x<a.x;}
}q1[MAXN],q2[MAXN],newq[MAXN],sta[MAXN];
struct list
{
    Query x;
    list *next;
}e[MAXN*10<<1];
struct seg
{
    int l,r;
    list *prev;
}tree[MAXN<<2];
void build(int rt=1,int l=1,int r=n)
{
    tree[rt].l=l;tree[rt].r=r;
    if (l==r)   return;
    int mid=(l+r)>>1;build(lchild);build(rchild);
}
void insert(int rt,int l,int r,int id)
{
    int L=tree[rt].l,R=tree[rt].r,mid=(L+R)>>1;
    if (l<=L&&r>=R)
    {
        e[++top].x=q1[id];e[top].next=tree[rt].prev;tree[rt].prev=&e[top];
        return;
    }
    if (r<=mid) insert(ln,l,r,id);
    else    if (l>mid)  insert(rn,l,r,id);
    else    insert(ln,l,mid,id),insert(rn,mid+1,r,id);
}
void query(int x)
{
    int l=1,r=tp,len,mid1,mid2;
    while (l<=r)
    {
        len=(r-l)/3;mid1=l+len;mid2=r-len;
        LL dot1=q2[x]*sta[mid1],dot2=q2[x]*sta[mid2];
        if (dot1>dot2)  r=mid2-1,ans[x]=max(ans[x],dot1);
        else    l=mid1+1,ans[x]=max(ans[x],dot2);
    }
}
void solve(int rt,int l,int r)
{
    int mid=(l+r)>>1;
    if (l<r)    {solve(ln,l,mid);solve(rn,mid+1,r);}
    newtp=0;tp=0;
    for (list *i=tree[rt].prev;i;i=i->next) newq[++newtp]=i->x;
    if (!newtp) return;sort(newq+1,newq+newtp+1);sta[++tp]=newq[1];
    for (int i=2;i<=newtp;i++)
        if (newq[i].x!=newq[i-1].x)
        {
            while (tp>1&&(LL)(sta[tp].y-sta[tp-1].y)*(newq[i].x-sta[tp].x)<=(LL)(newq[i].y-sta[tp].y)*(sta[tp].x-sta[tp-1].x))  tp--;
            sta[++tp]=newq[i];
        }
    for (int i=l;i<=r;i++)
        if (q2[i].x)    query(i);
}
int main()
{
    in(n);int opt,x,y;build();
    for (int i=1;i<=n;i++)
    {
        in(opt);
        if (opt==1) in(x),in(y),q1[++tp1].x=x,q1[tp1].y=y,q1[tp1].l=i,q1[tp1].r=n;
        if (opt==2) in(x),q1[x].r=i;
        if (opt==3) in(x),in(y),q2[i].x=x,q2[i].y=y;
    }
    for (int i=1;i<=tp1;i++)    insert(1,q1[i].l,q1[i].r,i);
    solve(1,1,n);
    for (int i=1;i<=n;i++)
        if (q2[i].x)    printf("%lld\n",ans[i]);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【线段树分治】[BZOJ4311]向量

题目描述Description你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少。如果当前是空集输出0Input...
  • outer_form
  • outer_form
  • 2016年08月22日 15:08
  • 546

常用数学符号的 LaTeX 表示方法

1、指数和下标可以用^和_后加相应字符来实现。比如:2、平方根(square root)的输入命令为:\sqrt,n 次方根相应地为: \sqrt[n]。方根符号的大小由LATEX自动加以调整。也可用...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年08月24日 15:57
  • 4536

机器学习笔记(六)支持向量机

6.支持向量机 6.1间隔与支持向量 对于给定的训练集D={(x1,y1),(x2,y2),…,(xm,ym)},yi∈{-1,+1},分类学习的初衷就是基于训练集在样本空间中找到一个可以有效划分样本...
  • fjssharpsword
  • fjssharpsword
  • 2017年02月22日 11:30
  • 2290

sklearn中支持向量机部分

写在开头:英文原文http://scikit-learn.org/stable/modules/svm.html。 只是对原文做了简单的翻译,主要自己学习,能给大家提供帮助就再好不过了。 ****...
  • Good_Boyzq
  • Good_Boyzq
  • 2017年01月02日 21:59
  • 2200

支持向量机 - 1 - 准备知识和介绍

声明:          1,本篇为个人对《2012.李航.统计学习方法.pdf》的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址)。          2,由于本人在学习初始时有很多数...
  • xueyingxue001
  • xueyingxue001
  • 2016年04月27日 15:17
  • 1650

c++实现三维向量的操作

c++实现三维向量的操作
  • qq_24282081
  • qq_24282081
  • 2017年05月22日 21:57
  • 663

(R语言)简单操作,数值与向量

2.1 向量与赋值 R对命名了的数据结构进行操作。最简单的数据结构是数字向量;如, > x > assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))  也可以写成...
  • myl1992
  • myl1992
  • 2015年04月08日 08:51
  • 1958

支持向量机总结

机器学习总结——支持向量机 现在介绍支持向量机的文档很多,以下只是我个人对于支持向量机算法的认识,有认识不到位的地方请各位大牛多指正。支持向量机属于一种二类分类模型,它的模型是定义在特征空间上的间...
  • wazwx
  • wazwx
  • 2016年03月09日 11:12
  • 2037

集合的位向量表示

/*集合的位向量表示,1表示有,0表示无,这种表示可以很大的节省空间*/ #include #include #include #include #include #define MAX 100...
  • zq17865815296
  • zq17865815296
  • 2016年08月07日 10:51
  • 969

C++入门(19):向量与迭代器

C++入门(19):向量与迭代器容器 容器一般通过模板来实现,即容器一般为模板的实例化。向量容器(头文件 #include ) 如果想创建特定类型的向量,需要使用的语法为:std::vector ...
  • qq_33256568
  • qq_33256568
  • 2016年01月18日 09:51
  • 766
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ4311】向量
举报原因:
原因补充:

(最多只允许输入30个字)