2020牛客多校第五場H

2021-10-08 17:28:02 字數 1043 閱讀 9107

乙個數轉為二進位制後,最多有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...