20190807杭電多校第六場

2021-09-25 23:17:27 字數 2584 閱讀 6357

賽中和隊友一直在搞乙個胡搞做法,艱難優化到本地跑10s,可惜始終過不了。

最後只好補了題解做法。。。

倒著刪除,用樹狀陣列求lis,維護一條當前的lis的路徑。若被刪除的數不在當前的lis中,則答案不變;否則,重新做一遍lis。

據說因為lis的期望長度為sqrt(n),所以被選中的概率是

ac**:

#includeusing namespace std;

#define ll long long

#define db double

#define m_p make_pair

#define p_b push_back

#define for(i,a,b) for(int i=a;i<=b;i++)

#define ls (rt<<1)

#define rs ((rt<<1)|1)

#define mst(a,b) memset(a,b,sizeof(a))

const int maxn=5e4+100;

const db eps=1e-8;

const int inf=0x3f3f3f3f;

const int mod=1e9+7;

const int seed=131;

int t,n,ans,c[maxn],pos[maxn],pre[maxn],maxp;

int p[maxn],k[maxn],num,pp;

bool vis[maxn];

inline int lowbit(int x)

inline void modify(int x,int z)

}inline void query(int x)

}inline void solve()

} }while(maxp)

}int out[maxn];

int main()

else p[k[i]]=0;

} for(int i=1;i<=n;i++)logn)" class="mathcode" src=""/>顯然是可以的。

想到先對所有點按x排序,將y離散化,並用離散化後在陣列中的下標代替原來的值。

按x列舉,先列舉左邊的邊(即較小的x),當左邊的邊確定時,右邊的邊從左往右一列列的掃,同時將w加在對應的y上,用線段樹來維護,每次修改都是logn的,每列舉完一列查詢一次最大子段和的值,用乙個變數維護最大值即可。

列舉左邊的邊是o(n)的,列舉右邊的邊、修改線段樹中的值和查詢的總過程可認為是o(nlogn)的,因此總的時間複雜度為

ac**:

#includeusing namespace std;

#define ll long long

#define db double

#define m_p make_pair

#define p_b push_back

#define for(i,a,b) for(int i=a;i<=b;i++)

#define ls (rt<<1)

#define rs ((rt<<1)|1)

#define mst(a,b) memset(a,b,sizeof(a))

const int maxn=2e3+5;

const db eps=1e-8;

const int inf=0x3f3f3f3f;

const int mod=1e9+7;

const int seed=131;

int t,m,cnt;

ll ans;

struct nodeq[maxn<<2];

struct point" class="mathcode" src=""/>和

預處理o(n*60)+區域個數o(

所以總的時間複雜度o(

ac**:

#includeusing namespace std;

#define ll long long

#define db double

#define m_p make_pair

#define p_b push_back

#define for(i,a,b) for(int i=a;i<=b;i++)

#define ls (rt<<1)

#define rs ((rt<<1)|1)

#define mst(a,b) memset(a,b,sizeof(a))

const int maxn=10+5;

const db eps=1e-8;

const int inf=0x3f3f3f3f;

const int mod=60;

const int seed=131;

int t,n,m;

struct nodea[maxn];

int xx[maxn],yy[maxn],cntx,cnty;

int numx[maxn][65],numy[maxn][65];

inline void init()

tt=ans[0]=ans[1]=0;

while(!pq.empty())

cout<

}return 0;

}

杭電多校第六場(IF)

題意 有命題 將 b 進製數y按位相加,迴圈無窮次,最終結果若 x 0,則有y x 0,反之不然 給出b和x,判斷命題是否成立 打表發現的b x 1時成立,看到有數論大佬推出來的 想看推導的右轉 includeusing namespace std typedef unsigned long lon...

2019 杭電多校(第六場)

1005 snowy smile 線段樹 題意給你n個點 讓你畫個矩形 使矩形內所含點的權值和最大 必須有點 思路離散化 列舉矩形的左右區間 線段樹維護y座標的最大欄位和 複雜度 o n n lgn include using namespace std typedef long long ll c...

杭電多校第六場 snowy white

首先將縱座標離散化。將所有點按照橫座標排序,列舉矩形的上邊界,然後往後依次加入每個點,這樣就確定了 矩形的上下邊界。設 v y 表示矩形內部縱座標為 y 的點的權值和,則答案為 v 的最大子段和,用線段樹維護帶修改的最大子段和即可。時間複雜度 o nlogn include include incl...