早上考的,我打了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 【扇形面积并】的更多相关文章

  1. 【BZOJ4418】[Shoi2013]扇形面积并 扫描线+线段树

    [BZOJ4418][Shoi2013]扇形面积并 Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. Input 第一行是三个整数n,m,k.n代表同心扇形的个数,m用 ...

  2. 4418: [Shoi2013]扇形面积并|二分答案|树状数组

    为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...

  3. SHOI2013 扇形面积并

    题目链接:戳我 补一张图 我们尝试把圆上的扇形转化成直线上的矩形--我们维护[1,2*m]的区间,那么每个能产生贡献的子区间的长度*第K大的半径的平方的总和就是answer了. 怎么转化呢?左端点为a ...

  4. bzoj4418 [Shoi2013]扇形面积并

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4418 [题解] 被题目名称吓死系列. 用一棵线段树维护当前有哪些半径. 那么将扇形差分,每段 ...

  5. [SHOI 2013] 发微博

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4419 [算法] 用std :: set维护每个人的好友集合 当两人成为好友时将每人接 ...

  6. 求两圆相交部分面积(C++)

    已知两圆圆心坐标和半径,求相交部分面积: #include <iostream> using namespace std; #include<cmath> #include&l ...

  7. POJ 2986 A Triangle and a Circle 圆与三角形的公共面积

    计算几何模板 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h& ...

  8. hdu 4762 && 2013 ACM/ICPC 长春网络赛解题报告

    这次的答案是猜出来的,如果做得话应该是应该是一个几何概型的数学题: 答案就是:n/(m^(n-1)); 具体的证明过程: 1.首先枚举这M个点中的的两个端点,概率是:n*(n-1); 2.假设这个蛋糕 ...

  9. Wannafly挑战赛25 B.面积并

    链接 [https://www.nowcoder.com/acm/contest/197/B] 分析 特殊优先考虑 首先考虑r>=l这种情况就是圆的面积了 第二就是r<=内切圆的半径,这个 ...

随机推荐

  1. 为什么 char 数组比 String 更适合存储密码?

    推荐阅读:5 个刁钻的 String 面试题! 另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题. 这是一个真正艰难的核心 Java 面试问题, ...

  2. 本地模拟 gitlab ci 的 demo 项目

    构建好的镜像能跑起来, 项目地址: https://github.com/szliugx/gitlab-ci-local 为了不每次提交,本地可以做一些模拟 gitlab ci 的测试≍,主要实现方式 ...

  3. Zookeeper源码解读

    1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...

  4. leetcode刷题-43字符串相乘

    题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 思路 字符串转数字:从字符串第一位开始取,每次取出的值转换为数字 ...

  5. 在 Windows 上安装 Composer

    a.去官网 getcomposer.org 下载安装程序 b.运行安装程序,需要开启三个扩展 openssl.curl.mbstring,没有开启的话 composer 也可以帮助开启:会自动将com ...

  6. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

  7. Git切换分支开发

    入职第一家公司做开发的时候使用的项目版本管理工具是svn,公司内部搭建的服务器:在第二.第三家公司做开发的时候,使用的项目版本管理工具是Git,现在大多数公司使用的也是Git.刚进入公司的时候首先做的 ...

  8. 快速排序之C实现和JS实现的区别

    快速排序是面试中的几乎必问的问题,理解之后发现并不难,在此贴出两种版本,与小伙伴们相互交流 PS:今天码代码非常有感觉,所以连发三篇博客,下午打球,手感也是热的发烫,希望不忘初心,方得始终. 进入正题 ...

  9. C语言的运算符

    操作数 :参与运算的变量 表达式:有意义有结果的语句 运算符的分类:1.按照功能运算符划分:算术运算符 关系运算符 逻辑运算符 位运算 2.按照参与运算的操作数个数划分:单目运算(只有一个操作数) 双 ...

  10. Linux实战(4):Centos7升级python

    记一笔升级python后产生的问题,并给予解决方案.莫慌看下文: 升级python3 我是直接 yum安装的,当然安装方法有很多,不喜欢此安装方式的可选用其他方式,我再此就不一一解释了.安装方式可不同 ...