bzoj4172: 弹珠
思路:先用splay处理出弹珠序列,然后就是斜率优化了
首先有f[i]=-a[i]*p[j]+q[j]
稍微变形得q[j]=a[i]*p[j]+f[i]
用单调栈维护上凸壳,询问时二分,然后就没有然后了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) a>b?a:b
#define ll long long
const int maxn=400010,inf=(int)1e9;
const double eps=1e-9;
using namespace std;
int n,m,a[maxn],cnt,top,q[maxn];ll f[maxn];char op[10],ch;
struct node{ll x,y;}p[maxn];
void read(int &x){for (ch=getchar();!isdigit(ch);ch=getchar());for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
}
struct Spy{int fa[maxn],c[maxn][2],size[maxn],val[maxn],root,tot;int newnode(int v){val[++tot]=v,size[tot]=1,fa[tot]=c[tot][0]=c[tot][1]=0;return tot;}void clear(){tot=c[1][1]=size[1]=2,root=fa[2]=size[2]=1;}int which(int x){return c[fa[x]][1]==x;}void update(int x){size[x]=size[c[x][0]]+size[c[x][1]]+1;}void rotate(int x){int y=fa[x],z=fa[y],nx=which(x),ny=which(y);fa[c[x][!nx]]=y,c[y][nx]=c[x][!nx];fa[x]=z;if (z) c[z][ny]=x;fa[y]=x,c[x][!nx]=y;update(y);}void splay(int x){while (fa[x]){if (!fa[fa[x]]) rotate(x);else if (which(fa[x])==which(x)) rotate(fa[x]),rotate(x);else rotate(x),rotate(x);}root=x,update(x);}int getpos(int rank){for (int x=root;;){//printf("rank%d %d %d %d\n",rank,size[root],size[c[root][0]],size[c[root][1]]);if (rank<size[c[x][0]]+1) x=c[x][0];else if (rank==size[c[x][0]]+1) return x;else rank-=(size[c[x][0]]+1),x=c[x][1];}}void modify(int rank,int v){int x=getpos(rank);val[x]=v,splay(x);}void insert(int rank,int v){int x=getpos(rank);splay(x);int xx=c[x][1];for (;c[xx][0];xx=c[xx][0]) ;c[xx][0]=newnode(v),fa[tot]=xx,splay(tot);}void get(int x){if (c[x][0]) get(c[x][0]);if (x!=1&&x!=2) a[++cnt]=val[x];if (c[x][1]) get(c[x][1]);}
}T;double slope(int i,int j){if (i==0||j==0) return inf; if (i==inf||j==inf) return -inf; return 1.0*(p[i].y-p[j].y)/(double)(p[i].x-p[j].x);
}void work(){q[0]=0,q[top=1]=1,q[top+1]=inf;for (int i=2;i<=n;i++){int l=1,r=top,mid=(l+r)>>1;while (1){if (slope(q[mid-1],q[mid])+eps>=a[i]&&slope(q[mid],q[mid+1])<=eps+a[i]){break;}if (slope(q[mid],q[mid+1])>eps+a[i]) l=mid+1;else r=mid-1;mid=(l+r)>>1;}f[i]=-p[q[mid]].x*a[i]+p[q[mid]].y;while (top>1&&slope(q[top-1],q[top])<slope(q[top],i)) --top;q[++top]=i;q[top+1]=inf;}for (int i=2;i<=n;i++) printf("%lld\n",max(0,f[i]));
}int main(){scanf("%d%d",&n,&m),T.clear();for (int i=1,x,y;i<=m;i++){scanf("%s",op);read(x),read(y);if (op[0]=='I') T.insert(x+1,y);else T.modify(x+2,y);}T.get(T.root);//for (int i=1;i<=cnt;i++) printf("%d\n",a[i]);for (int i=1,x,y;i<=n;i++) read(x),read(y),p[i].x=x,p[i].y=y;work();return 0;
}
转载于:https://www.cnblogs.com/thythy/p/5493581.html
bzoj4172: 弹珠相关推荐
- [Usaco2007 Oct] Super Paintball超级弹珠
Time Limit: 5 Sec Memory Limit: 64 MB Submit: 489 Solved: 384 [Submit][Status][Discuss] Descriptio ...
- debounceTime 和 throttleTime 的弹珠图
debounceTime:测试代码 import {concat,debounceTime,filter,interval,mapTo,of,take,throttleTime, } from 'rx ...
- 小手工纸盒机器人_亲子手工 | DIY弹珠迷宫小黑手自制玩具系列
上周用鞋盒做的迷你桌球受到很多男孩子的喜欢 今天小黑手又做了一个瓦楞纸手工 「弹珠迷宫」也是喜欢的爱不释手呢 暑假小黑手系列,希望也能攒出个自己的小游乐场 自己动手做自己的玩具,买玩具的钱可以省了 快 ...
- ssr怎么编辑服务器ip_“阴阳师”IP影响力有多大?网易用它做了一款弹珠游戏,TapTap评分高达9.8分...
文|手游那点事|虹彤.Jimmy "阴阳师"IP衍生的想象空间到底有多大? 在今年的"520发布会"上,网易非常大手笔地公布了<阴阳师>IP的一系列 ...
- 13 登陆_《星球大战:弹珠台》中文版即将登陆Switch 12月13日正式发售
日前,发行商Game Source Entertainment宣布,由Zen Studios开发<星球大战:弹珠台>Switch简/繁体中文版,将在12月13日正式发售. 本作是第一款将于 ...
- python 乒乓球_python使用pygame实现笑脸乒乓球弹珠球游戏
今天我们用python和pygame实现一个乒乓球的小游戏,或者叫弹珠球游戏. 笑脸乒乓球游戏功能介绍 乒乓球游戏功能如下: 乒乓球从屏幕上方落下,用鼠标来移动球拍,使其反弹回去,并获得得分,如果没有 ...
- 滚铁环,跳橡皮筋,斗鸡,打弹珠,老鹰捉小鸡…………
看到这些游戏名称,似曾相识吧,那就让我们来怀念一下怀旧一下,毫无疑问,我小时候经常玩这些游戏,应该很环保很健康很有趣,但如今我都成为孩子他爸了,再看看我的小孩,现在的环境估计很难玩得上这些游戏了,幼儿 ...
- linux弹珠游戏实现,弹珠游戏台玩具的详细制作图解
图片:20180207_171332_3125.jpg 图片:20180207_171332_3127.jpg 图片:20180207_171332_3128.jpg 图片:20180207_1713 ...
- LCP 63 弹珠游戏
文章目录 题目 注意: 示例 1: 示例 2: 示例 3: c++代码 题目 N*M 大小的弹珠盘的初始状态信息记录于一维字符串型数组 plate 中,数组中的每个元素为仅由 "O" ...
- PyGame弹珠游戏双人粗略版
# _*_ coding:utf-8 _*_ import pygame from pygame.locals import * from sys import exit__author__ = 'a ...
最新文章
- Go 学习笔记(36)— 基于Go方法的面向对象(封装、继承、多态)
- python获取用户输入中文_python中的用户输入
- OKGAN:线上训练GAN的方法
- NSMethodSignature和NSInvocation的用法
- [小技巧][Java]Arrays.fill() 初始化 二维数组
- 常见的Activity Action Intent常量
- 安卓学习笔记40:基于套接字网络编程
- 自动化测试 (三) Web自动化测试原理
- (12)机器学习_特征选择
- 【路径规划】基于matlab遗传算法求解同时取送货车辆路径问题【含Matlab源码 1072期】
- 19.华为笔试题整理
- 简述P问题,NP问题,NP完全问题以及NP Hard问题
- vue 富文本编辑器上传图片到服务器并显示到富文本中
- 2021-11-07-防火墙添加安全策略
- 通过motion实现摄像头远程监控(转)
- C++结构型模式-适配器模式
- 云南企业私有云平台搭建解决方案、Zstack云平台管理软件介绍
- Android版本和SDK版本
- linux强制移除pdf密码,linux-使用PDFtk删除pdf文件的最后一页?
- 三大思维导图软件比较
热门文章
- UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0x80 in position 2
- python、java、C三种方法打印乘法表
- 面试必会 InnoDB的多版本并发控制(MVCC)
- python--图像轮廓findContours
- 营山天气预报软件测试,营山天气预报15天
- FISCO BCOS Solidity 智能合约 批量插入新增数据
- 自定义rest api的基本思想过程--总结
- 六、Linux常用命令——压缩解压缩命令
- 九、面向对象三大特征(三)—— 多态
- 对于tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))的研究