[HNOI/AHOI2018]转盘(线段树优化单调)

gugu  bz

lei了lei了,事独流体毒瘤题

一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动

问实现每一个点都在$T_i$之后被访问到的最短时间

Step 1

该题可证:

最优方案必然是从某一格开始后一直等着然后走一圈正好全部访问到

证明:

如果时间倒流那就是从时刻T开始每一时刻向前走或是停着不动,每个元素过了T[i]会消失

如果这样的话你肯定是马不停蹄往前走对吧

所以反过来就是上面的结论

Q.E.D

上面的结论还有其他正确的表示方法,该方法仅供参考

如果您能想出其他证明,那么请让我Orz您

Step 2

根据上述结论,答案出来了$min_{i=1}^{n}(\max_{j=i}^{i+n-1}(T_j-j+i))+n-1$

暴力胡写都有$n^2$20分,可惜我考场上直接放弃

介个是用线段树优化的说...

简单思路:$T_j-j$可以单独提出来设为$f_j$

原式可变成$\min_{i=1}^{n}(\max_{j=i}^{i+n-1}(f_j)+i)+n-1$

做这道题之前我也没见过log的pushup

随手找了点参考文献(???)[luoguP4198]楼房重建

事实上并没有什么关系,但是确实十分相似

线段树维护方法都是差不多的,随便yy应该就差不多

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using std::max;
  4. using std::min;
  5. const int N=;
  6. int n,T,plas;
  7. int v[N],f[N];
  8. struct segtree
  9. {
  10. int ma[N<<],ans[N<<];
  11. int query(int vi,int px,int pl,int pr)
  12. {
  13. if(pl==pr) return pl+max(ma[px],vi);
  14. int mid=(pl+pr)>>;
  15. if(ma[px<<|]>vi) return min(ans[px],query(vi,px<<|,mid+,pr));
  16. else return min(mid++vi,query(vi,px<<,pl,mid));
  17. }
  18. void fuckup(int px,int pl,int pr)
  19. {
  20. ma[px]=max(ma[px<<],ma[px<<|]);
  21. ans[px]=query(ma[px<<|],px<<,pl,(pl+pr)>>);
  22. }
  23. void add(int x,int px,int pl,int pr)
  24. {
  25. if(pl==pr)
  26. {
  27. ma[px]=f[x],ans[px]=v[x];
  28. return;
  29. }
  30. int mid=(pl+pr)>>;
  31. if(x<=mid) add(x,px<<,pl,mid);
  32. else add(x,px<<|,mid+,pr);
  33. fuckup(px,pl,pr);
  34. }
  35. int get()
  36. {
  37. return ans[]+n-;
  38. }
  39. }rk;
  40. int xin,vin;
  41.  
  42. int lastans;
  43. int main()
  44. {
  45. scanf("%d%d%d",&n,&T,&plas);
  46. for(int i=;i<=n;i++) scanf("%d",&v[i]),v[i+n]=v[i],f[i]=v[i]-i,f[i+n]=v[i+n]-i-n;
  47. for(int i=;i<=n<<;i++) rk.add(i,,,n<<);
  48. lastans=rk.get();
  49. printf("%d\n",lastans);
  50. if(!plas) lastans=;
  51. while(T--)
  52. {
  53. scanf("%d%d",&xin,&vin);
  54. xin^=lastans,vin^=lastans;
  55. v[xin]=vin,v[xin+n]=vin,f[xin]=v[xin]-xin,f[xin+n]=v[xin+n]-xin-n;
  56. rk.add(xin,,,n<<),rk.add(xin+n,,,n<<);
  57. lastans=rk.get();
  58. printf("%d\n",lastans);
  59. if(!plas) lastans=;
  60. }
  61. return ;
  62. }

巨佬您txdy

[HNOI/AHOI2018]转盘(线段树优化单调)的更多相关文章

  1. 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)

    题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...

  2. 完美字符子串 单调队列预处理+DP线段树优化

    题意:有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(注意不是子序列),使得该子串不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数.如果你的子串是最长的,那 ...

  3. bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列

    详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...

  4. [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)

    题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...

  5. [NOI2016]区间 题解(决策单调性+线段树优化)

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1593  Solved: 869[Submit][Status][ ...

  6. HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP

    Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...

  7. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  8. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

  9. Weak Pair---hud5877大连网选(线段树优化+dfs)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877  题意:给你一颗树,有n个节点,每个节点都有一个权值v[i]:现在求有多少对(u,v ...

随机推荐

  1. Codeforces Round #382 (Div. 2) (模拟|数学)

    题目链接: A:Ostap and Grasshopper B:Urbanization C:Tennis Championship D:Taxes 分析:这场第一二题模拟,三四题数学题 A. 直接模 ...

  2. 最小割树Gomory–Hu tree

    fanhq666地址:http://fanhq666.blog.163.com/blog/static/8194342620113495335724/ wiki地址(证明):https://en.wi ...

  3. 洛谷 P2764 最小路径覆盖问题【匈牙利算法】

    经典二分图匹配问题.把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配.方案直接顺着匹配dsf.. #include<iostream&g ...

  4. Luogu P1233 木棍加工 【贪心/LIS】

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...

  5. nginx 配置tp3.2

    server { listen 80; server_name 域名; #charset koi8-r; #access_log /var/log/nginx/host.access.log main ...

  6. nginx_uWSGI_django_virtualenv_supervisor发布web服务器

    nginx_uWSGI_django_virtualenv_supervisor发布web服务器 nginx 导论 123456789101112131415161718192021222324252 ...

  7. [POI2007]大都市meg

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...

  8. set和get方法

    package day02; public class Person { /**为了封装,一般的属性都设置成为private(私有的),所以你无法用 .属性 的方式来得到属性值, * 因此此时用两个p ...

  9. Python快速教程(转载)

    Python快速教程   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题 ...

  10. hadoop-2.4.1集群搭建及zookeeper管理

    准备 1.1修改主机名,设置IP与主机名的映射 [root@xuegod74 ~]# vim /etc/hosts 192.168.1.73 xuegod73 192.168.1.74 xuegod7 ...