b題:crazy binary string
把0看成-1,字首和,pos[ 0+n ] = 0
#include usingview codenamespace
std;
const
int maxn = 1e5+3
;int
a[maxn];
int pos[maxn<<1
];string
s;int
main()
for(int i=0; i<=2*n; i++)
pos[
0+n ] = 0; //
注意這個不是簡單的0 而是 0+n
int ans=0
;
for(int i=0; i)
}cout
int zero=0
;
for(int i=0; i)
cout
<
}
h題: magic line
排序 ,找 n/2點 和 n/2+1點
#include#includeview code#include
using
namespace
std;
const
int maxn=20000
;const
int m=900000009
;struct
pointpo[maxn];
bool
cmp(point a,point b)
intmain()
sort(po+1,po+1+n,cmp);
if(po[n/2].x!=po[n/2+1].x) printf("
%d %d %d %d\n
",po[n/2].x,m,po[n/2+1],-m);
else printf("
%d %d %d %d\n
",po[n/2].x-1,po[n/2+1].y+m,po[n/2].x+1,po[n/2].y-m);}}
g題:removing stones
參考自啟發式分治,類似題:
題意:給定n,表示n堆石子,每堆石子數為a,問多少個區間,可以滿足「石子總和若為偶數,那麼可以兩兩取來自不同堆的石子,直到取完; 如果為奇數,那麼排除其中乙個,然後可以兩兩取來自不同堆的石子,直到取完」。
思路:結論是,如果乙個區間的區間和大於等於區間最大值的兩倍,則這個區間合法。 考慮分治,我們首先找到區間最大值(為了不重複統計,多個最大值時,統一取最左邊的,這個可以st表示實現),然後考慮跨越這個位置的合法區間個數。列舉一端,另外一段二分即可,選擇端時要用到啟發式,選擇更短的那一段,防止最差情況不斷發生。
由於分治的性質,我們每次的複雜度要傾向於小的那邊,即是乙個啟發式合併的逆過程,所以啟發式分治複雜度是o(nlogn)的,加上二分,這個做法的複雜度是o(nlog^2n)。
#include usingview codenamespace
std;
const
int maxn = 3e5+3
;int
a[maxn];
int st[maxn][20
];int
lg[maxn];
intn;
long
long
suf[maxn],pre[maxn],ans;
void
init_log()
void init_st() //
關於最值的pos的st表 (多個最大值時,統一取最左邊的,這個可以st表示實現)
}}int rmq(int l,int r)
void solve(int l,int
r) }
else
}solve(l,mid-1
); solve(mid+1
,r);
}int
main()
for(int i=1; i<=n; i++)
init_st();
solve(
1,n);
printf(
"%lld\n
", ans);}}
2019牛客暑期多校訓練營(第三場)
目錄 b crazy binary string 思維 d big integer 數論 f planting trees 思維 單調佇列 h magic line 計算幾何 j lru management 模擬 題意 計算最長的01子串和子串行,其中01數量相同。分析 對於子串那麼直接將0製成 ...
2019牛客暑期多校訓練營(第三場)F
這個學期終於結束了,暑假就要來了。然而,作為大學畢業要求的一部分,你必須在假期期間參加一些社會服務。最後,你決定加入乙個志願者團體,在山上植樹。為了簡化這個問題,讓我們用乙個n乘以n times n網格。讓我們給行編號1到n從上到下,給列編號1到n從左到右。用aij ij 表示第i行第j列的格仔的高...
2019牛客暑期多校訓練營(第三場) B題
題意 給你乙個長度為n的01字串,問該字串中01個數相等的最長子串和子串行分別是多少。分析 首先,大家要知道什麼是子串行,什麼是子串,子串行是不一定是連續的,它可以是原串中任意元素按照相對位置組成的序列,但是子串就不是了,子串一定是連續的,不可分割的按照絕對位置組成的序列。知道這個概念之後,大家可以...