BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)

  相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对。也即要将原序列划分成两个单增序列。由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉。

  这个时候有两种显然的暴力。

  将点集划分成两部分使内部无边显然就是二分图,于是第一种暴力是在逆序对之间连边,答案即为2连通块个数,因为每个连通块都可以交换黑白点。问题在于暴力连边是n2的,而显然实际有用的边其实只有O(n)条。考虑这样一种连边方式:每个点向后缀最小值、前缀第一个比他大的点连边。瞎归纳归纳就可以证明连这些边就够了。这个前缀第一个比他大的随便找都行,比如弄个bit。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,a[N],pre[N],suf[N],fa[N],tree[N],cnt;
inline void chkmax(int &x,int y){if (a[y]>a[x]) x=y;}
inline void chkmin(int &x,int y){if (a[y]<a[x]) x=y;}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void ins(int k,int x){while (k<=n) tree[k]=min(tree[k],x),k+=k&-k;}
int query(int k){int s=n;while (k) s=min(s,tree[k]),k-=k&-k;return s;}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4881.in","r",stdin);freopen("bzoj4881.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read();for (int i=1;i<=n;i++) fa[i]=i,a[i]=read(),tree[i]=n+1;a[0]=0,a[n+1]=n+1;pre[0]=0;for (int i=1;i<=n;i++) chkmax(pre[i]=pre[i-1],i);suf[n+1]=n+1;for (int i=n;i>=1;i--) chkmin(suf[i]=suf[i+1],i);for (int i=1;i<=n;i++)if (pre[i]!=i&&suf[i]!=i) {cout<<0;return 0;}else{if (suf[i]!=i) fa[find(i)]=find(suf[i]);if (pre[i]!=i) fa[find(i)]=find(query(n+1-a[i]));ins(n+1-a[i],i);}for (int i=1;i<=n;i++) if (find(i)==i) cnt++;int ans=1;while (cnt--) ans=(ans<<1)%P;cout<<ans;return 0;
}

  另一种暴力是一个显然的dp,即设f[i][j]为dp到第i位时,不包含i的集合的最大值是第j个数的方案数。则有f[i][i-1]=Σf[i-1][j] (a[i]>a[j],j<i-1),f[i][j]=f[i-1][j] (a[i]>a[i-1],j<i-1)。将dp数组看成一维的,显然就可以用线段树优化了,即开一棵以a[]为下标的线段树,对f[i][i-1]在线段树上查询前缀更新,如果a[i]<a[i-1]就给整个线段树清零。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,a[N],L[N<<2],R[N<<2],tree[N<<2],lazy[N<<2];
void update(int k){tree[k]=0,lazy[k]=1;}
void down(int k){update(k<<1),update(k<<1|1),lazy[k]=0;}
void up(int k){tree[k]=(tree[k<<1]+tree[k<<1|1])%P;}
void build(int k,int l,int r)
{L[k]=l,R[k]=r;if (l==r) return;int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}
void add(int k,int p,int x)
{if (L[k]==R[k]) {tree[k]+=x;return;} if (lazy[k]) down(k);int mid=L[k]+R[k]>>1;if (p<=mid) add(k<<1,p,x);else add(k<<1|1,p,x);up(k);
}
int query(int k,int l,int r) 
{if (L[k]==l&&R[k]==r) return tree[k];if (lazy[k]) down(k);int mid=L[k]+R[k]>>1;if (r<=mid) return query(k<<1,l,r);else if (l>mid) return query(k<<1|1,l,r);else return (query(k<<1,l,mid)+query(k<<1|1,mid+1,r))%P;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4881.in","r",stdin);freopen("bzoj4881.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read();for (int i=1;i<=n;i++) a[i]=read();build(1,0,n);add(1,0,2);for (int i=2;i<=n;i++){int x=query(1,0,a[i]);if (a[i]<a[i-1]) update(1);add(1,a[i-1],x);}cout<<tree[1];return 0;
}

 

转载于:https://www.cnblogs.com/Gloid/p/10025835.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

activemq部署安装

一、架构和技术介绍 1、简介 ActiveMQ 是Apache出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 2、activemq的特性 1. 多种语言和协议编写客户端。语言: Java, C, C, C#, Ruby, Perl, Python, PHP。应用协议: …

python初学者_面向初学者的20种重要的Python技巧

python初学者Python is among the most widely used market programming languages in the world. This is because of a variety of driving factors:Python是世界上使用最广泛的市场编程语言之一。 这是由于多种驱动因素&#xff1a; It’s simple to understand. 很容易理解…

主串与模式串的匹配

主串与模式串的匹配 &#xff08;1&#xff09;BF算法&#xff1a; BF算法比较简单直观&#xff0c;其匹配原理是主串S.ch[i]和模式串T.ch[j]比较&#xff0c;若相等&#xff0c;则i和j分别指示串中的下一个位置&#xff0c;继续比较后续字符&#xff0c;若不相等&#xff0c;从…

什么是 DDoS 攻击?

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。 全称Distributed Denial of Service&#xff0c;中文意思为“分布式拒绝服务”&#xff0c;就是利用大量合法的分布式服务器对目标发送请求&#xff0c;从而导致正常合法用户无法获得服务。通俗点讲就是利用网络…

nginx 并发过十万

一般来说nginx 配置文件中对优化比较有作用的为以下几项&#xff1a; worker_processes 8; nginx 进程数&#xff0c;建议按照cpu 数目来指定&#xff0c;一般为它的倍数。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 为每…

贝叶斯网络建模

I am feeling sick. Fever. Cough. Stuffy nose. And it’s wintertime. Do I have the flu? Likely. Plus I have muscle pain. More likely.我感到恶心。 发热。 咳嗽。 鼻塞。 现在是冬天。 我有流感吗&#xff1f; 可能吧 另外我有肌肉疼痛。 更倾向于。 Bayesian networ…

长春南关区净月大街附近都有哪些课后班?

长春南关区净月大街附近都有哪些课后班&#xff1f;在学校的教育不能满足广大学生的需求的时候&#xff0c;一对一辅导、文化课辅导、高考辅导等越来越多的家长和孩子的选择。相对于学校的大课教育&#xff0c;一对一辅导有着自身独特的优势&#xff0c;一对一辅导有着学校教学…

dev中文本框等获取焦点事件

<ClientSideEvents GotFocus"GotFocus" /> editContract.SetFocus()//设置文本框等的焦点 function GotFocus(s, e) { window.top.DLG.show(700, 600, "PrePayment/ContractSelect.aspx", "选择", null ); }…

数据科学家数据分析师_使您的分析师和数据科学家在数据处理方面保持一致

数据科学家数据分析师According to a recent survey conducted by Dimensional Research, only 50 percent of data analysts’ time is actually spent analyzing data. What’s the other half spent on? Data cleanup — that tedious and repetitive work that must be do…

神经网络使用情景

神经网络使用情景 人脸&#xff0f;图像识别语音搜索文本到语音&#xff08;转录&#xff09;垃圾邮件筛选&#xff08;异常情况探测&#xff09;欺诈探测推荐系统&#xff08;客户关系管理、广告技术、避免用户流失&#xff09;回归分析 为何选择Deeplearning4j&#xff1f; …

BZOJ4890 Tjoi2017城市

显然删掉的边肯定是直径上的边。考虑枚举删哪一条。然后考虑怎么连。显然新边应该满足其两端点在各自树中作为根能使树深度最小。只要线性求出这个东西就可以了&#xff0c;这与求树的重心的过程类似。 #include<iostream> #include<cstdio> #include<cmath>…

【国际专场】laravel多用户平台(SaaS, 如淘宝多用户商城)的搭建策略

想不想用Laravel来搭建一个多用户、或多租户平台&#xff1f;比如像淘宝那样的多商户平台呢&#xff1f;听上去很复杂&#xff0c;不是吗&#xff1f;怎么能一个程序&#xff0c;给那么多的机构用户来用呢&#xff1f;如何协调管理它们呢&#xff1f;数据库怎么搭建呢&#xff…

GitHub常用命令及使用

GitHub使用介绍 摘要&#xff1a; 常用命令&#xff1a; git init 新建一个空的仓库git status 查看状态git add . 添加文件git commit -m 注释 提交添加的文件并备注说明git remote add origin gitgithub.com:jinzhaogit/git.git 连接远程仓库git push -u origin master 将本地…

神经网络的类型

KNN DNN SVM DL BP DBN RBF CNN RNN ANN 概述 本文主要介绍了当前常用的神经网络&#xff0c;这些神经网络主要有哪些用途&#xff0c;以及各种神经网络的优点和局限性。 1 BP神经网络 BP (Back Propagation)神经网络是一种神经网络学习算法。其由输入层、中间层、输出层组成的…

python db2查询_如何将DB2查询转换为python脚本

python db2查询Many companies are running common data analytics tasks using python scripts. They are asking employees to convert scripts that may currently exist in SAS or other toolsets to python. One step of this process is being able to pull in the same …

Dapper基础知识三

在下刚毕业工作&#xff0c;之前实习有用到Dapper&#xff1f;这几天新项目想用上Dapper&#xff0c;在下比较菜鸟&#xff0c;这块只是个人对Dapper的一种总结。 Dapper&#xff0c;当项目在开发的时候&#xff0c;在没有必要使用依赖注入的时候&#xff0c;如何做到对项目的快…

deeplearning4j

deeplearning4j 是基于java的深度学习库&#xff0c;当然&#xff0c;它有许多特点&#xff0c;但暂时还没学那么深入&#xff0c;所以就不做介绍了 需要学习dl4j&#xff0c;无从下手&#xff0c;就想着先看看官网的examples&#xff0c;于是&#xff0c;下载了examples程序&a…

PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试

标签 PostgreSQL , tpcc , tpcb 背景 TPCC, TPCB是工业标准的OLTP类型业务的数据库测试&#xff0c;包含大量的读、写、更新、删除操作。 7*24小时强压耐久测试&#xff0c;主要看数据库在长时间最大压力下的 性能、稳定性、可靠性。 测试CASE &#xff1a; 1、1000万 tpcc 2、…

推理编程_答案集编程的知识表示和推理

推理编程Read about the difference between declarative and imperative programming and learn from code examples (Answer Set Programming, Python and C).了解声明式和命令式编程之间的区别&#xff0c;并从代码示例(答案集编程&#xff0c;Python和C)中学习。 介绍 (In…

给Hadoop初学者的一些建议

我们介绍了新手学习hadoop的入门注意事项。这篇来谈谈hadoop核心知识学习。 hadoop核心知识学习: hadoop分为hadoop1.X和hadoop2.X&#xff0c;并且还有hadoop生态系统。这里只能慢慢介绍了。一口也吃不成胖子。 那么下面我们以hadoop2.x为例进行详细介绍&#xff1a; Hadoop…