城市改造 (city)

题目描述

为了节约当前社会巨大的能源消耗,A 城市发起了新能源改造计划,也就是用太阳能代替旧能源。为了简化题意,可以假设 A 城市在一个二维平面上,平面上从11到nn每一个地方都有一栋高楼,高楼的宽度忽略不计。每栋高楼高度为hihi。城市左右两边分别有一座高度为h0h0和hn+1hn+1的高山。每一天,太阳从右边升起,左边落下。

城市改造总共用了TT时刻。每一时刻都发生一下三件事件中的一个事件:

1. 在第ii栋高楼顶端安装太阳能收集器。太阳能收集器只有在光线照射下才能工作。

2. 由于太阳能收集器有寿命,所以将第ii栋高楼上的太阳能收集器拆除。

3. 询问在一天中某一时刻至某一时刻有多少太阳能收集器始终在工作。

你的任务就是对于每个第33种事件,输出有多少太阳能收集器始终在工作。

注意:

太阳能收集器在光线照射下,当且仅当在这一时刻它之前没有遮挡物(包括高楼最高点)。如图,若太阳在下午以45°角照射 A 城,此时图中点2,32,3是不工作的,点1,41,4是工作的。

为了方便确定一天中的时刻,我们将以太阳高度角的形式给出。对于上午,我们给出太阳高度角,而下午,则给出太阳高度角的补角。

输入

第一行,两个数nn和TT。

第二行,输入n+2n+2个整数,第ii个数表示hi−1hi−1。

接下来TT行,每行2∼32∼3个整数。如果第一个数为11,则第二个数表示在第ii栋高楼顶端安装太阳能收集器。如果第一个数为22,则第二个数表示将第ii栋高楼上的太阳能收集器拆除。如果第一个数为33,则输入两个数ta,tbta,tb,表示起始时刻与终止时刻的太阳高度角。

输出

对于每个询问,输出有多少太阳能收集器始终在工作。

样例输入

4 10
5 4 2 6 5 3
1 1
1 3
3 135 135
1 2
3 90 100
1 4
2 3
3 45 50
3 46 50
3 85 95

样例输出

1
3
1
2
3

提示

【样例输入输出 2】

见下放文件 city/city2.in 和 city/city2.ans。这部分样例与第 4 个测试点范围相同。

【样例输入输出 3】

见下放文件 city/city3.in 和 city/city3.ans。这部分样例与第 7 个测试点范围相同。

【样例输出输出 4】

见下放文件 city/city4.in 和 city/city4.ans。这部分样例与第 14 个测试点范围相同。

【样例输出输出 5】

见下放文件 city/city5.in 和 city/city5.ans。这部分样例与第 17 个测试点范围相同。

【子任务】

测试点编号

n

T

特殊性质

1

≤105≤105

=1=1

2

≤100≤100

≤100≤100

3

4

≤1000≤1000

≤1000≤1000

5

6

7

≤105≤105

≤10≤10

8

9

10

≤105≤105

除h0h0和hn+1hn+1,所有的hihi都相等

11

12

满足所有的$t_a=t_b$

13

14

特殊性质S

15

16

17

18

19

≤3×105≤3×105

20

特殊性质S:保证nn为奇数,且对于所有i(0≤i≤n+1)i(0≤i≤n+1),假设hihi的最大值为mm。如果ii为偶数,保证hi=mhi=m。如果ii为奇数,保证hi<mhi<m。

本题共有 20 个测试点,每个测试点 5 分。对于所有的测试点,满足0<n≤105,0<m≤3×1050<n≤105,0<m≤3×105。对于每栋高楼,满足0<hi≤1080<hi≤108。

对于操作1与操作2,假设需要安装或拆除的收集器为xx,满足0<x≤n0<x≤n。对于操作1,保证之前第xx个收集器未安装。对于操作2,保证之前第xx个收集器已安装。

对于操作3,满足0<ta≤tb<1800<ta≤tb<180。

【提示】

本题中需要涉及角度与斜率之间的转化。请注意,在C++中可以调用三角函数为弧度制。


solution

啊啊啊调了一整天

atan2不会用,是(y,x)而不是(x,y)啊

cdq细节一直爆炸啊

小于写成小于等于啊

我fl=0就不操作,凭啥ans+=fl才能过啊

别人1.9k,我3k啊

最后真是一个个对拍才过

哇被气死

先用凸包求出太阳高度角范围:上凸壳上的点才会挡住它

然后就是经典三维偏序

qli>=li qri<=ri qt>=t

啊为什么这么难调

对了 几个技巧:

PI=acos(-1)或M_PI

精度较高

atan2(y,x)   y,x!!!

返回的是弧度,角度=t*108/PI;

可能是负数,要判掉

还有我又用sort,特慢哈哈哈

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
#define PI acos(-1)
using namespace std;
int n,T,top,tree[maxn*4],tot,ans[maxn*4];
struct node{
double li,ri;
int fl,id,q;
void bug()
{
cout<<li<<' '<<ri;
cout<<' '<<fl/*<<' '<<id<<' '<<q*/<<endl;
}
}s[maxn],a[maxn*4];
struct no{
int x,y;
}zh[maxn],h[maxn];
bool cmp(node a,node b){
return a.li>b.li||a.li==b.li&&a.ri<b.ri||a.li==b.li&&a.ri==b.ri&&a.id<b.id;
//return a.li>b.li||a.li==b.li&&fabs(a.fl)<fabs(b.fl);
}
bool R(node a,node b){
return a.ri<b.ri||a.ri==b.ri&&a.id<b.id;
}
void jia(int k,int val){
for(int i=k;i<=T;i+=i&-i)tree[i]+=val;
}
int ask(int k){
int sum=0;
for(int i=k;i;i-=i&-i)sum+=tree[i];
return sum;
}
void cdq(int l,int r){
if(l==r)return;
int mid=l+r>>1;
cdq(l,mid);cdq(mid+1,r);
sort(a+l,a+mid+1,R);sort(a+mid+1,a+r+1,R);
int i=l;
//cout<<l<<' '<<r<<endl;
for(int j=mid+1;j<=r;j++){
while(a[i].ri<a[j].ri&&i<=mid){
jia(a[i].id,a[i].fl);i++;
//cout<<"bbb ";
//a[i].bug();
}
if(a[j].fl==0){
ans[a[j].q]+=ask(a[j].id);
//cout<<"aaa "<<a[j].q<<' '<<a[j].id<<' '<<ans[a[j].q]<<endl;
}//a[j].bug();
}
for(int j=l;j<i;j++)jia(a[j].id,-a[j].fl);
}
no xl(no aa,no bb){
no t;t.x=aa.x-bb.x;t.y=aa.y-bb.y;
return t;
}
double cj(no a,no b){
return a.x*b.y-a.y*b.x;
}
int main()
{
cin>>n>>T;
for(int i=0;i<=n+1;i++){
scanf("%d",&h[i].y);h[i].x=i;
}
zh[1]=h[0];top=1;
for(int i=1;i<=n;i++){
while(top>1&&cj(xl(zh[top],zh[top-1]),xl(h[i],zh[top]))>=0)top--;
double x=h[i].x-zh[top].x,y=h[i].y-zh[top].y;
double t=atan2(y,x);t=t*180/PI;
//cout<<h[i].x<<' '<<h[i].y<<' '<<zh[top].x<<' '<<zh[top].y<<' '<<t<<endl;
t+=180;if(t>180)t=180;
s[i].li=t;
zh[++top]=h[i];
}
zh[1]=h[n+1];top=1;
for(int i=n;i>=1;i--){
while(top>1&&cj(xl(zh[top],zh[top-1]),xl(h[i],zh[top]))<=0)top--;
double x=h[i].x-zh[top].x,y=h[i].y-zh[top].y;
double t=atan2(y,x);t=t*180/PI;
//cout<<h[i].x<<' '<<h[i].y<<' '<<zh[top].x<<' '<<zh[top].y<<' '<<t<<endl;
t+=180;if(t>180)t=0;
s[i].ri=t;
zh[++top]=h[i];
}
//for(int i=1;i<=n;i++)cout<<s[i].li<<' '<<s[i].ri<<endl;
for(int i=1;i<=T;i++){
int op,t;
scanf("%d",&op);
if(op==1){
scanf("%d",&t);
a[i].li=s[t].li;a[i].ri=s[t].ri;
a[i].fl=1;
}
else if(op==2){
scanf("%d",&t);
a[i].li=s[t].li;a[i].ri=s[t].ri;
a[i].fl=-1;
}
else {
scanf("%lf%lf",&a[i].ri,&a[i].li);
// li left ri right
a[i].q=++tot;
}
a[i].id=i;
}
sort(a+1,a+T+1,cmp);
//for(int i=1;i<=T;i++)a[i].bug(); cdq(1,T);
for(int i=1;i<=tot;i++)printf("%d\n",ans[i]); return 0;
}
/*
2 8
1 2 1 1
1 1
1 2
3 45 135
3 135 135
2 1
3 134 134
2 2
3 135 135 4 10
5 4 2 6 5 3
1 1
1 3
3 135 135
1 2
3 90 100
1 4
2 3
3 45 50
3 46 50
3 85 95 */

城市改造 (city)的更多相关文章

  1. 8.9 NOIP模拟测试15 建设城市(city)+轰炸行动(bomb)+石头剪刀布(rps)

    鉴于T3的惨烈程度,我决定先来颓篇题解. T1 建设城市(city) 挡板法+容斥 m个建设队分成n组,每组必须有一个,先不考虑上限,共有 C(m-1,n-1)种方案. 有i个组是超过k个的,容斥掉 ...

  2. [CSP-S模拟测试]:建设城市(city)(组合数学+容斥)

    题目传送门(内部题8) 输入格式 一行三个整数$n,m,k$. 输出格式 一行一个整数表示答案.对$998244353$取模. 样例 样例输入 3 7 3 样例输出 数据范围与提示 对于10%的数据, ...

  3. 【模拟8.09】建设城市(city) (容斥)

    放在了考试T1 发现70分的DP很水啊,f[i][j]为当前位置是i分配了j个队的方案 我们用前缀和统计,在将i删去,j倒序枚举,就可以删掉一维(也可以滚动数组滚起来) 1 #include<i ...

  4. iOS 获取当前城市

    1.倒入头文件 #import <CoreLocation/CoreLocation.h> 2.实现定位协议CLLocationManagerDelegate 3.定义定位属性  @pro ...

  5. 微信小程序实现按首字母检索城市列表

    不说废话,上效果图 因为我有多处要用到,所以我这里是写成自定义组件的,你也可以直接改成在page页面编写: 布局左边一个scroll-view,显示城市列表,右边一个view显示字母列表,城市列表这边 ...

  6. iOS获取当前城市

    1.倒入头文件 #import <CoreLocation/CoreLocation.h> 2.实现定位协议CLLocationManagerDelegate 3.定义定位属性 @prop ...

  7. Python 练习:三级菜单选择城市

    info = { 'GuangDong':{ 'GuangZhou': ['TianHe', 'HaiZhu'], 'MaoMing': ['MaoNan', 'DianBai']}, 'ShanDo ...

  8. JQuery城市选择

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. vue select二级城市联动及第二级默认选中第一个option值

    当二级联动比如选择国家的时候,希望选中一个国家的时候后面城市默认选中第一个城市,则给国家的select加一个@change事件就可以了 <div class="inputLine&qu ...

随机推荐

  1. Bootstrap 历练实例 - 折叠(Collapse)插件方法

    方法 下面是一些折叠(Collapse)插件中有用的方法: 方法 描述 实例 Options:.collapse(options) 激活内容为可折叠元素.接受一个可选的 options 对象. $(' ...

  2. react属性校验

    https://reactjs.org/docs/typechecking-with-proptypes.html 1.安装:cnpm i prop-types -S import PropTypes ...

  3. grep与正则表达式使用

    grep简介 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.通常grep有三种版本grep.egrep(等同于grep -E)和fgrep.egrep为扩展的g ...

  4. 配置管理-SpringCloudConfig

    1.搭建配置管理服务 添加依赖 <dependencies> <dependency> <groupId>org.springframework.cloud< ...

  5. php同一个用户同时只能登陆一个, 后登陆者踢掉前登陆者(排他登陆)

    通常用户登陆,如果没有特别的限定, 同一个用户可以同时登陆, 今天搞了一个东西限定一个用户不能同时登陆到一个系统上, 后登陆者会把前面登陆的踢出来.(有点像QQ,同个帐号不能在多个地方同时在线, 后面 ...

  6. php订单号的生成

    来自ECSHOP订单号生成函数:/includes/lib_order.php文件中的get_order_sn() /** * 得到新订单号 * @return string */ function ...

  7. .net core IdentityServer4 使用query参数

    基本用法请参考官方文档:https://identityserver4.readthedocs.io/en/latest/index.html 这里不对具体用法进行说明,一般情况下,Startup添加 ...

  8. 【PHP】php中json_decode()和json_encode()

    1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行 ...

  9. JZOJ 4722. 跳楼机

    Description  DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方 ...

  10. 浅谈MapReduce工作机制

    1.MapTask工作机制 整个map阶段流程大体如上图所示.简单概述:input File通过getSplits被逻辑切分为多个split文件,通通过RecordReader(默认使用lineRec ...