结论:设$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. 魔改swagger:knife4j的另外一种打开方式

    之前公司使用了swagger作为文档管理工具,原生的swagger-ui非常丑,之后就用了开源项目 萧明 / knife4j 的swagger组件进行了swagger渲染,改造之后界面漂亮多了,操作也 ...

  2. SingnalR 从开发到生产部署闭坑指南

    前天倒腾了一份[SignalR在react/go技术栈的实践], 步骤和思路大部分是外围框架的应用, 今天趁热打铁, 给一个我总结的SignalR避坑指南. 1.SignalR 默认协商 不管是.NE ...

  3. SharkCTF2021 bybypass&baby_phpserialize题记

    (国庆褪10天了 先水一篇) bybypass: payload:?anime_is_bae=hehellotherehoomanllotherehooman baby_phpserialize ro ...

  4. C++的指针使用心得

    使用C++有一段时间了,C++的手动内存管理缺失很麻烦,一不小心容易产生内存泄漏.自己总结了一点使用原则(不一定对),备注一下,避免忘记. 1.类外部传来的指针不处理 2.Qt对象管理的内存不处理 3 ...

  5. 今天学习了BootStrap

    今天学习了BootStrap 一.BootStrap介绍 Bootstrap是一个前端开发的框架,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.Java ...

  6. Python课程笔记(四)

    1.模块的导入 相当于Java的包或C语言的头文件 (1) import math s = math.sqrt(25) print(s) (2) from math import sqrt s=mat ...

  7. 洛谷 P5658 [CSP-S2019] 括号树

    链接: P5658 分析: 显然我们应该在dfs树的同时维护每个点的答案. 注意到第 \(u\) 个点的答案可以分成两部分,不包含 \(u\) 点时的答案,和加入 \(u\) 点后新增的答案,前者可以 ...

  8. Spring的Ioc与DI

    一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算 ...

  9. Python AttributeError: module 'string' has no attribute 'atoi'

    python2 中可以用string.atoi 在python3中会报错 替换的方案是 string.atoi(your_str) 替换为 int(your_str) 这个代码python2和pyth ...

  10. 神经网络 感知机 Perceptron python实现

    import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...