CH0805 防線(秦騰與教學評估)
題意
lsp 學習數學競賽的時候受盡了同仁們的鄙視,終於有一天......受盡屈辱的 lsp 黑化成為了黑暗英雄Lord lsp。就如同中二漫畫的情節一樣,Lord lsp 打算毀掉這個世界。數學競賽界的精英 lqr 打算阻止Lord lsp 的陰謀,於是
她集合了一支由數學 競賽選手組成的超級行動隊。由於隊員們個個都智商超群,很快,行動隊便來到了 Lord lsp 的黑暗城堡的下方。
但是,同樣強大的 Lord lsp 在城堡周圍布置了一條“不可越過”的堅固防線。防線由很 多防具組成,這些防具分成了 N 組。我們可以認為防線是一維的,那麽每一組防具都分布 在防線的某一段上,並且同一組防具是等距離排列的。也就是說,我們可以用三個整數 S, E 和 D 來描述一組防具,即這一組防具布置在防線的 S,S + D,S + 2D,...,S + KD(K∈ Z,S + KD≤E,S + (K + 1)D>E)位置上。
黑化的 Lord lsp 設計的防線極其精良。如果防線的某個位置有偶數個防具,那麽這個位 置就是毫無破綻的(包括這個位置一個防具也沒有的情況,因為 0 也是偶數)。只有有奇數 個防具的位置有破綻,但是整條防線上也最多只有一個位置有奇數個防具。作為行動隊的隊 長,lqr 要找到防線的破綻以策劃下一步的行動。但是,由於防具的數量太多,她實在是不 能看出哪裏有破綻。作為 lqr 可以信任的學弟學妹們,你們要幫助她解決這個問題。
對於 100% 的數據,滿足防具總數不多於 \(10^8,S_i≤E_i,1≤T≤5,N≤200000,0≤S_i, E_i,D_i≤2^{31}-1\)。
分析
只有一個位置是奇數,設該位置是x。
那麽大於等於x的位置求前綴和是奇數,小於x的位置求前綴和是偶數,具有二分性質。
時間復雜度\(O(N \log_2 E)\)。
代碼
#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdigit(ch)) data=data*10+ch-'0',ch=getchar(); return data*w; } template<class T>il T read(rg T&x){ return x=read<T>(); } typedef long long ll; using namespace std; co int N=2e5+1; unsigned S[N],E[N],D[N]; int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); int kase=read<int>(); while(kase--){ int n=read<int>(); for(int i=1;i<=n;++i) read(S[i]),read(E[i]),read(D[i]); unsigned l=0,r=1U<<31; while(l<r){ unsigned mid=(l+r)>>1,cnt=0; for(int i=1;i<=n;++i) if(S[i]<=mid) cnt+=1+(min(E[i],mid)-S[i])/D[i]; if(cnt&1) r=mid; else l=mid+1; } if(l==1U<<31) puts("There's no weakness."); else{ unsigned cnt=0; for(int i=1;i<=n;++i) if(S[i]<=l&&l<=E[i]&&(l-S[i])%D[i]==0) ++cnt; printf("%u %u\n",l,cnt); } } return 0; }
CH0805 防線(秦騰與教學評估)