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<=内切圆的半径,这个 ...
随机推荐
- 【HttpRunner v3.x】笔记 ——2. 用脚手架快速创建项目
环境装好了,相信很多童鞋已经迫不及待的想run起来了,但是面对一个陌生的框架又无从下手.没关系,我们可以用脚手架来快速生成一个httprunner项目. 一.快速生成项目 我们不妨先输入httprun ...
- 【python】超有用的集合类collections,不来了解一下?
在使用Python的过程中,一定是离不开数据结构的, 也就是List-列表,Tuples-元组,Dictionaries-字典. 那实际应用中我们更多的还是要去操作这些结构里的数据.比如,在列表后面添 ...
- 无法从NVIDA官网下载安装CUDA安装包?NVIDA官网怎么了?
最近几天由于不知名的原因,导致很多人无法从官网下载NVIDA的CUDA安装包,下载时,浏览器提示此文件可能危害你的计算机,选择保留下载下来也只是一个42字节的exe文件 双击进行安装又出现以下问题: ...
- Tomcat三实例cluster多播方案共享session再配置
昨天已经将两实例cluster多播方案共享Session配置成功,其中的关键就在于server.xml中,engine->channel->receiver节点中address得写成自己的 ...
- Tomcat源码分析(类加载与类加载器)
Tomcat的挑战 Tomcat上可以部署多个项目 Tomcat的一般部署,可以通过多种方式启动一个Tomcat部署多个项目,那么Tomcat在设计时会遇到什么挑战呢? Tomcat运行时需要加载哪些 ...
- Mybatis-使用注解开发
使用注解开发 [toc] 1. 面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 ...
- python基础:面向对象
一.定义 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类:一个种类,一个模型. 对象:指具体的东西,模型造出来的东西叫做对象. 实例:实例和对象是一样的. 实例化:实例化就 ...
- synchronized的实现原理——锁膨胀过程
@ 目录 前言 正文 偏向锁 轻量锁 批量重偏向 批量撤销 重量锁 总结 前言 上一篇分析了优化后的synchronized在不同场景下对象头中的表现形式,还记得那个结论吗?当一个线程第一次获取锁后再 ...
- 编程体系结构(03):Java集合容器
本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...
- Robotframework自动化1-Windows环境搭建
前言: robotframework环境搭建-环境准备 1.python2,pip2 2.WxPython 3.Robot Framework 4.Robotframework-ride 5.RIDE ...