结论:设$b_{i}$满足该限制,则$a_{i}$合法当且仅当$\forall i\ne j,a_{i}\ne a_{j}$且$\forall |i-j|<k,[a_{i}<a_{j}]=[b_{i}<b_{j}]$,即$r_{i}$可以确定任意连续$k$位的相对大小关系

充分性显然成立,必要性不会证QAQ

构造$b_{i}$:考虑从0到$n-1$依次填写,每次填写的位置$x$需要满足:1.$r_{x}=k-1$;2.$\forall i-k<j<i,r_{j}\ne k-1$

第一个条件能够保证之后的$k-1$个数都比其小,第二个条件能保证之前的$k-1$个数都比其小(令$y$为前$k-1$个数中的最小值,再反证即可),因此这样是正确的

对于第2个条件的判定,可以找出所有满足$r_{x}=k-1$的点组成一个set,在对这个set插入或删除的同时,找出所有满足第2个条件的点再组成一个set(因为还要删除)即可

找到这样的位置后,填上当前的数,并令:1.$r_{x}=-\infty$(保证自己不再被选);2.$\forall i-k<j<i,r_{j}+=1$

建图:对于每一个数$i$,设其前$k-1$个数中前驱后继为$pre$和$nex$,连有向边$(nex,i)$和$(i,pre)$,之后$a_{x}>a_{y}$当且仅当$x$能走到$y$

虽然这张图并不一定是一条链,但不妨将所有边分为两类,向前(即$(nex,i)$)和向后(即$(i,pre)$)(并不是仅仅比较两数大小),那么如果存在路径,必然存在一条只走向前/向后的路径,使得能够到达$y$周围的$k$个位置,因此对两种路径分别倍增维护即可

  1 #include "plants.h"
2 #include<bits/stdc++.h>
3 using namespace std;
4 #define N 200005
5 #define oo 0x3f3f3f3f
6 #define L (k<<1)
7 #define R (L+1)
8 #define mid (l+r>>1)
9 set<int>se;
10 set<int>::iterator itt;
11 set<pair<int,int> >s;
12 set<pair<int,int> >::iterator it;
13 int n,k,a[N],r[N],tag[N<<2],f[N<<2],fa[2][N][21],d[2][N][21];
14 void upd(int k,int x){
15 tag[k]+=x;
16 f[k]+=x;
17 }
18 void down(int k){
19 upd(L,tag[k]);
20 upd(R,tag[k]);
21 tag[k]=0;
22 }
23 void update(int k,int l,int r,int x,int y,int z){
24 if ((l>y)||(x>r))return;
25 if ((x<=l)&&(r<=y)){
26 upd(k,z);
27 return;
28 }
29 down(k);
30 update(L,l,mid,x,y,z);
31 update(R,mid+1,r,x,y,z);
32 f[k]=max(f[L],f[R]);
33 }
34 int query(int k,int l,int r){
35 if (l==r)return l;
36 down(k);
37 if (f[L]==f[k])return query(L,l,mid);
38 return query(R,mid+1,r);
39 }
40 bool pd(int x){
41 if (x>=k-1)return (*se.upper_bound(x-k))==x;
42 return (x==(*se.begin()))&&(se.upper_bound(x-k+n)==se.end());
43 }
44 void add(int x){
45 itt=se.upper_bound(x);
46 if (itt==se.end())itt=se.begin();
47 int y=(*itt);
48 if (pd(y))s.erase(make_pair(y,0));
49 se.insert(x);
50 if (pd(x))s.insert(make_pair(x,0));
51 if (pd(y))s.insert(make_pair(y,0));
52 }
53 void del(int x){
54 se.erase(x);
55 itt=se.upper_bound(x);
56 if (itt==se.end())itt=se.begin();
57 if (pd(*itt))s.insert(make_pair((*itt),0));
58 }
59 int dis(int x,int y){
60 if (x<=y)return y-x;
61 return y+n-x;
62 }
63 void init(int kk,vector<int>rr){
64 n=rr.size();
65 k=kk;
66 for(int i=0;i<n;i++)r[i]=rr[i];
67 for(int i=0;i<n;i++)update(1,0,n-1,i,i,r[i]);
68 for(int i=0;i<n;i++){
69 while (f[1]==k-1){
70 int x=query(1,0,n-1);
71 add(x);
72 update(1,0,n-1,x,x,-oo);
73 }
74 int x=(*s.begin()).first;
75 s.erase(s.begin());
76 del(x);
77 a[x]=i;
78 if (x-k+1>=0)update(1,0,n-1,x-k+1,x-1,1);
79 else{
80 update(1,0,n-1,0,x-1,1);
81 update(1,0,n-1,x-k+1+n,n-1,1);
82 }
83 }
84 for(int i=0;i<k;i++)s.insert(make_pair(a[i],i));
85 for(int i=0;i<n;i++){
86 s.erase(make_pair(a[i],i));
87 it=upper_bound(s.begin(),s.end(),make_pair(a[i],i));
88 if (it==s.end())fa[0][i][0]=i;
89 else fa[0][i][0]=(*it).second;
90 d[0][i][0]=dis(i,fa[0][i][0]);
91 it=upper_bound(s.begin(),s.end(),make_pair(a[(i+k)%n],(i+k)%n));
92 if (it==s.end())fa[1][(i+k)%n][0]=(i+k)%n;
93 else fa[1][(i+k)%n][0]=(*it).second;
94 d[1][(i+k)%n][0]=dis(fa[1][(i+k)%n][0],(i+k)%n);
95 s.insert(make_pair(a[(i+k)%n],(i+k)%n));
96 }
97 for(int p=0;p<2;p++)
98 for(int i=1;i<=20;i++)
99 for(int j=0;j<n;j++){
100 fa[p][j][i]=fa[p][fa[p][j][i-1]][i-1];
101 d[p][j][i]=min(d[p][j][i-1]+d[p][fa[p][j][i-1]][i-1],n);
102 }
103 }
104 bool pd(int x,int y){
105 int dd=dis(x,y),z=x;
106 for(int i=20;i>=0;i--)
107 if (d[0][x][i]<=dd){
108 dd-=d[0][x][i];
109 x=fa[0][x][i];
110 }
111 if ((dd<k)&&(a[x]<=a[y]))return 1;
112 dd=dis(y,x=z);
113 for(int i=20;i>=0;i--)
114 if (d[1][x][i]<=dd){
115 dd-=d[1][x][i];
116 x=fa[1][x][i];
117 }
118 return ((dd<k)&&(a[x]<=a[y]));
119 }
120 int compare_plants(int x,int y){
121 if ((a[x]<a[y])&&(pd(x,y)))return -1;
122 if ((a[x]>a[y])&&(pd(y,x)))return 1;
123 return 0;
124 }

[loj3364]植物比较的更多相关文章

  1. BZOJ 1565: [NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 1071[Submit][Stat ...

  2. 使用javascript生成的植物显示过程特效

    查看效果:http://keleyi.com/keleyi/phtml/html5/33.htm .NET版本:http://keleyi.com/a/bjac/66mql4bc.htm 完整HTML ...

  3. BZOJ1565: [NOI2009]植物大战僵尸

    Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...

  4. [Android] 转移“植物大战僵尸2”存档的办法,无需root

    作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...

  5. 【BZOJ】【1565】【NOI2009】PVZ 植物大战僵尸

    网络流/最大权闭合子图+拓扑排序 感动死了>_<,一年多以前刚知道网络流的时候听说了这道名字很带感的题目,现在终于有实力切掉它了. 这题是最大权闭合子图模型的经典应用<_<,首 ...

  6. Unity3d 真实的植物渲染

    好久没写shader了,有些生疏,刚弄了个植物shader,分享一下. 先上图片: 重点需要注意的是fragment shader的透明部分 需要如此声明 Tags{ "LightMode& ...

  7. 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  8. BZOJ 1565 植物大战僵尸

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 思路:由于植物之间有保护关系:(右边的植物保护左边的植物,植物攻击范围内的植物都被保护了),因 ...

  9. 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...

随机推荐

  1. VS2013编译报错——error LNK2001: 无法解析的外部符号 __imp_PathMatchSpecA E:\CaffeProgram\3train_mnist(p)\3train_mnist\gflags.lib(gflags.obj) 3train_mnist

    解决方案来自http://blog.csdn.net/yang6464158/article/details/41743641 感谢感谢~~

  2. Java入门基础,必读!Java单行、多行和文档注释!

    在编写Java的过程中,我们需要对一些程序进行注释.除了方便自己阅读之外,我们还需要为他人更好地理解我们的程序.因此,我们需要对一些程序进行注释,这些注释可以是编程思想,也可以是程序的作用,可以说是J ...

  3. CQOI2021 退役记

    Day -1 晚上去了酒店然后就睡觉了. Day 1 进考场之前互相奶. 进了考场之后看题,发现T1很水(伏笔1,然后直接开始写 \(\Theta(n\log^2n)\)(二分+动态开点线段树),调了 ...

  4. 如何利用Prometheus监控你的应用(此列子是对于golang sdk进行运用)

    Prometheus作为一套完整的开源监控接近方案,因为其诸多强大的特性以及生态的开放性,俨然已经成为了监控领域的事实标准并在全球范围内得到了广泛的部署应用.那么应该如何利用Prometheus对我们 ...

  5. 2020.10.9--vj个人赛补题

    B - A Tide of Riverscape 题意:给出一组字符串,由'0','1',' . '组成,' . '可以换成 0或1,判断第 i  个和第 i+p 个字符是否可以不相等,如果可以则输出 ...

  6. 2.1 OOP & SOLID

    OOP & SOLID Implementing DDD highly relies on the Object Oriented Programming (OOP) and SOLID pr ...

  7. Less-23 preg_replace1

    Less-23: 直接跳到Less-23的原因是,Less-(11~22)均为注入点不为get方式的注入.我先把get型注入写的差不多,再回来整理关于注入点的内容. 核心语句: 查询.报错均有回显. ...

  8. UltraSoft Scrum Meeting 博客汇总

    一.Alpha阶段 UltraSoft - Alpha - Scrum Meeting 1 UltraSoft - Alpha - Scrum Meeting 2 UltraSoft - Alpha ...

  9. docker run 的基本用法

    docker run 命令用来创建并启动一个容器 语法:docker run [options] image [command] [args-] 示例:docker run -dit -v 别名:容器 ...

  10. elasticsearch入门(简单的crud操作)

    记录一下,elasticsearch从创建索引到插入数据的一个crud操作. 一.创建索引 curl -XPUT "http://192.168.99.1:9200/productindex ...