题目传送门

题目描述

给定 n 个同心的扇形,求有多少面积,被至少k 个扇形所覆盖。

输入输出格式

输入格式:

第一行是三个整数 n,m,k。n 代表同心扇形个数,m代表将(−π ,π ]的角度

区间平均分成2m 份。

从第二行开始的 n 行,每行三个整数r,a1,a2。描述了一个圆心在原点的

扇形,半径为r,圆心角是从弧度

π∗a1/mπ*a1/mπ∗a1/m到π∗a2/mπ*a2/mπ∗a2/m(a1 不一定小于 a2)。

输出格式:

输出一个整数 ans ,π/2m∗ansπ/2m*ansπ/2m∗ans等于至少k 个扇形所覆盖的总面积。

数据保证答案在263−12^{63} - 1263−1范围内。

输入输出样例

输入样例#1: 复制

3 8 2
1 -8 8
3 -7 3
5 -5 5

输出样例#1: 复制

76

输入样例#2: 复制

2 4 1
4 -4 2
1 -4 4

输出样例#2: 复制

98

说明

1≤n≤10^5, 1≤m≤10^6,1≤k≤5000,1≤ri≤10^5,-m≤a1,a2≤m


【思路分析】

第一眼看到这个题以为是计算几何,一看通过数也不多,又是一道算几毒瘤题。。。但是我们仔细看看,发现数据都是整数,并且良心出题人将输出数据都为你做成了整数,感觉似乎就不像毒瘤算几了??!!再观察发现将圆划分成了相等的几块小区间,顿时感觉这道题变更成了区间问题了,我们尝试用线段树搞一搞??!!

对于查询被至少k个扇形覆盖的区间,等同于查询当前区间覆盖了扇形的第k大半径,既然有k的存在,那么数据结构无非就是平衡树和权值线段树,发现区间很多,平衡树不方便维护区间与区间之间的关系,那么我们考虑用权值线段树,区间k大问题??主席树板题??!!,其实不然,我们并不需要用主席树,只用开一棵权值线段树即可。

我们将扇形按起点排序,发现这就有点类似于扫描线,有下边界,有上边界,差分维护扇形起点终点即可。

然而我们发现这道题是有环的,即一个扇形的可能跨过我们的起点(而矩形面积并则不会),我们只需要将这样的扇形拆分成两块维护即可。。。AC了??!!

这次就真的应该可以A了!!!


【代码实现】

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 typedef long long ll;
 8 void read(int &x)
 9 {
10     int f;char ch;
11     while(!isdigit(ch=getchar())&&ch!='-'); ch=='-'?(f=-1,x=0):(f=1,x=ch-'0');
12     while(isdigit(ch=getchar())) x=x*10+ch-'0';x=x*f;
13 }
14 const int N=1e5+5,M=1e6+5;
15 struct sd{
16     int son[2],num;
17 }t[N<<1];
18 int n,m,k,cnt,root,mx;
19 vector<int> cf[M<<1];
20 void insert(int &v,int l,int r,int pos,int add)
21 {
22     if(!v) v=++cnt;t[v].num+=add;
23     if(l==r) return;
24     int mid=l+r>>1;
25     if(pos<=mid) insert(t[v].son[0],l,mid,pos,add);
26     else insert(t[v].son[1],mid+1,r,pos,add);
27 }
28 int ask(int v,int l,int r,int k)
29 {
30     if(l==r) return l;
31     int mid=l+r>>1,ls=t[v].son[0],rs=t[v].son[1];
32     if(t[ls].num>=k) return ask(ls,l,mid,k);
33     else return ask(rs,mid+1,r,k-t[ls].num);
34 }
35 ll mul(ll a){return a*a;}
36 int main()
37 {
38     int l,r,ri;
39     read(n),read(m),read(k);
40     for(int i=1;i<=n;i++){
41         read(ri),read(l),read(r);
42         l+=m+1,r+=m;
43         if(l==2*m+1) l=1;if(r==2*m) r=-1;
44         if(r==-1) cf[l].push_back(ri);
45         else if(l>r) cf[l].push_back(ri),cf[1].push_back(ri),cf[r+1].push_back(-ri);
46         else cf[l].push_back(ri),cf[r+1].push_back(-ri);
47         mx=max(ri,mx);
48     }
49     ll ans=0;
50     for(int i=1;i<=2*m;i++)
51     {
52         int ss=cf[i].size();
53         for(int j=0;j<ss;j++)
54         if(cf[i][j]>0){
55             int gg=cf[i][j];
56             insert(root,1,mx,cf[i][j],1);
57         }
58         else insert(root,1,mx,-cf[i][j],-1);
59         if(t[root].num>=k) ans=ans+mul(1ll*ask(root,1,mx,t[root].num-k+1));
60     }
61     printf("%lld",ans);
62     return 0;
63 }

转载于:https://www.cnblogs.com/genius777/p/9693669.html

题解报告——扇形面积并相关推荐

  1. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  2. bzoj 4418: [Shoi2013]扇形面积并

    题意:给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. 题解:很明显,最后结果肯定是几个扇形的面积的和.因为扇形面积=πR2×r−l2m=\pi R^2\times\frac{r-l}{2m} ...

  3. BZOJ4418: [Shoi2013]扇形面积并

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

  4. CSP-2019day1题解报告

    day1题解报告 题目 T1 T2 从链想起 转为正解 T3(摘自同级大佬xez) 题目 T1传送门 T2传送门 T3传送门 T1 乍一看,这道题做过,可以用对称性做,如果他的长度过了一半,就输出1, ...

  5. 圆周角、圆心角、弦、弦心距、弧长、扇形面积

    连接圆上任意两点的线段叫做弦,经过圆心的弦叫做直径,直径是一个圆里最长的弦 顶点在圆周上,并且两边都和圆相交的角叫做圆周角 顶点在圆心上的角叫做圆心角 ∠ACB.∠CBA.∠CAB都是圆周角:∠AOB ...

  6. 爆炸的符卡洋洋洒洒题解报告

    爆炸的符卡洋洋洒洒题解报告 标签:动态规划 题目链接 来源:牛客网 解题思路: 显而易见的背包问题 但再观察a,b的数据范围,开不了那么大的dp数组 这就启发我们去优化,由于题目要求魔力总耗的是k的倍 ...

  7. 2022杭电多校5题解报告(同步自语雀)

    一.赛后总结 Wuhu~萌新又来啦~ 第一次在考场上写出NTT,虽然是比较裸,但感觉真的不错~ 开场看03,思路比较直,就是dijk,但跨层跳跃想了好久~最后想到了类似于B树或者B-树一类的层内链表, ...

  8. 2022杭电多校4题解报告(同步自语雀)

    一.赛后总结 嘤嘤嘤,本人纯萌新,深夜反思自己到底有多菜~(:′⌒`) 前天没写出状压,再前面不会SAM和圆方树,再往前不会NTT和FFT,真的是个啥也不会的萌新呢. 这场主要的问题在于02的0环和1 ...

  9. 2022牛客多校2题解报告(同步自语雀)

    一.赛后总结 总结就是缺乏清晰的大脑,当然一切的一切归因于实力不足. 开局看K,半个小时推出DP式子,交了就WA.差错没查出来,写了暴力对拍,就去看D了.后来拍了3个小时也没出问题...可能是数据生成 ...

最新文章

  1. Linux的sysctl 命令参数详解
  2. 编写彩色空间转换程序:YUVtoRGB
  3. 多线程小抄集(新编四)
  4. android异步更新UI
  5. 为何加入了AddType就无法启动Apache
  6. SQL Server:触发器详解
  7. 网际控制报文协议ICMP(Internet Control Message Protocol)(详解)
  8. linux重定向串口打印到telnet
  9. python基础学习--字符串和文件数据处理--附代码
  10. C++面试题,平时面试不可缺少的!
  11. tkinter python(图形开发界面) 转自:渔单渠
  12. 笨方法学python 习题42
  13. 永洪BI产品体验(一)数据源模块
  14. Python读取图像数据的常用方法
  15. 用Java写一个简易五子棋游戏
  16. 华为路由器子接口,vlan
  17. firefox调试html5程序,用 Firefox 开发者工具调试现代 Web 应用程序
  18. Linux下优秀的音频编辑软件
  19. 常用网络ip地址有哪些
  20. 漫画 | 连绿巨人都想要了解的Greenplum

热门文章

  1. 2021-09-16登录国际域名邮箱发邮件,如何在众多国际邮件地址中脱颖而出?
  2. 计算机控制器 硬件,计算机硬件系统—CPU(运算器和控制器)(一)
  3. 计算机使用别名的优点,香港空间购买,香港虚拟主机购买,香港免备案空间购买...
  4. R语言 - CRAN介绍
  5. 【转】gcc for Windows 开发环境介绍
  6. 淘宝商品详情页原型图
  7. 解决360浏览器或者IE等浏览器使用element 中的el-pagination分页点击有黑框问题
  8. 服务器系统如何校验md5值,怎么验证md5-NTP的MD5加密
  9. 文本框只允许输入数字
  10. Genymotion