[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文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
随机推荐
- HC(Histogram-based Contrast) 基于直方图对比度的显著性
HC(Histogram-based Contrast) 基于直方图对比度的显著性 来源于: 2011, Global contrast based salient region detection, ...
- Java秘诀!Java关系运算符介绍
运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...
- sprintboot整合mybatis查询不出数据
数据库有数据,程序没有任何报错,但是查询结果没有数据,list显示[null,nul]. 检查了sql语句,以及controller.service.mapper,检查没发现问题,怀疑是字段映射问题. ...
- 新一代数据科学ide平台DataSpell提前发行版体验
1 简介 PyCharm开发公司jetbrains专门面向数据科学的ide项目DataSpell在前不久发布了其EAP版本(早期预览版本),为我们带来了诸多趋于成熟的功能特性,本文就将为大家介绍其使用 ...
- 5.29日 Scrum Metting
日期:2021年5月29日 会议主要内容概述:人员调整,xyl同时兼顾前后端:确定表格缩放策略和新图表添加:强调任务分配,总结工作. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的 ...
- springcloud整合seata
springcloud整合seata 一.背景 二.项目结构 三.实现功能: 四.项目使用到的技术 五.整合步骤 1.引入spring-cloud-starter-alibaba-seata jar包 ...
- spring cloud config的使用
在传统的应用中,我们的配置文件都是放在项目中,这个影响不大.但是在一个微服务架构的系统中,我们的微服务可能存在几十上百个,并且每个小的微服务可能又部署在多台机器上,那么这个时候如果我们的配置文件在都放 ...
- git为单独的仓库设置提交的用户名
在我们平时的学习中可能有这么一种需求,在公司进行开发的时候,一般会参与多个项目的开发,而项目提交代码时,一般请求情况下提供的用户都是同一个,而我们为了方便可能会使用全局进行git 用户名的配置.但是空 ...
- 【做题记录】CF1444A Division
CF1444A Division 题意: 给定 \(t\) 组询问,每组给两个数 \(p_i\) 和 \(q_i\) ,找出最大的整数 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整 ...
- 第一个只出现一次字符的位置 牛客网 剑指Offer
第一个只出现一次字符的位置 牛客网 剑指Offer 题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 ...