似乎又是挺簡單的一場??戰神的良心題!!
考場上完全沒有思考第一題的性質,導致啥也不會到九點
第二題看完之後認為是dp套dp後來發現可以爆搜
第三題似乎是暴力hash就行,也是找性質題
主要是自己的思維量不夠,啥性質也找不到。。。
如果想要判斷乙個數x是否可行,就是判斷所有\(a[i]&x==x\)的數能否將整個序列分成k段並且作為這k段的最大值出現
我們先不考慮判斷的方法,如果我們可以判斷了,那麼就直接按位確定就行了
發現如果區間數量多於k,那麼直接合併兩個區間答案只會大不會小
所以實際上我們找的就是最大區間劃分數,可以用線段樹暴力做,也可以根據每乙個數是劃分到自己這裡,還是前乙個合法的或者後乙個合法的
ac_code#includeusing namespace std;
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read()
while(isdigit(ch))
return s*t;
}const int n=2e5+5;
int n,k,a[n],ans;
int ml[n],mr[n],sta[n],top;
int pre[n],nxt[n],f[n];
bool check(int x)
signed main()
while(isdigit(ch))
return s*t;
}const int n=10;
const int mod=1e9+7;
int ksm(int x,int y)return ret;
}int n,a[n],ans;
int su[n],so[n],xl[n],b[n],fas;
bool com(int x,int y)
mapmp;int ys[n];
int c(int x,int y)
ji[x]=b[x];dfs_fas(x+1);
}int f[n],fmx,sum;
bool vis[1<<20];
int lsh[n],lh;
void dfs_sort(int x)
while(isdigit(ch))
return s*t;
}const int n=2e5+5;
const ull bas=10;
const ll mod=1000000007;
const ll mob=998244353;
const ll moa=998244354;
char chs[n],cht[n];int pp[n*2],lp;
int ls,lt,ss[n],st[n],z[n*2];
ull ba[n],hs[n],ht[n];
ll ca[n],cs[n],ct[n];
ll da[n],ds[n],dt[n];
ll aa[n],as[n],at[n];
bool ck(int l1,int r1,int l2,int r2)
signed main()
cerr<
省選模擬 19 09 11
ps.博主趁資訊課摸魚考的暴零模擬 看門人憑感覺就知道是長鏈剖分,將路徑查分一下,dis u di sv 2 dis lc adis u dis v 2 dis disu disv 2 disl ca 維護fu,if fu,i 表示u的子樹,深度為 i 的點的 dis disdi s最大值 考慮如何...
省選模擬96
容易發現當 k 3 時無解。然後容易證明當 k 3 時,只有 m 3 才是有解的。然後直接做不好做,考慮欽定然後容斥出合法方案。對於 k 3 列舉乙個點,然後計算另乙個的方案數。其他情況類似,欽定滿足條件的角,然後容斥。然後對於每乙個 o n 的式子用組合恒等式大力化簡就可以做到 o 1 了。考慮每...
省選模擬86
首先考慮基礎的dp定義,那麼發現轉移需要的係數只和dp是奇數的點的個數有關,所以將這個東西記錄在dp狀態中就行了。然後推一下dp轉移,發現轉移係數和奇數的點的個數沒有關係,只與是否存在這樣的點有關,所以用01來記錄就可以了。考慮用總方案減去不合法的方案,也就是1號點能到達的點和2號點能到達的點沒有交...