SHOI 2013 【扇形面积并】
早上考的,我打了80分的部分分,出来和同学讨论的时候真想扇自己一巴掌。。。。。。
题目描述:

给定 n 个同心的扇形,求有多少面积,被至少k 个扇形所覆盖。
输入输出格式
输入格式:
第一行是三个整数 n,m,k。n 代表同心扇形个数,m代表将(−π ,π ]的角度区间平均分成2m 份。
从第二行开始的 n 行,每行三个整数r,a1,a2。描述了一个圆心在原点的扇形,半径为r,圆心角是从弧度π*a1/mπ∗a1/m到π*a2/mπ∗a2/m(a1 不一定小于 a2)。
输出格式:
输出一个整数 ans ,π/2m*ansπ/2m∗ans等于至少k 个扇形所覆盖的总面积。数据保证答案在2^{63} - 1263−1范围内。
思路分析:
嗯,好,让我们先来看看部分分做法。
30分:
大暴力,就不讲了吧。
60分:
差分,因为所有半径都是一样的,所以我们只需要求出所有被覆盖过大于等于k次的段就可以了。
80分:
写一棵权值线段树,在顺便用一下差分思想(在起始的地方把半径加入权值线段树,在终止的时候把半径的地方-1就好了,然后每次查找最大值)。
100分:
嗯,在讲100分算法前先让我扇自己一巴掌。。。。。。
其实你们在看80分算法的时候应该心里都在嘀咕:这不是把求最大改成求第k大不就是正解了嘛?嗯,没错,就是这样。
我考场脑抽了竟然没想到,啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!
代码实现:
var
next_insert,val_insert,next_delete,val_delete:array[1..4000000]of longint;
head_insert,head_delete:array[-1000000..1000000]of longint;
cnt:array[-1000000..1000000]of longint;
a:array[1..2000000]of longint;
tot,tot_insert,tot_delete,v:longint;
ans,x,y,n,m,need,s,t,r:int64;
i,j:longint;
procedure add_insert(x,v:longint);
begin
inc(tot_insert);
next_insert[tot_insert]:=head_insert[x];
head_insert[x]:=tot_insert;
val_insert[tot_insert]:=v;
end;
procedure add_delete(x,v:longint);
begin
inc(tot_delete);
next_delete[tot_delete]:=head_delete[x];
head_delete[x]:=tot_delete;
val_delete[tot_delete]:=v;
end;
procedure add(s,t,r:int64);
begin
if s=t then exit;
inc(cnt[s]); add_insert(s,r);
dec(cnt[t]); add_delete(t,r);
end;
procedure update(k,l,r,x,z:longint);
var
mid:longint;
begin
a[k]:=a[k]+z;
if l=r then exit;
mid:=(l+r)>>1;
if x<=mid then update(k*2,l,mid,x,z) else update(k*2+1,mid+1,r,x,z);
end;
function query(k,l,r,need:longint):longint;
var
mid:longint;
begin
if l=r then exit(l);
mid:=(l+r)>>1;
if a[k*2+1]>=need then exit(query(k*2+1,mid+1,r,need))
else exit(query(k*2,l,mid,need-a[k*2+1]));
end;
begin
read(n,m,need);
for i:=1 to n do
begin
read(r,s,t);
//是不是觉得这个读入处理很恶心,嗯,我也这么觉得。。。。。。(当我看到a1不一定小于a2时,我真想提着西瓜刀去找出题人拼命)
if (s>=0)and(t>=0) then
begin
if s<t then add(s,t,r)
else
begin
add(s,m,r);
add(-m,0,r);
add(0,t,r);
end;
end else
if (s<0)and(t<0) then
begin
if s<t then add(s,t,r)
else
begin
add(-m,t,r);
add(0,m,r);
add(s,0,r);
end;
end else
if (s>=0)and(t<0) then
begin
add(s,m,r);
add(-m,t,r);
end else
if (s<0)and(t>=0) then
begin
add(0,t,r);
add(s,0,r);
end;
end;
for i:=-m to m-1 do
begin
j:=head_insert[i];
while j>0 do
begin
v:=val_insert[j];
update(1,0,100000,v,1);
j:=next_insert[j];
end;
j:=head_delete[i];
while j>0 do
begin
v:=val_delete[j];
update(1,0,100000,v,-1);
j:=next_delete[j];
end;
x:=x+cnt[i];
if x>=need then
begin
y:=query(1,0,100000,need);
ans:=ans+sqr(y);
end;
end;
writeln(ans);
end.
SHOI 2013 【扇形面积并】的更多相关文章
- 【BZOJ4418】[Shoi2013]扇形面积并 扫描线+线段树
[BZOJ4418][Shoi2013]扇形面积并 Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. Input 第一行是三个整数n,m,k.n代表同心扇形的个数,m用 ...
- 4418: [Shoi2013]扇形面积并|二分答案|树状数组
为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...
- SHOI2013 扇形面积并
题目链接:戳我 补一张图 我们尝试把圆上的扇形转化成直线上的矩形--我们维护[1,2*m]的区间,那么每个能产生贡献的子区间的长度*第K大的半径的平方的总和就是answer了. 怎么转化呢?左端点为a ...
- bzoj4418 [Shoi2013]扇形面积并
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4418 [题解] 被题目名称吓死系列. 用一棵线段树维护当前有哪些半径. 那么将扇形差分,每段 ...
- [SHOI 2013] 发微博
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4419 [算法] 用std :: set维护每个人的好友集合 当两人成为好友时将每人接 ...
- 求两圆相交部分面积(C++)
已知两圆圆心坐标和半径,求相交部分面积: #include <iostream> using namespace std; #include<cmath> #include&l ...
- POJ 2986 A Triangle and a Circle 圆与三角形的公共面积
计算几何模板 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h& ...
- hdu 4762 && 2013 ACM/ICPC 长春网络赛解题报告
这次的答案是猜出来的,如果做得话应该是应该是一个几何概型的数学题: 答案就是:n/(m^(n-1)); 具体的证明过程: 1.首先枚举这M个点中的的两个端点,概率是:n*(n-1); 2.假设这个蛋糕 ...
- Wannafly挑战赛25 B.面积并
链接 [https://www.nowcoder.com/acm/contest/197/B] 分析 特殊优先考虑 首先考虑r>=l这种情况就是圆的面积了 第二就是r<=内切圆的半径,这个 ...
随机推荐
- Codeforces 1389 题解(A-E)
AC代码 A. LCM Problem 若\(a < b\),则\(LCM(a,b)\)是\(a\)的整数倍且\(LCM(a,b) \ne a\),所以\(LCM(a,b) \ge 2a\),当 ...
- 在GitLab pages上快速搭建Jekyll博客
前一段时间将我的Jekyll静态博客从github pages镜像部署到了 zeit.co(现vercel)上了一份,最近偶然发现gitlab pages也不错,百度也会正常抓取,于是动手倒腾,将gi ...
- Ajxax技术-1
1.什么是Ajax Ajax: Asynchronous javascript and xml (异步javascript和xml). ==Ajax并不是一种新技术,而是已有技术的集合.JavaScr ...
- 实验 1:Mininet 源码安装和可视化拓扑工具
实验 1:Mininet 源码安装和可视化拓扑工具 一.实验目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具. 二.实验任务 使用源码安装 Mininet 的 2.3 ...
- 让document.write的广告无阻塞的加载
广告代码分析 很多第三方的广告系统都是使用document.write来加载广告,如下面的一个javascript的广告链接. 1 <script type="text/javascr ...
- Vue 事件的高级使用方法
Vue 事件的高级使用方法 事件方法 在Vue中提供了4中事件监听方法,分别是: $on(event: string | Array, fn) $emit(event: string) $once(e ...
- [LeetCode]1114. 按序打印(并发)
####题目 我们提供了一个类: public class Foo { public void one() { print("one"); } public void tw ...
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...
- 一道JavaScript的二维数组求平均数的题
JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...
- Arnold变换(猫脸变换)
Arnold变换是Arnold在遍历理论研究中提出的一种变换.由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换.Arnold变换可以对图像进行置乱,使得原本有意义的图像变成 ...