做兩遍 \(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 了。考慮每...