BZOJ-2829 信用卡凸包
凸包题。
我们先把所有信用卡的四个定点的坐标求出来,然后计算凸包长度,最后加上一个圆的周长就行。
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define lowbit(x) (x&-x)
#define maxn 10009
#define maxm 20009
#define inf 0x7fffffff
#define k(x) Key[x]
#define t(x) Tree[x]
using namespace std;
inline int read()
{
int x=0, f=1; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while (isdigit(ch)) x=x*10+ch-'0', ch=getchar();
return x*f;
}
struct node{node *l, *r; int sum;} *blank=new(node), *Tree[maxn], *r1[maxn], *r2[maxn];
struct node2{int v, n;} num[maxm];
bool cmp(node2 a, node2 b){return a.v<b.v;}
int n, m, V, q[maxn][4], Key[maxm], ln, n1, n2, c[maxm];
char ch[5];
void Build(int l, int r, node*&t)
{
if (t==blank) t=new(node), t->l=t->r=blank, t->sum=0;
if (l==r) return;
int mid=(l+r)>>1;
Build(l, mid, t->l), Build(mid+1, r, t->r);
}
void Add(int k, int y, int l, int r, node *u, node*&t)
{
if (t==blank) t=new(node), t->l=t->r=blank, t->sum=0;
t->sum=u->sum+y;
if (l==r) return; int mid=(l+r)>>1;
if (k<=mid)
t->r=u->r, Add(k, y, l, mid, u->l, t->l);
else
t->l=u->l, Add(k, y, mid+1, r, u->r, t->r);
}
inline void Change(int t, int k)
{
node *p; int v=k(t); k(t)=k;
for(int x=t; x<=n; x+=lowbit(x))
Add(v, -1, 1, ln, t(x), p=blank), t(x)=p;
for(int x=t; x<=n; x+=lowbit(x))
Add(k, 1, 1, ln, t(x), p=blank), t(x)=p;
}
inline int Query(int l, int r, int k)
{
n1=n2=0; k--;
for(int x=l-1; x; x-=lowbit(x)) r1[++n1]=t(x);
for(int x=r; x; x-=lowbit(x)) r2[++n2]=t(x);
int L=1, R=ln;
while (L<R)
{
int sum=0, mid=(L+R)>>1;
rep(j, 1, n1) sum-=r1[j]->l->sum;
rep(j, 1, n2) sum+=r2[j]->l->sum;
if (sum<=k)
{
L=mid+1, k-=sum;
rep(j, 1, n1) r1[j]=r1[j]->r;
rep(j, 1, n2) r2[j]=r2[j]->r;
}
else
{
R=mid;
rep(j, 1, n1) r1[j]=r1[j]->l;
rep(j, 1, n2) r2[j]=r2[j]->l;
}
}
return c[L];
}
void Init(){blank->l=blank->r=blank; blank->sum=0;}
int main()
{
n=V=read(), m=read(); Init();
rep(i, 1, n) num[i].v=read(), num[i].n=i;
rep(i, 1, m)
{
scanf("%s", ch);
if (ch[0]=='Q')
q[i][0]=1, q[i][1]=read(), q[i][2]=read(), q[i][3]=read();
else
{
q[i][0]=0, q[i][1]=read(), q[i][2]=read();
++V, num[V].v=q[i][2], num[V].n=n+i;
}
}
sort(num+1, num+V+1, cmp);
c[++ln]=num[1].v, k(num[1].n)=1;
rep(i, 2, V)
{
if (num[i].v != num[i-1].v) c[++ln]=num[i].v;
k(num[i].n)=ln;
}
Build(1, ln, t(0)=blank);
rep(i, 1, n)
{
node *p=t(0);
rep(j, i-lowbit(i)+1, i)
Add(k(j), 1, 1, ln, p, t(i)=blank), p=t(i);
}
rep(i, 1, m)
if (!q[i][0]) Change(q[i][1], k(n+i));
else printf("%d\n", Query(q[i][1], q[i][2], q[i][3]));
return 0;
}
BZOJ-2829 信用卡凸包的更多相关文章
- bzoj 2829 信用卡凸包(凸包)
2829: 信用卡凸包 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1342 Solved: 577 [Submit][Status][Disc ...
- BZOJ 2829 信用卡凸包 ——计算几何
凸包裸题 #include <map> #include <cmath> #include <queue> #include <cstdio> #inc ...
- 【BZOJ 2829】 2829: 信用卡凸包 (凸包)
2829: 信用卡凸包 Description Input Output Sample Input 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 Sa ...
- 【BZOJ2829】[SHOI2012]信用卡凸包(凸包)
[BZOJ2829][SHOI2012]信用卡凸包(凸包) 题面 BZOJ 洛谷 题解 既然圆角的半径都是一样的,而凸包的内角和恰好为\(360°\),所以只需要把圆角的圆心弄下来跑一个凸包,再额外加 ...
- [SHOI2012]信用卡凸包(凸包+直觉)
这个题还是比较有趣. 小心发现,大胆猜想,不用证明! 我们发现所谓的信用卡凸包上弧的长度总和就是圆的周长! 然后再加上每个长宽都减去圆的直径之后的长方形的凸包周长即可! #include<ios ...
- [BZOJ2829] 信用卡 (凸包)
[BZOJ2829] 信用卡 (凸包) 题面 信用卡是一个矩形,唯四个角做了圆滑处理,使他们都是与矩形两边相切的1/4园,如下图所示,现在平面上有一些规格相同的信用卡,试求其凸包的周长.注意凸包未必是 ...
- luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转
LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...
- BZOJ 2829 凸包
思路: 把信用卡周围去掉 只剩下中间的长方形 最后的答案加上一个圆 //By SiriusRen #include <bits/stdc++.h> using namespace std ...
- BZOJ2829信用卡凸包——凸包
题目描述 输入 输出 样例输入 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 样例输出 21.66 提示 本样例中的2张信用卡的轮廓在上图中用实线标出 ...
- P3829 [SHOI2012]信用卡凸包
思路 注意到结果就是每个信用卡边上的四个圆心的凸包周长+一个圆的周长 然后就好做了 注意平行时把距离小的排在前面,栈中至少要有1个元素(top>1),凸包中如果存在叉积为0的点也要pop,否则可 ...
随机推荐
- Java 守护线程(Daemon) 例子
当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序.当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程 ...
- UI与数据分离 与 UI的演进
解藕的好处:UI内部模块能够灵活的变化. MVC或者三层架构着重强调了数据.业务逻辑和UI的分离. (MVC中的C只是UI和业务逻辑模块间的一个中转组件,理论上应该是个轻模块.) 以前的关注的解藕技术 ...
- 得到本地应用程序的EXE的路径
实现效果: 知识运用: Application类的ExecutablePath属性 //获取启动了应用程序的可执行文件的路径和可执行文件的名称 public static string Exec ...
- python学习笔记-环境安装【1】
1.在 WINDOWS 下面要运行命令 pip install virtualenvwrapper-win才行 参考地址http://blog.csdn.net/liuhongyue/article/ ...
- Python——序列封包与序列解包
一.序列封包与序列解包 把多个值赋给一个变量时,Python会自动的把多个值封装成元组,称为序列封包. 把一个序列(列表.元组.字符串等)直接赋给多个变量,此时会把序列中的各个元素依次赋值给每个变量, ...
- MySQL对数据库数据进行复制的基本过程详解
MySQL对数据库数据进行复制的基本过程详解 这篇文章主要介绍了MySQL对数据库数据进行复制的基本过程,解读了Slave的一些相关配置,需要的朋友可以参考下 复制 复制是从一个MySQL服务器(ma ...
- ORACLE中RECORD、VARRAY、TABLE、IS REF CURSOR 的使用及实例详解
ORACLE中RECORD.VARRAY.TAB.IS REF CURSOR LE的使用及实例详解 create or replaceprocedure PRO_RECORD_ROW_TAB_EXAM ...
- 使用js将div高度设置为100%
在开发的工程中使用到了一些开源的bootstrap模板进行开发,在遇到一些需要替换的内容部分部分时,经常出现高度设置100%无法生效的问题,这里来用js强行设置一下. 思路:js监听窗口的缩放 ...
- MySQL创建数据库,用户,赋予权限
CREATE DATABASE 'voyager'; CREATE DATABASE `voyager`; CREATE USER 'dog'@'localhost' IDENTIFIED BY '1 ...
- 使用laravel框架的eloquent\DB模型连接多个数据库
1.配置.env文件 DB_HOST_TRAILER=127.0.0.1DB_PORT_TRAILER=3306DB_DATABASE_TRAILER=htms_trailerDB_USERNAME_ ...