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.pswp.cn/news/387882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387882.shtml
英文地址,請注明出處:http://en.pswp.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…