SHOI2013 扇形面积并
题目链接:戳我
补一张图
我们尝试把圆上的扇形转化成直线上的矩形——我们维护[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 扇形面积并相关推荐
- BZOJ4418: [Shoi2013]扇形面积并
BZOJ4418: [Shoi2013]扇形面积并 Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. Input 第一行是三个整数n,m,k.n代表同心扇形的个数,m用 ...
- bzoj 4418: [Shoi2013]扇形面积并
题意:给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. 题解:很明显,最后结果肯定是几个扇形的面积的和.因为扇形面积=πR2×r−l2m=\pi R^2\times\frac{r-l}{2m} ...
- bzoj4418 [Shoi2013]扇形面积并 扫描线+二分+树状数组
Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. 对于100%的数据,1≤n≤105, 1≤m≤106,1≤k≤5000,1≤ri≤105,-m≤a1,a2≤m Sol ...
- [Luogu P3997] [BZOJ 4418] [SHOI2013]扇形面积并
洛谷传送门 BZOJ传送门 题目描述 给定 nnn 个同心的扇形,求有多少面积,被至少 k" role="presentation" style="positi ...
- bzoj4418 [Shoi2013]扇形面积并
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4418 [题解] 被题目名称吓死系列. 用一棵线段树维护当前有哪些半径. 那么将扇形差分,每段 ...
- 圆周角、圆心角、弦、弦心距、弧长、扇形面积
连接圆上任意两点的线段叫做弦,经过圆心的弦叫做直径,直径是一个圆里最长的弦 顶点在圆周上,并且两边都和圆相交的角叫做圆周角 顶点在圆心上的角叫做圆心角 ∠ACB.∠CBA.∠CAB都是圆周角:∠AOB ...
- 扇形面积公式,这样验证起来秒懂!
扇形是一个非常有意思的几何图形,它是在圆的基础上得到的,那么它的面积该怎么算呢?是否要借助圆形来得到呢?答案是肯定的,下面就一起来学习验证扇形面积公式的方法. 由于黑板式教学的局限性,现在都是多媒体教 ...
- 扇形面积公式如何推导?
中学时代,会接触并学习一些简单的几何图形,比如圆形,在熟练掌握了圆的有关知识后,会衍生出其它几何图形,比如扇形,就是在圆的基础上进行研究的.为了让学生们明白扇形面积公式的又来,可以利用专业的绘图工具制 ...
- 数学知识-扇形弧长、扇形面积
圆周长C=2πrC=2 \pi rC=2πr 圆面积S圆=πr2S_圆=\pi r^2S圆=πr2 扇形弧长 n是圆心角度数(角度制),α是圆心角度数(弧度制) 因,l弧=n360C圆因, l_弧= ...
最新文章
- jquery ajax(实现单独提交某个form)
- RPC框架几行代码就够了
- AIX errdemon 命令
- python字符串乘一个数_Python--初识庐山真面目
- HBase1.2.3 数据模型
- python展开list嵌套,并解决from compiler.ast import flatten报错ModuleNotFoundError: No module named ‘compiler‘
- xampp服务器搭建和使用
- 程序人生:程序员做外包“前途“,“技术“,“经验“如何决策
- LED液晶显示屏自动扫描测试软件特点,led显示屏控制软件自动校正是什么作用?...
- php内li背景色,CSS_css中ul li的背景小图标属性设置的两种情况,这里我们分两种情况列出: ① - phpStudy...
- RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-
- 联想无线网卡 linux驱动,联想R7000 Ubuntu无线网卡驱动
- 家里的钱都花哪儿了?做份支出记账表看看
- python bytes类型中是ascii码_Python3 中bytes数据类型深入理解(ASCII码对照表)
- [蓝牙 Mesh Zephyr]-[001]-Mesh beacon
- 大数据和人工智能未来发展趋势
- js设计模式--代理模式
- 华为南研所2015年面试经历总结
- elementUI 选择器 html
- 时间戳转换成标准日期