【线段树】扇形面积并(P3997)

2024-01-29 23:32
文章标签 面积 线段 扇形 p3997

本文主要是介绍【线段树】扇形面积并(P3997),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正题

P3997


题目大意

给若干扇形,问你叠了至少k次的面积


解题思路

把园展开,然后用线段树维护每个点的出现次数

当最大次数大于k,用log的时间查找该点,然后计算结果,因为最多只有2*n次查找,所以不会TLE


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
using namespace std;
ll n,m,k,ans;
struct node
{ll r,s,t;
}a[N];
bool cmp(node a,node b)
{return a.r>b.r;
}
struct Tree
{#define ls x*2#define rs x*2+1ll mx[N*10<<3],lazy[N*10<<3];void push_up(ll x){mx[x]=max(mx[ls],mx[rs]);return;}void push_down(ll x){if(lazy[x]){lazy[ls]+=lazy[x];lazy[rs]+=lazy[x];mx[ls]+=lazy[x];mx[rs]+=lazy[x];lazy[x]=0;}return;}void get(ll x,ll l,ll r,ll rr){if(l==r){ans+=rr*rr;mx[x]=-1000000000;return;}push_down(x);ll mid=l+r>>1;if(mx[ls]>=k)get(ls,l,mid,rr);if(mx[rs]>=k)get(rs,mid+1,r,rr);push_up(x);return;}void add(ll x,ll L,ll R,ll l,ll r,ll rr){if (L==l&&R==r){lazy[x]++;mx[x]++;if(mx[x]>=k)get(x,L,R,rr);return;}push_down(x);ll mid=L+R>>1;if(r<=mid)add(ls,L,mid,l,r,rr);else if(l>mid)add(rs,mid+1,R,l,r,rr);else add(ls,L,mid,l,mid,rr),add(rs,mid+1,R,mid+1,r,rr);push_up(x);return;}
}T;
int main()
{scanf("%lld%lld%lld",&n,&m,&k);for(ll i=1;i<=n;++i){scanf("%lld%lld%lld",&a[i].r,&a[i].s,&a[i].t);if(a[i].t==-m)a[i].t=m-1;else a[i].t--;if(a[i].s==m)a[i].s=-m;if(a[i].s>=0)a[i].s=m-a[i].s;else a[i].s=m-a[i].s;if(a[i].t>=0)a[i].t=m-a[i].t;else a[i].t=m-a[i].t;swap(a[i].s,a[i].t);n++;n--;}sort(a+1,a+1+n,cmp);for(ll i=1;i<=n;++i){if(a[i].s>a[i].t){T.add(1,1,m*2,a[i].s,m*2,a[i].r);T.add(1,1,m*2,1,a[i].t,a[i].r);}else T.add(1,1,m*2,a[i].s,a[i].t,a[i].r);}printf("%lld",ans);return 0;
}

这篇关于【线段树】扇形面积并(P3997)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658515

相关文章

Android 扇形网络控件 - 无网络视图(动画)

前言 一般在APP没有网络的情况下,我们都会用一个无网络的提示图标,在提示方面为了统一app的情况,我们一般使用简单的提示图标,偶尔只需要改变一下图标的颜色就一举两得,而不需要让PS来换一次颜色。当然app有图标特殊要求的就另当别论了。 效果图 当你第一眼看到这样的图,二话不说直接让UI给你切一张图标来的快对吧,我其实开始也是这么想的,但是到了做的app越来越多的时候,你就会发现就算是用

【数学】100332. 包含所有 1 的最小矩形面积 II

本文涉及知识点 数学 LeetCode100332. 包含所有 1 的最小矩形面积 II 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形,并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意,这些矩形可以相接。 示例 1: 输入: grid = [[1,0,1],[1,1,1]]

Day 31:100334. 包含所有1的最小矩形面积Ⅰ

Leetcode 100334. 包含所有1的最小矩形面积Ⅰ 给你一个二维 **二进制 **数组 grid。请你找出一个边在水平方向和竖直方向上、面积 最小 的矩形,并且满足 grid 中所有的 1 都在矩形的内部。 返回这个矩形可能的 **最小 **面积。 确定首次出现 1 的第一行 top,最后一次出现 1 的最后一列 r,最后一次出现 1 的最后一行 bottom,首次出现的第

「LeetCode 084」最大面积

题目地址: https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 example 第一种方法,我们先确定左右两个边界,然后找边界中的最小值。比方说,我们左边界确定

线段树单点修改的应用

思路:对初始状态进行建树,然后这题就相当于查询第一个合法的位置,并且对其值进行修改,整个题目要求维护的是区间最大值,很显然可以使用线段树。 #include <bits/stdc++.h>using namespace std;const int N = 2e6 + 5;typedef long long ll;typedef pair<ll, ll> pll;typedef arra

Nature Climate Change | 气候变暖会造成未来全球干旱区面积扩张?

在气候变暖的情况下,旱地通常被预测将在全球范围内扩大,旱地包括以水资源有限、植被稀疏为特征的土地区域。然而,这种预测依赖于旱地的大气代用物,即干旱指数。最近的研究表明,干旱指数对陆地水循环的各种组成部分的预测在质量上是不正确的。 来自美国哈佛大学(Harvard University)的研究人员从水分条件对植被生产力及其他植被过程的限制作用角度切入,根据耦合模型比对项目第5阶段(CMIP

OpenCV轮廓、多边形逼近、关键点、周长和面积、边界框、矩、轮廓树、凹凸包、几何直方图、匹配

1.轮廓的多边形逼近  2.轮廓的关键点  3.轮廓的周长和面积  4.轮廓的边界框  5.轮廓的矩  6.轮廓的轮廓树   7.轮廓的凸包和凸缺陷  8.轮廓的成对几何直方图   9.轮廓的匹配    轮廓的特性: 1.轮廓的多边形逼近     轮廓的多边形逼近指的是:使用多边形来近似表示一个轮廓。     多边形逼近的目的是为了减少轮

[HDU 5029] Relief grain (树链剖分+线段树)

HDU - 5029 其实这道题最大的难点不是树链剖分,而是怎么维护某个点被那些颜色染过,染过多少次 如果在线段树维护的话,很难做到,估计得树套树,而且空间会炸 好在这题是离线的,可以使用差分的思想来维护 对一段区间[l,r]染色 c,相当于在这段区间左端点 l打上 c标志,右端点 r+1打上 -c标志 然后扫一遍整个区间 (依照 dfs序扫一遍整棵树),期间不断维护一颗线段树 线段树

[HDU 3060] Area2 (简单多边形面积交)

HDU - 3060 给定两个简单多边形,求他们覆盖的面积 先求出两个简单多边形的面积交 然后用面积和减去面积交 简单多边形面积交的求法就是将多边形分割成若干三角形 然后两组三角形用凸多边形的方法两两求交 #pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <iost

HDU 4791二分+线段树

13长沙现场赛水题 二分+线段树 二分出页数的所在位置 线段树查找后面区间最小值 #include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"struct comp{int l,r,mid;__int64 min;} data[400100];__int64 a[100100],b[1