【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室
分块90分。 By AutSky_JadeK 【重点在下面】
#include<cstdio>
#include<cmath>
using namespace std;
#define N 1000001
#define INF 2147483647
#define min(a,b) (((a)<(b))?(a):(b))
int n,m,a[N],sum,sz,l[],r[],minv[],delta[],num[N],x,y,v;
int ans,re2;
int Res;char C;
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
void makeblock()
{
sz=(int)sqrt((double)n*0.1); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+; r[sum]=sum*sz;
minv[sum]=INF;
for(int i=l[sum];i<=r[sum];i++) {minv[sum]=min(minv[sum],a[i]); num[i]=sum;}
}
l[sum]=r[sum-]+; r[sum]=n;
minv[sum]=INF;
for(int i=l[sum];i<=r[sum];i++) {minv[sum]=min(minv[sum],a[i]); num[i]=sum;}
}
inline void work(const int &L,const int &R)
{
minv[num[L]]=INF;
for(int i=L;i<=R;i++) a[i]-=v;
for(int i=l[num[L]];i<=r[num[L]];i++) minv[num[L]]=min(minv[num[L]],a[i]);
}
inline void update()
{
if(num[x]==num[y]) work(x,y);
else
{
work(x,r[num[x]]); work(l[num[y]],y);
for(int i=num[x]+;i<num[y];i++) delta[i]-=v;
}
}
inline int query()
{
ans=INF;
if(num[x]==num[y]) {for(int i=x;i<=y;i++) ans=min(ans,a[i]+delta[num[x]]); }
else
{
for(int i=x;i<=r[num[x]];i++) ans=min(ans,a[i]+delta[num[x]]);
for(int i=num[x]+;i<num[y];i++) ans=min(ans,minv[i]+delta[i]);
for(int i=l[num[y]];i<=y;i++) ans=min(ans,a[i]+delta[num[y]]);
} return ans;
}
int main()
{
n=G(); m=G();
for(int i=;i<=n;i++) a[i]=G();
makeblock();
for(int i=;i<=m;i++)
{
v=G(); x=G(); y=G();
if(query()<v)
{
printf("-1\n%d\n",i);
return ;
}
else update();
}
puts("");
return ;
}
分块 常数优化 100分。 By faebdc 金牌爷の力Orzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#include<cstdio>
#include<cmath>
using namespace std;
#define N 1000001
#define INF 2147483647
int n,m,a[N],sum,sz,hf,l[],r[],minv[],delta[],num[N],x,y,v;
int ans,re2;
int Res;char C;
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=(Res<<)+(Res<<)+C-'';C=getchar();}
return Res;
}
void makeblock()
{
sz=(int)sqrt((double)n*0.125); if(!sz) sz=;
hf=sz>>;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+; r[sum]=sum*sz;
minv[sum]=INF;
for(int i=l[sum];i<=r[sum];i++) {if(minv[sum]>a[i])minv[sum]=a[i]; num[i]=sum;}
}
l[sum]=r[sum-]+; r[sum]=n;
minv[sum]=INF;
for(int i=l[sum];i<=r[sum];i++) {if(minv[sum]>a[i])minv[sum]=a[i]; num[i]=sum;}
}
inline void work(const int &L,const int &R)
{
int *t=&(minv[num[L]]);
*t=INF;
int *z;
for(int i=L,*z=a+i;i<=R;i++,z++) {*z-=v;if(*t>*z)*t=*z;}
for(int i=r[num[L]],*z=a+i;i>R;i--,z--) if(*t>*z)*t=*z;
for(int i=l[num[L]],*z=a+i;i<L;i++,z++) if(*t>*z)*t=*z;
}
inline int update()
{
if(num[x]==num[y]) {work(x,y);return minv[num[x]]+delta[num[x]];}
work(x,r[num[x]]); work(l[num[y]],y);
int z;
if(minv[num[x]]+delta[num[x]]>minv[num[y]]+delta[num[y]])
z=minv[num[y]]+delta[num[y]];
else
z=minv[num[x]]+delta[num[x]];
for(int i=num[x]+;i<num[y];i++) {delta[i]-=v;if(z>minv[i]+delta[i])z=minv[i]+delta[i];}
return z;
}
int main()
{
n=G(); m=G();
for(int i=;i<=n;i++) a[i]=G();
makeblock();
for(int i=;i<=m;i++)
{
v=G(); x=G(); y=G();
int z=update();
if(z<)
{
printf("-1\n%d\n",i);
return ;
}
}
puts("");
return ;
}
【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室的更多相关文章
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 洛谷 1850 NOIP2016提高组 换教室
[题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
- 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- ⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】
感想 真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来. 重构代码千万遍,依旧只有-1输出. 正解 非常明显的一道搜索题目. 每一次记录上一级的状态,这样实现比较不容易出错. 然后考虑剪枝: ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 题解——洛谷P2827 NOIP提高组 2016 蚯蚓
队列模拟 详细题解待填坑 #include <cstdio> #include <algorithm> #include <queue> #include < ...
随机推荐
- MyBatis+Spring实现基本CRUD操作
一.MyBaits介绍 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的X ...
- mavne问题解决---Dynamic Web Module 2.3 or newer
一:前沿 maven问题的bug,其实是很烦人的,因为每次都是很纠结的去改这个bug,特别的烦人,这个bug也是使得我纠结了好久的,那个星期五自己搞了几个小时都没有解决下,之后星期一来百度Google ...
- bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑——倍增floyd
Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...
- 图论的复习/(ㄒoㄒ)/
图论基本概念 完全图: 每对顶点之间有边并且只有唯一的一条边. 强连通分量:有向图中任意2点都联通的最大子图. 图的储存 邻接矩阵:也就是一个二维数组,a[i][j]的值代表是否相连. 适用范围: 1 ...
- C# 反射 名称不区分大小写
一 Type type = Type.GetType(className,false,true); //第一个是“类型的全名”,第二个参数:找不到时触发异常,第三个参数:寻找的时候是否忽略大小写 二 ...
- 渗透测试中如何科学地使用V*P*N
环境说明 Windows7 虚拟机,作为VPN网关,负责拨VPN.VPN可以直接OPENVPN,也可以使用ShadowSocks+SSTap. Kali 虚拟机, 渗透测试工作机 配置步骤 Windo ...
- hashlib模块加密用法
hashlib 加密模块 hashlib.md5() 构建一个md5的对象,用于调用对象的update方法去加密 例子: import hashlib hash = hashlib.md5() h ...
- python基础代码(猜年龄、从最内层跳出多层循环、简单的购物车程序)
1.猜年龄 , 可以让用户最多猜三次! age = 55 i=0 while i<3: user_guess = int (input ("input your guess:" ...
- vue—你必须知道的
更多总结 猛戳这里 属性与方法 不要在实例属性或者回调函数中(例如,vm.$watch('a', newVal => this.myMethod())使用箭头函数.因为箭头函数会绑定父级上下文, ...
- codevs 1085
数字游戏 2003年NOIP全国联赛普及组 时间限制: s 空间限制: KB 题目等级 : 黄金 Gold 题解 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但 ...