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<=内切圆的半径,这个 ...
随机推荐
- 基于模板特化的Lua自动绑定系统
LuaBind http://www.rasterbar.com/products/luabind.html http://blog.sina.com.cn/s/blog_646817c00100gk ...
- 【Gin-API系列】实现路由分组(七)
在之前的文章介绍中我们已经完成了一个API服务的全链路请求设计.调用方式可以看Test目录的代码 // src/test/request_test.go func TestAPI_Request(t ...
- 使用docker部署hadoop集群
最近要在公司里搭建一个hadoop测试集群,于是采用docker来快速部署hadoop集群. 0. 写在前面 网上也已经有很多教程了,但是其中都有不少坑,在此记录一下自己安装的过程. 目标:使用doc ...
- 搭建好lnmp后,使用浏览器访问,出现404 Not Found
出现404 Not Found的原因是nginx指向页面不存在,编辑nginx配置文件,修改nginx指向页面路径 root html; 修改为 root /usr/share/nginx/html; ...
- C#知识点:操作XML
XML是什么就不用说了文本标记语言. 主要纪录如何对XML文件进行增删改查. Xml的操作类都存在System.xml命名空间下面. 应用型的直接上代码 using System; using Sys ...
- SpringBoot程序启动时在Oracle数据库中建表充值
例子工程下载链接:https://files.cnblogs.com/files/xiandedanteng/gatling20200428-1.zip 需求:在工程启动时在Oracle数据库中建表. ...
- MySQL查询point类型类型的坐标,返回经度纬度
location字段为point类型的空间坐标 SELECT id, name, address, x(location) as 经度, Y(location) as 纬度, ROUND( 6378. ...
- URL 传参转义 (特殊符号转义)
问题: url参数中 存在+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好? 解决办法:将这些字符转化成服务器可以识别的字符,对应关系如下:URL ...
- C#中SQL Server的几点注意事项
背景 在C#中处理sql会遇到一些奇怪的问题,在这里做一个小的总结,内容会随着经历不断积累. 内容 1.DataTime?和DataTime的区别. DataTime?定义的数据为可空类型,允许其为 ...
- 单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)
一.定义 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果 ...