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,否则可 ...
随机推荐
- Linux 备份
备份之前的准备工作 安装常用的软件 常用软件的安装,见我另一篇blog Ubuntu 16.04 安装札记 的第四部分. 清理系统中没用的垃圾 至于垃圾清理,主要清理对象有 sudo rm -r ~/ ...
- 导入文件 服务器报错,有可能是 开发时候是window 服务器是linux,两个系统的文件系统的/和\是相反的,要注意这块
导入文件 服务器报错,有可能是 开发时候是window 服务器是linux,两个系统的文件系统的/和\是相反的,要注意这块
- angular设置反向代理
本地调试,需要用到服务器的api,发现chrome安全问题,需要解决跨域问题.现给出解决方案: 1.增加proxy.conf.json文件 位置与package.json文件同级(可指定) 2.pac ...
- python 嵌套作用域 闭包函数
#闭包函数 def multiplier(factor): def multiplyByFactory(number): return number*factor return multiplyByF ...
- python中yield的用法详解
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...
- 主成分分析法(PCA)答疑
问:为什么要去均值? 1.我认为归一化的表述并不太准确,按统计的一般说法,叫标准化.数据的标准化过程是减去均值并除以标准差.而归一化仅包含除以标准差的意思或者类似做法.2.做标准化的原因是:减去均值等 ...
- cocos2dx 3.x lua 网络加载并且保存资源(unix、linux)
#ifndef __DazzleParkour__TextLoader__ #define __DazzleParkour__TextLoader__ #include <stdio.h> ...
- Android读书笔记一
通过本章的学习真实体会到“移植”的概念:为特定设备定制Android的过程,但是移植的过程中开发最多的就是支持各种硬件设备的Linux驱动程序,本章对Android和Linux做了总体介绍.接着介绍了 ...
- 标准C++(3)重载
一.函数的重载 c++中同一作用域下能够定义同名的函数(这就叫重载),但必须满足如下要求: 1.函数的参数列表必须不同,可以使参数数量不同,也可以使参数的类型不同,甚至是参数的顺序不同. 2.函数的返 ...
- NodeJS基础入门-Event
大多数Node.js核心API都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器). 例如,net.Server对象会在每次有新连接时触发事件;fs ...