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,否则可 ...
随机推荐
- 在DataGridView控件中显示图片
实现效果: 知识运用: DataGridView控件的DataSource属性 实现代码: private void Form1_Load(object sender, EventArgs e) { ...
- Windows上PostgreSQL安装配置教程
Windows上PostgreSQL安装配置教程 这篇文章主要为大家详细介绍了Windows上PostgreSQL安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PostgreSQL的 ...
- CF #552 div3
A - Restoring Three Numbers CodeForces - 1154A Polycarp has guessed three positive integers aa, bb a ...
- 消息队列之 Kafka
转 https://www.jianshu.com/p/2c4caed49343 消息队列之 Kafka 预流 2018.01.15 16:27* 字数 3533 阅读 1114评论 0喜欢 12 K ...
- MySQL中CONCAT()的用法
MySQL中CONCAT()的用法 在日常开发过程中,特别是在书写接口的时候,经常会遇到字符串拼接的情况,比如在返回图片数据时,数据库里往往存储的是相对路径,而接口里一般是存放绝对地址,这就需要字符串 ...
- Python9-网络编程-day30
# 由于不同机器上的程序要通信,才产生了网络# server# client# 端口 找到的程序# 在计算机上,每一个需要网络通信的程序,都会开一个端口# 在同一时间只会有一个程序占用一个端口# 不可 ...
- 数学基础:HUD1406-完数
完数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Descript ...
- 如何用treap写luogu P3391
treap大法好!!! splay什么的都是异端 --XZZ 先%FHQ为敬 (fhq)treap也是可以搞区间翻转的 每次把它成(1~L-1)(L~R)(R+1~n)三块然后打标记拼回去 对于有标记 ...
- 大数据学习——spark-steaming学习
官网http://spark.apache.org/docs/latest/streaming-programming-guide.html 1.1. 用Spark Streaming实现实时Wor ...
- 大数据学习——scala类相关操作
1 类的定义 package com /** * Created by Administrator on 2019/6/3. */ //类并不用声明为public. class Person { // ...