凸包题。

我们先把所有信用卡的四个定点的坐标求出来,然后计算凸包长度,最后加上一个圆的周长就行。

#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 信用卡凸包的更多相关文章

  1. bzoj 2829 信用卡凸包(凸包)

    2829: 信用卡凸包 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1342  Solved: 577 [Submit][Status][Disc ...

  2. BZOJ 2829 信用卡凸包 ——计算几何

    凸包裸题 #include <map> #include <cmath> #include <queue> #include <cstdio> #inc ...

  3. 【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 ...

  4. 【BZOJ2829】[SHOI2012]信用卡凸包(凸包)

    [BZOJ2829][SHOI2012]信用卡凸包(凸包) 题面 BZOJ 洛谷 题解 既然圆角的半径都是一样的,而凸包的内角和恰好为\(360°\),所以只需要把圆角的圆心弄下来跑一个凸包,再额外加 ...

  5. [SHOI2012]信用卡凸包(凸包+直觉)

    这个题还是比较有趣. 小心发现,大胆猜想,不用证明! 我们发现所谓的信用卡凸包上弧的长度总和就是圆的周长! 然后再加上每个长宽都减去圆的直径之后的长方形的凸包周长即可! #include<ios ...

  6. [BZOJ2829] 信用卡 (凸包)

    [BZOJ2829] 信用卡 (凸包) 题面 信用卡是一个矩形,唯四个角做了圆滑处理,使他们都是与矩形两边相切的1/4园,如下图所示,现在平面上有一些规格相同的信用卡,试求其凸包的周长.注意凸包未必是 ...

  7. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  8. BZOJ 2829 凸包

    思路: 把信用卡周围去掉  只剩下中间的长方形 最后的答案加上一个圆 //By SiriusRen #include <bits/stdc++.h> using namespace std ...

  9. BZOJ2829信用卡凸包——凸包

    题目描述 输入 输出 样例输入 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 样例输出 21.66 提示 本样例中的2张信用卡的轮廓在上图中用实线标出 ...

  10. P3829 [SHOI2012]信用卡凸包

    思路 注意到结果就是每个信用卡边上的四个圆心的凸包周长+一个圆的周长 然后就好做了 注意平行时把距离小的排在前面,栈中至少要有1个元素(top>1),凸包中如果存在叉积为0的点也要pop,否则可 ...

随机推荐

  1. 基于 Ubuntu + nextCloud 搭建自己的私人网盘

    提醒一下,如果之前通过apache搭建了网站,不要用snap命令来搭建,否则,至少有一个无法正常运行(不要问我怎么知道的,都是血的教训啊). 你可以通过腾讯云的实验主机进行尝试. 1.基础设置 切换为 ...

  2. hd - MFM/IDE 硬盘设备

    描述 DESCRIPTION hd* 开头的设备是以裸模式(raw mode)访问MFM/IDE类型硬盘的块设备. 第一个IDE驱动控制器上的主盘(主设备号3)是 hda ;从盘是 hdb. 第二个I ...

  3. win7便笺元数据损坏,最新解决办法

    Windows7系统开机时出现“部分便笺的元数据已被破坏,便笺已将其恢复为默认值.”问题,最新解决办法,图文说明,亲测,希望可以帮到大家 工具/原料   Windows7系统 InkObj.dll.T ...

  4. kubernetes-平台日志收集(ELK)

    使用ELK Stack收集Kubernetes平台中日志与可视化 K8S系统的组件日志 K8S Cluster里面部署的应用程序日志 日志系统: ELK安装 安装jdk [root@localhost ...

  5. BCB:使用CppWebBrowser判断网页加载完成

    void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *U ...

  6. js判断是否为app

    var ua = navigator.userAgent; var isapp = ua.match("lenovomallapp") == null ? 0 : 1;

  7. vue axios 请求 https 的特殊处理

    最近遇到自签发的CA证书,在前端axios请求https请求时,无法自动加载证书. 解决方法:将无法加载的请求在浏览器新窗口手动加载,选择继续连接. 重新加载,问题解决. 根本原因:因为自签发证书,浏 ...

  8. bootstrap 超大屏幕(Jumbotron)

    本章将讲解Bootstrap的一个特性:超大屏幕(Jumbonron),顾名思义该组件可以增加标题的大小,并为登录页面的内容添加更多的外边矩. 使用超大屏幕的步骤如下: 1.创建一个还有class.j ...

  9. error PRJ0019: 工具从 “正在执行生成后事件... ”

    error PRJ0019: 工具从"正在执行生成后事件..." 原因是属性->生成事件->生成后事件 命令行设置错误导致的,修改即可 因为path前面有空格,所以这里 ...

  10. Inkscape基础

    What is Inkscape A program for creating vector graphics For Windows, Mac OS, and Linux Open source F ...