【分块】【常数优化】【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 < ...
随机推荐
- 怎么利用idea自带的工具,不需要 重启tomcat或则其他服务,js代码自动生效
idea中有一个工具:可以直接upload,能让你修改的界面直接可以看到,不需要重启服务. 依次点击的按钮如下: 点击进入的界面这个填的只是一个示例,在各位的电脑上肯定不行,大家依据实际情况填写.
- bzoj 2425 [HAOI2010]计数 dp+组合计数
[HAOI2010]计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 451 Solved: 289[Submit][Status][Discus ...
- bzoj 3771 Triple FFT 生成函数+容斥
Triple Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 847 Solved: 482[Submit][Status][Discuss] Desc ...
- Java 处理 XML 的三种主流技术及介绍
Java 处理 XML 的三种主流技术及介绍 原文地址:https://www.ibm.com/developerworks/cn/xml/dm-1208gub/ XML (eXtensible Ma ...
- 51Nod 1212无向图最小生成树
prim #include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f ][]; ],lowc[]; ],int n) ...
- 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]
Problem b Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...
- node导入导出的问题
node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出去.要使用外界的变量,也必须使用导入的方式导入进来. import 变量名 from '文件地址'//css可以直接导入 ...
- ZOJ 3599 K倍动态减法游戏
下面的文字辅助理解来自http://blog.csdn.net/tbl_123/article/details/24884861 博弈论中的 K倍动态减法游戏,难度较大,参看了好多资料才懵懂! 此题可 ...
- appium===Appium的前世今生
一.什么是Appium Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台.Appium使用WebDriv ...
- Shell中的while循环【转】
转自:http://blog.chinaunix.net/uid-25880122-id-2901409.html while循环的格式 while expression do command c ...