[loj3364]植物比较
结论:设$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]植物比较的更多相关文章
- BZOJ 1565: [NOI2009]植物大战僵尸
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2317 Solved: 1071[Submit][Stat ...
- 使用javascript生成的植物显示过程特效
查看效果:http://keleyi.com/keleyi/phtml/html5/33.htm .NET版本:http://keleyi.com/a/bjac/66mql4bc.htm 完整HTML ...
- BZOJ1565: [NOI2009]植物大战僵尸
Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...
- [Android] 转移“植物大战僵尸2”存档的办法,无需root
作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...
- 【BZOJ】【1565】【NOI2009】PVZ 植物大战僵尸
网络流/最大权闭合子图+拓扑排序 感动死了>_<,一年多以前刚知道网络流的时候听说了这道名字很带感的题目,现在终于有实力切掉它了. 这题是最大权闭合子图模型的经典应用<_<,首 ...
- Unity3d 真实的植物渲染
好久没写shader了,有些生疏,刚弄了个植物shader,分享一下. 先上图片: 重点需要注意的是fragment shader的透明部分 需要如此声明 Tags{ "LightMode& ...
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- BZOJ 1565 植物大战僵尸
http://www.lydsy.com/JudgeOnline/problem.php?id=1565 思路:由于植物之间有保护关系:(右边的植物保护左边的植物,植物攻击范围内的植物都被保护了),因 ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
随机推荐
- Kubernetes-Service介绍(二)-服务发现
前言 本篇是Kubernetes第九篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...
- Java(26)集合一Collection
来源:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228419.html 博客主页:https://www.cnblogs.com/testero ...
- Java(33)IO流的介绍&字节流
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228446.html 博客主页:https://www.cnblogs.com/testero ...
- 腾讯bugly产生bug定位行数不准解决方案
定位不准是因为做了混淆导致行数与实际代码行数不对.解决方案是要上传符号表.下载地址https://bugly.qq.com/v2/downloads 下载好因为我打开文件的说明文件是空文件(可能工作人 ...
- Alpha-功能规格说明书
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.引言 1. 项目简介 项目团队:删库跑路对不队 项目名称:题士 项目内容 ...
- UltraSoft - Beta - Scrum Meeting 2
Date: May 18th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 建立Beta仓库管理增加服务器部署和Git协作文档 Liuzh 前端 查阅响应式布 ...
- linux与windows下文件编码问题
注:转换操作均在Linux终端进行操作 DOS与Unix格式转换 安装工具:dos2unix.unix2dos # ubuntu apt-get install dos2unix apt-get in ...
- git常用的一些简单命令
1.如果一个文件被修改了,但是还没有使用 git add 命令,此时想取消这次修改,需要执行的命令如下: git checkout -- 文件名 2.如果一个文件执行了 git add ,此时想取消这 ...
- Noip模拟17 2021.7.16
我愿称这场考试为STL专练 T1 世界线 巧妙使用$bitset$当作vis数组使用,内存不会炸,操作还方便,的确是极好的. 但是这个题如果不开一半的$bitset$是会炸内存的,因为他能开得很大,但 ...
- SprinMvc快速入门
1.spring mvc Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架. 查看官方文档:https://docs.spring.io/sp ...