乙個數轉為二進位制後,最多有log位,所以減小後的個數最多只有log位,加上二分,複雜度為平方級的,主席樹也是log級的,所以總複雜度為(nlog2n+mlogn),可能常數偏大
ac**:
#include#include#include#include#include#include#include#define ll long long
#define mid ((l+r)>>1)
#define lt (k<<1)
#define rt (k<<1)|1
using namespace std;
const int maxn=2e5+5;
const int inf=0x3f3f3f3f;
int read()
int va[maxn],tree[maxn<<2];
void build(int l,int r,int k)
build(l,mid,lt),build(mid+1,r,rt);
tree[k]=tree[lt]&tree[rt];
}int qu(int l,int r,int k,int l1,int r1)
int num[maxn*73],ls[maxn*73],rs[maxn*73],ti[maxn],tot;
mapm;
void add(int l,int r,int &now,int las,int w,int va)
int query(int l,int r,int now,int l1,int r1)
int main( )
if (!ans) break;
va1 = qu(1, n, 1, ans, a);
if (m[va1]) add(1, n, ti[a], ti[a], m[va1], -1);
m[va1] = ans;
add(1, n, ti[a], ti[a], ans, 1);}}
int q=read(),lastans=0;
while(q--)
}
2020牛客多校第五場 D
題意,有兩個操作,求你最少使用的段數 連續使用1操作包括1次也稱為1段 對於操作1 我們可以把 1 n 1看成是乙個環,操作一次,環轉一次。對於操作2 我們可以把1 n 看成是乙個環,操作一次,環轉一次。每使用多次包括1次操作1 之後 再使用多次包括1次操作2 就可以把某些數放到最後乙個數的後面,即...
2020牛客多校第五場D Drop Voicing
給定乙個長度為n的排列,每次可以做兩個操作 1 把排列倒數第二個數放到第一的位置 2 把第乙個數放到最後乙個位置 連續的操作1視作一次操作。問最少需要幾次操作才能把排列變為全部公升序。即12345678 操作2可看作改變排列的順序,相當於在圓上繞圈圈,操作1可改變排列的本質。所以只需要每次進行操作2...
牛客多校(第五場)E room
將乙個房間當做乙個點,後來的房間與之前的房間中不用搬的人作為權值,建圖,跑最大權匹配,就是不用搬的人數,在減一下即可,km演算法,o n 3 include include include includeusing namespace std define n 200 define inf 0x3f...