賽中和隊友一直在搞乙個胡搞做法,艱難優化到本地跑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...