題目大意: 求一數列的最大上公升子串行+必定存在此最大上公升子串行的點
如果乙個點必定存在與最長上公升子串行中,那麼必須滿足兩個條件:1.該點存在於最長上公升子串行中。2.通過此點的最長上公升子串行長度唯一。
但此題由於資料範圍為1000005,所以常規n方求最長上公升子串行的方法肯定不行,那麼就考慮用樹狀陣列維護小於當前值的最大上公升子串行數即可。
如何判斷乙個點是否在最長上公升子串行中?從前後各掃一遍如果前後的最長上公升子串行想加的值等於最長上公升自序列長度,那麼該點一定在最長上公升子串行中。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 50005
#define maxn1 200005
#define ll long long
const
long
long inf=100000000000000ll;
int n,m;
int cnt,cnt1;
int st[maxn1],end[maxn1],next[maxn1],last[maxn1],len[maxn1];
int end1[maxn1],next1[maxn1],last1[maxn1],len1[maxn1];
int end2[maxn1],next2[maxn1],last2[maxn1];
ll dis[maxn][5];
priority_queue>q;
bool mark[maxn];
int a,b,c,d;
void dj(int x,int y)}}
}void dj2(int x,int y)}}
}void insert(int x,int y,int z)
void insert1(int x,int y,int z)
void insert2(int x,int y)
ll minl;
int ru[maxn];
bool jd[maxn],mark2[maxn];
int ans=0;
queue
tp;int dp[maxn];
main()
scanf("%d%d%d%d",&a,&b,&c,&d);
dj(a,1);dj(c,3);
dj2(b,2);dj2(d,4);
int minl=dis[b][1]+dis[d][3];
int minl1=dis[b][1],minl2=dis[d][3];
if(minl>=inf)
for(i=1;i<=n;i++)
}for(i=1;i<=n;i++)
for(i=1;i<=m;i++)
} //建立新圖
// for(i=1;i<=n;i++)cout}
while(tp.size())
}for(i=1;i<=n;i++) ans=max(ans,dp[i]);
cout
<}
多校聯訓2
將前 n 個正整數,分成 m 個集合裡,應該是按照第二類斯特林數的類別分的 然後乙個劃分是好的,當且僅當存在 m 的圓排列。然後求好的劃分的數量,我們考慮乙個問題的轉化,我們乙個集合 a 可以向另乙個集合連邊 b 當且僅當,max a min b 容易發現這樣的邊至少是單向的。也就是說,如果我們把所...
P3499 2015多校聯訓6 密碼(鍊錶模擬)
問題描述 假髮通過了不懈的努力,得到了將軍家門鎖的密碼 一串小寫英文本母 但是假髮被 十四和猩猩他們盯上了,所以假髮需要把密碼傳遞出去。因為假髮不想十四他們發現幾松門 前貼的小紙條就是將軍家的密碼,所以他加密了密碼 新八 聽起來有點詭異 加密方法 如下 隨機地,在密碼中任意位置插入隨機長度的小寫字串...
P3467 2015多校聯訓1 統計
時間限制 20000 ms 空間限制 165536 kb 問題描述 現在有乙個陣列 a,陣列中有 n 個元素。定義乙個函式 f l,r 表示 i l i r 的 個數,其中 i 符合條件 不存在 j l j r 且 j i 滿足 ai mod aj 0 求 i 1n j inf i,j mod 10...