省選模擬19

2022-09-22 06:12:11 字數 2928 閱讀 4667

做兩遍 \(lis\) ,分別從前後開始

看看 \(i\) 是否在 \(lis\) 上以及這個權值是否唯一

code

#include//#define int long long//overflow !!! memory limit !!!

#define rint signed

#define lowbit(x) x&-x

#define inf 0x3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,ans,a[100010];

int f1[100010],f2[100010],ct[100010];

int bit1[100010],bit2[100010];

inline void ins1(int x,int k)

inline int query1(int x)

inline void ins2(int x,int k)

inline int query2(int x)

signed main()

for(int i=n;i>=1;i--)

for(int i=1;i<=n;i++) ans=max(ans,f1[i]);

for(int i=1;i<=n;i++) if(f1[i]+f2[i]-1==ans) ct[f1[i]]++;

printf("%d\n",ans);for(int i=1;i<=n;i++) if(f1[i]+f2[i]-1==ans&&ct[f1[i]]==1) printf("%d ",i);

return 0;

}

\(30\) 暴力演算法是設 \(f_\) 表示 \(x\) 選 \(i\) 時的方案數 ( \(v\) 為值域範圍)

\(f_=f_\times \sum\limits_^vf_j[gcd(i,j)==1]\)

合併到根的時候對答案貢獻

反演一下變成

\(\sum\limits_^vf_j\sum\limits_\mu(d)\)

\(\sum\limits_\mu(d)\sum\limits_f_j\)

列舉倍數貢獻

然後再換一下根就好了

code

#include#define int long long//overflow !!! memory limit !!!

#define rint signed

#define mod 1000000007

#define inf 0x3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,rt;

int l[60],r[60];

int f[60][50010],g[50010],h[50010],hh[50010],ans[60];

int head[60],ver[110],to[110],tot;

int prime[50010],mu[50010],cnt;

bool is[50010];

int gcd(int x,int y)

inline void add(int x,int y)

inline void md(int &x)

inline int qpow(int x,int k)

return res;

}void dfs1(int x,int fa)

}void dfs2(int x,int fa)

}signed main()

} n=read();

for(int i=1;i<=n;i++) l[i]=read();for(int i=1;i<=n;i++) r[i]=read();

for(int i=1,x,y;i

用棧來維護括號序列的匹配

用 \(vec\) 存下所有的合法左端點

然後根號分治小於根號的每次暴力用線段樹修改

大於的每次二分左端點就行

code#include//#define int long long//overflow !!! memory limit !!!

#define rint signed

#define lson rt<<1

#define rson rt<<1|1

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m;

int fa[100010],ans[4000010],r[100010];

int stk[100010],p;

struct segst[100010*4];

vectora,vec[100010];

vector>q[100010];

char str[100010];

int getfa(int x)

inline void pushup(int rt)

void upd(int rt,int l,int r,int pos,int k)

int query(int rt,int l,int r,int l,int r)

signed main()

for(int i=1,j;i<=n;i++)

for(auto l:q[i])

} }for(int i=1;i<=m;i++) printf("%d\n",ans[i]);

return 0;

}

考試 省選19

居然沒出原題聽奇怪。好難啊。t1計算幾何。把x有交集的牆合併起來。然後再每乙個牆的端點上加入每乙個 x 軸以上的點和這個端點的向量。然後每個 vector 極角排序即可。查詢的時候對每個端點算出和當前點的向量,然後在 vector 中查詢比這個點小的個數。如果當前端點是左端點就 個數個,否則答案 個...

省選模擬 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 了。考慮每...