题目链接:戳我

补一张图

我们尝试把圆上的扇形转化成直线上的矩形——我们维护[1,2*m]的区间,那么每个能产生贡献的子区间的长度*第K大的半径的平方的总和就是answer了。

怎么转化呢?左端点为a1+m+1,右端点为a2+m。为什么要+m?因为原先的范围是[-m,m]的,所以整体右移。为什么左端点要+1?因为我们维护的是区间,所以这里的每一个下标表示的是以该position为右端点,长度为1的区间。

我们先按照半径长度从大到小排序,如果一个区间覆盖数量超过K个,就不需要再处理了。(优化时间复杂度)

之后就是线段树操作了。我们在更改的同时求出答案。(其实分开写也行,就是要注意因为我们乘上的系数使然,所以区间必须也是当前的修改区间)

minn表示该区间的所有子区间覆盖量的min,maxx是该区间的所有子区间的覆盖量的max。

注意我们的siz是由左右子区间合并而来的。所以产生贡献之后,记得赋值为0,这样就不会对它的父亲区间产生贡献了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 2000010
using namespace std;
int n,m,k;
long long ans=0;
struct Node{int l,r,c;}node[MAXN];
struct Node2{int l,r,tag,minn,maxx,siz;}t[MAXN<<2];
inline bool cmp(struct Node x,struct Node y){return x.c>y.c;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void push_up(int x)
{t[x].maxx=max(t[ls(x)].maxx,t[rs(x)].maxx);t[x].minn=min(t[ls(x)].minn,t[rs(x)].minn);t[x].siz=t[ls(x)].siz+t[rs(x)].siz;
}
inline void build(int x,int l,int r)
{t[x].l=l,t[x].r=r;if(l==r) {t[x].siz=1;return;}int mid=(l+r)>>1;build(ls(x),l,mid);build(rs(x),mid+1,r);push_up(x);
}
inline void solve(int x,int k)
{t[x].tag+=k;t[x].minn+=k;t[x].maxx+=k;
}
inline void push_down(int x)
{int l=t[x].l,r=t[x].r;if(t[x].tag){solve(ls(x),t[x].tag);solve(rs(x),t[x].tag);t[x].tag=0;}
}
inline int update_query(int x,int ll,int rr)
{int l=t[x].l,r=t[x].r;if(t[x].minn>=k) return 0;if(ll<=l&&r<=rr){if(t[x].maxx<k-1) {t[x].minn++,t[x].maxx++,t[x].tag++;return 0;}if(t[x].minn>=k-1) {int cur_ans=t[x].siz;t[x].siz=0;t[x].minn++;return cur_ans;} int cur_ans=0;push_down(x);cur_ans+=update_query(ls(x),ll,rr);cur_ans+=update_query(rs(x),ll,rr);push_up(x);return cur_ans;}push_down(x);int mid=(l+r)>>1;int cur_ans=0;if(ll<=mid) cur_ans+=update_query(ls(x),ll,rr);if(mid<rr) cur_ans+=update_query(rs(x),ll,rr);push_up(x);return cur_ans;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++) {scanf("%d%d%d",&node[i].c,&node[i].l,&node[i].r);node[i].l+=m+1;node[i].r+=m;}sort(&node[1],&node[n+1],cmp);build(1,1,m*2);for(int i=1;i<=n;i++){int cur_ans=0;if(node[i].l<node[i].r)cur_ans+=update_query(1,node[i].l,node[i].r);else if(node[i].l>node[i].r){cur_ans+=update_query(1,node[i].l,m*2);cur_ans+=update_query(1,1,node[i].r);}ans+=1ll*cur_ans*node[i].c*node[i].c;//printf("i=%d ans=%lld\n",i,ans);}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10491784.html

SHOI2013 扇形面积并相关推荐

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

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

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

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

  3. bzoj4418 [Shoi2013]扇形面积并 扫描线+二分+树状数组

    Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. 对于100%的数据,1≤n≤105, 1≤m≤106,1≤k≤5000,1≤ri≤105,-m≤a1,a2≤m Sol ...

  4. [Luogu P3997] [BZOJ 4418] [SHOI2013]扇形面积并

    洛谷传送门 BZOJ传送门 题目描述 给定 nnn 个同心的扇形,求有多少面积,被至少 k" role="presentation" style="positi ...

  5. bzoj4418 [Shoi2013]扇形面积并

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

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

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

  7. 扇形面积公式,这样验证起来秒懂!

    扇形是一个非常有意思的几何图形,它是在圆的基础上得到的,那么它的面积该怎么算呢?是否要借助圆形来得到呢?答案是肯定的,下面就一起来学习验证扇形面积公式的方法. 由于黑板式教学的局限性,现在都是多媒体教 ...

  8. 扇形面积公式如何推导?

    中学时代,会接触并学习一些简单的几何图形,比如圆形,在熟练掌握了圆的有关知识后,会衍生出其它几何图形,比如扇形,就是在圆的基础上进行研究的.为了让学生们明白扇形面积公式的又来,可以利用专业的绘图工具制 ...

  9. 数学知识-扇形弧长、扇形面积

    圆周长C=2πrC=2 \pi rC=2πr 圆面积S圆=πr2S_圆=\pi r^2S圆​=πr2 扇形弧长 n是圆心角度数(角度制),α是圆心角度数(弧度制) 因,l弧=n360C圆因, l_弧= ...

最新文章

  1. jquery ajax(实现单独提交某个form)
  2. RPC框架几行代码就够了
  3. AIX errdemon 命令
  4. python字符串乘一个数_Python--初识庐山真面目
  5. HBase1.2.3 数据模型
  6. python展开list嵌套,并解决from compiler.ast import flatten报错ModuleNotFoundError: No module named ‘compiler‘
  7. xampp服务器搭建和使用
  8. 程序人生:程序员做外包“前途“,“技术“,“经验“如何决策
  9. LED液晶显示屏自动扫描测试软件特点,led显示屏控制软件自动校正是什么作用?...
  10. php内li背景色,CSS_css中ul li的背景小图标属性设置的两种情况,这里我们分两种情况列出: ① - phpStudy...
  11. RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-
  12. 联想无线网卡 linux驱动,联想R7000 Ubuntu无线网卡驱动
  13. 家里的钱都花哪儿了?做份支出记账表看看
  14. python bytes类型中是ascii码_Python3 中bytes数据类型深入理解(ASCII码对照表)
  15. [蓝牙 Mesh Zephyr]-[001]-Mesh beacon
  16. 大数据和人工智能未来发展趋势
  17. js设计模式--代理模式
  18. 华为南研所2015年面试经历总结
  19. elementUI 选择器 html
  20. 时间戳转换成标准日期

热门文章

  1. WPF--Prism框架安装初识
  2. 中美印日四国程序员比较------wuzhimin
  3. 打造全自动B站录播机
  4. SQL_MODE设置之ansi_quotes
  5. 多维数组np.pad函数的理解
  6. oracle awr ash,Oracle AWR ASH
  7. Eclipse导出可执行Jar包及相关资源路径的处理
  8. C语言——二进制转十六进制
  9. Omi × 云开发『半天』搞定小程序 『markdown 内容发布系统』
  10. 插入脚注时分栏正文跳至下页的解决办法