分块90分。 By AutSky_JadeK 【重点在下面】

  1. #include<cstdio>
  2. #include<cmath>
  3. using namespace std;
  4. #define N 1000001
  5. #define INF 2147483647
  6. #define min(a,b) (((a)<(b))?(a):(b))
  7. int n,m,a[N],sum,sz,l[],r[],minv[],delta[],num[N],x,y,v;
  8. int ans,re2;
  9. int Res;char C;
  10. inline int G()
  11. {
  12. Res=;C='*';
  13. while(C<''||C>'')C=getchar();
  14. while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
  15. return Res;
  16. }
  17. void makeblock()
  18. {
  19. sz=(int)sqrt((double)n*0.1); if(!sz) sz=;
  20. for(sum=;sum*sz<n;sum++)
  21. {
  22. l[sum]=r[sum-]+; r[sum]=sum*sz;
  23. minv[sum]=INF;
  24. for(int i=l[sum];i<=r[sum];i++) {minv[sum]=min(minv[sum],a[i]); num[i]=sum;}
  25. }
  26. l[sum]=r[sum-]+; r[sum]=n;
  27. minv[sum]=INF;
  28. for(int i=l[sum];i<=r[sum];i++) {minv[sum]=min(minv[sum],a[i]); num[i]=sum;}
  29. }
  30. inline void work(const int &L,const int &R)
  31. {
  32. minv[num[L]]=INF;
  33. for(int i=L;i<=R;i++) a[i]-=v;
  34. for(int i=l[num[L]];i<=r[num[L]];i++) minv[num[L]]=min(minv[num[L]],a[i]);
  35. }
  36. inline void update()
  37. {
  38. if(num[x]==num[y]) work(x,y);
  39. else
  40. {
  41. work(x,r[num[x]]); work(l[num[y]],y);
  42. for(int i=num[x]+;i<num[y];i++) delta[i]-=v;
  43. }
  44. }
  45. inline int query()
  46. {
  47. ans=INF;
  48. if(num[x]==num[y]) {for(int i=x;i<=y;i++) ans=min(ans,a[i]+delta[num[x]]); }
  49. else
  50. {
  51. for(int i=x;i<=r[num[x]];i++) ans=min(ans,a[i]+delta[num[x]]);
  52. for(int i=num[x]+;i<num[y];i++) ans=min(ans,minv[i]+delta[i]);
  53. for(int i=l[num[y]];i<=y;i++) ans=min(ans,a[i]+delta[num[y]]);
  54. } return ans;
  55. }
  56. int main()
  57. {
  58. n=G(); m=G();
  59. for(int i=;i<=n;i++) a[i]=G();
  60. makeblock();
  61. for(int i=;i<=m;i++)
  62. {
  63. v=G(); x=G(); y=G();
  64. if(query()<v)
  65. {
  66. printf("-1\n%d\n",i);
  67. return ;
  68. }
  69. else update();
  70. }
  71. puts("");
  72. return ;
  73. }

分块 常数优化 100分。 By faebdc 金牌爷の力Orzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  1. #include<cstdio>
  2. #include<cmath>
  3. using namespace std;
  4. #define N 1000001
  5. #define INF 2147483647
  6. int n,m,a[N],sum,sz,hf,l[],r[],minv[],delta[],num[N],x,y,v;
  7. int ans,re2;
  8. int Res;char C;
  9. inline int G()
  10. {
  11. Res=;C='*';
  12. while(C<''||C>'')C=getchar();
  13. while(C>=''&&C<=''){Res=(Res<<)+(Res<<)+C-'';C=getchar();}
  14. return Res;
  15. }
  16. void makeblock()
  17. {
  18. sz=(int)sqrt((double)n*0.125); if(!sz) sz=;
  19. hf=sz>>;
  20. for(sum=;sum*sz<n;sum++)
  21. {
  22. l[sum]=r[sum-]+; r[sum]=sum*sz;
  23. minv[sum]=INF;
  24. for(int i=l[sum];i<=r[sum];i++) {if(minv[sum]>a[i])minv[sum]=a[i]; num[i]=sum;}
  25. }
  26. l[sum]=r[sum-]+; r[sum]=n;
  27. minv[sum]=INF;
  28. for(int i=l[sum];i<=r[sum];i++) {if(minv[sum]>a[i])minv[sum]=a[i]; num[i]=sum;}
  29. }
  30. inline void work(const int &L,const int &R)
  31. {
  32. int *t=&(minv[num[L]]);
  33. *t=INF;
  34. int *z;
  35. for(int i=L,*z=a+i;i<=R;i++,z++) {*z-=v;if(*t>*z)*t=*z;}
  36. for(int i=r[num[L]],*z=a+i;i>R;i--,z--) if(*t>*z)*t=*z;
  37. for(int i=l[num[L]],*z=a+i;i<L;i++,z++) if(*t>*z)*t=*z;
  38. }
  39. inline int update()
  40. {
  41. if(num[x]==num[y]) {work(x,y);return minv[num[x]]+delta[num[x]];}
  42. work(x,r[num[x]]); work(l[num[y]],y);
  43. int z;
  44. if(minv[num[x]]+delta[num[x]]>minv[num[y]]+delta[num[y]])
  45. z=minv[num[y]]+delta[num[y]];
  46. else
  47. z=minv[num[x]]+delta[num[x]];
  48. for(int i=num[x]+;i<num[y];i++) {delta[i]-=v;if(z>minv[i]+delta[i])z=minv[i]+delta[i];}
  49. return z;
  50. }
  51. int main()
  52. {
  53. n=G(); m=G();
  54. for(int i=;i<=n;i++) a[i]=G();
  55. makeblock();
  56. for(int i=;i<=m;i++)
  57. {
  58. v=G(); x=G(); y=G();
  59. int z=update();
  60. if(z<)
  61. {
  62. printf("-1\n%d\n",i);
  63. return ;
  64. }
  65. }
  66. puts("");
  67. return ;
  68. }

【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室的更多相关文章

  1. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  2. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

  3. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  4. 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

    P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 ...

  5. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  6. 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

    以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...

  7. ⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】

    感想 真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来. 重构代码千万遍,依旧只有-1输出. 正解 非常明显的一道搜索题目. 每一次记录上一级的状态,这样实现比较不容易出错. 然后考虑剪枝: ...

  8. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  9. 题解——洛谷P2827 NOIP提高组 2016 蚯蚓

    队列模拟 详细题解待填坑 #include <cstdio> #include <algorithm> #include <queue> #include < ...

随机推荐

  1. 怎么利用idea自带的工具,不需要 重启tomcat或则其他服务,js代码自动生效

    idea中有一个工具:可以直接upload,能让你修改的界面直接可以看到,不需要重启服务. 依次点击的按钮如下: 点击进入的界面这个填的只是一个示例,在各位的电脑上肯定不行,大家依据实际情况填写.

  2. bzoj 2425 [HAOI2010]计数 dp+组合计数

    [HAOI2010]计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 451  Solved: 289[Submit][Status][Discus ...

  3. bzoj 3771 Triple FFT 生成函数+容斥

    Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 482[Submit][Status][Discuss] Desc ...

  4. Java 处理 XML 的三种主流技术及介绍

    Java 处理 XML 的三种主流技术及介绍 原文地址:https://www.ibm.com/developerworks/cn/xml/dm-1208gub/ XML (eXtensible Ma ...

  5. 51Nod 1212无向图最小生成树

    prim #include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f ][]; ],lowc[]; ],int n) ...

  6. 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]

    Problem b Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...

  7. node导入导出的问题

    node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出去.要使用外界的变量,也必须使用导入的方式导入进来. import 变量名 from '文件地址'//css可以直接导入 ...

  8. ZOJ 3599 K倍动态减法游戏

    下面的文字辅助理解来自http://blog.csdn.net/tbl_123/article/details/24884861 博弈论中的 K倍动态减法游戏,难度较大,参看了好多资料才懵懂! 此题可 ...

  9. appium===Appium的前世今生

      一.什么是Appium Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台.Appium使用WebDriv ...

  10. Shell中的while循环【转】

    转自:http://blog.chinaunix.net/uid-25880122-id-2901409.html while循环的格式   while expression do command c ...