【分块】【常数优化】【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 < ...
随机推荐
- Hadoop NameNode元数据相关文件目录解析
在<Hadoop NameNode元数据相关文件目录解析>文章中提到NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: 1 current/ ...
- hive连接数
使用hive分析日志作业很多的时候,需要修改mysql的默认连接数 修改方法 打开/etc/my.cnf文件 在[mysqld] 中添加 max_connections=1000 重启mysql ...
- 教主泡嫦娥(RQNOJ 595)
题目描述 [问题背景] 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方舟上. 但也有很多百姓平民想搭乘方舟,毕竟他们不想就这么离开世界,所以他们决定要么登上 ...
- SVG布局
http://www.w3cplus.com/html5/nesting-svgs.html
- 51nod K 汽油补给 大根堆+小根堆....
题目传送门 用优先队列瞎搞... 想着在每个地方 先算上一个点到这一个点要花费多少钱 这个用小根堆算就好 然后在这个地方加油 把油钱比自己多的替代掉 这个用大根堆维护一下 然后两个堆之间信息要保持互通 ...
- Bash Shell 下打开一个TCP / UDP SOCKET
Bash Shell 下打开一个TCP / UDP SOCKET http://jingyan.baidu.com/article/636f38bb6166c3d6b84610d1.html
- LINUX环境下的GUN MAKE学习笔记(二)
第三章:makefile总述 3.1makefile的内容 在一个完整的makefile中,包含显示规则.隐含规则.变量定义.指示符和注释.下面讨论一些基本概念: 显示规则:它描述了在何种情况下如何更 ...
- mysql内连接、左连接、右连接举例说明
如下: CREATE TABLE tb ( id INT PRIMARY KEY, NAME VARCHAR (20) ) ; CREATE TABLE ta ( id INT PRIMARY KEY ...
- Centos安装流量监控工具iftop笔记
Centos安装流量监控工具iftop笔记 一.概述 iftop可以用来监控网卡的实时流量(可以指定网段).反向解析IP.显示端口信息等,详细的将会在后面的使用参数中说明.官方网站:http://ww ...
- golang命令行参数解析
package main import ( "fmt" "os" ) func main(){ s:= os.Args fmt.Println(s) } 直接执 ...