暑假集训csp提高模拟8
赛时rank 19,T1 100,T2 20,T3 10,T4 0
T2
\(\Huge{并查集没有路径压缩挂了80pts}\)
\(rank\,2\)挂成19,随机零食没了。
淦
题目名称看着就离谱
T1 基础的生成函数练习题(gf)
签到题。
考虑有几个奇偶性相同的。
若最多的有三个,输出(2*c-b-a)/2;
反之,若奇数多,将所有的奇数加一后,输出(2*c-b-a)+1;
反之,若偶数多,将所有的偶数加一后,输出(2*c-b-a)+1;
点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;using db = double;
#ifdef LOCAL
FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
// FILE *ErrFile=errfile("err.err");
#else
FILE *Infile = stdin,*OutFile = stdout;
//FILE *ErrFile = stderr;
#endif
ll a[4];
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
cout.tie(nullptr)->sync_with_stdio(false);
cin>>a[1]>>a[2]>>a[3];
sort(a+1,a+1+3);
int tot1 = 0,tot2 = 0;
for(int i = 1;i <= 3; ++i){
tot1 += (a[i] & 1);
tot2 += !(a[i] & 1);
}
if(tot1 == 3 || tot2 == 3){
cout<<(a[3]-a[2])/2+(a[3]-a[1])/2;
}
else{
int ans = 0;
if(tot1 == 2){
for(int i = 1;i <= 3; ++i){
if(a[i]&1) a[i]++;
}
ans++;
}
else{
for(int i = 1;i <= 3; ++i){
if(!(a[i]&1)) a[i]++;
}
ans++;
}
cout<<(a[3]-a[2])/2+(a[3]-a[1])/2+1<<'\n';
}
}
T2 简单的拉格朗日反演练习题(lagrange)
简单题。
考虑求出最小生成树,求出最小生成树上\(i\sim i+1\)的路径最大值,用ST表维护最大值即可。
并查集一定要路径压缩啊!!
点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;using db = double;
#ifdef LOCAL
FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
FILE *ErrFile=errfile("err.err");
#else
FILE *Infile = stdin,*OutFile = stdout;
//FILE *ErrFile = stderr;
#endif
const int N = 2e5 + 10;
int fa[N],u[N],v[N],n,m,q,tim[N],siz[N];
vector<pair<int,int> > edge[N];
#define pii pair<int,int>
#define mk make_pair
int get_fa(int x){return (x==fa[x]?x:fa[x]=get_fa(fa[x]));}
inline void merge(int x,int y,int i){
int fx = get_fa(x),fy = get_fa(y);
if(fx == fy) return;
if(siz[fx] > siz[fy]) swap(x,y),swap(fx,fy);
fa[fx] = fy;
siz[fy] += siz[fx];
edge[fy].push_back(mk(fx,i));
edge[fx].push_back(mk(fy,i));
}
int a[N],ans[N],st[18][N];
inline void pre(){
int t = log2(n)+1;
// memset(st,0,sizeof st);
for(int i = 1;i <= n; ++i) st[0][i] = a[i];
for(int j = 1;j <= t; ++j){
for(int i = 1;i + (1<<j) - 1 <= n; ++i){
st[j][i] = max(st[j-1][i],st[j-1][i+(1<<(j-1))]);
}
}
}
inline void pre1(){
int t = log2(n)+1;
// memset(st,0,sizeof st);
for(int i = 1;i <= n; ++i) st[0][i] = ans[i];
for(int j = 1;j <= t; ++j){
for(int i = 1;i + (1<<j) - 1 <= n; ++i){
st[j][i] = max(st[j-1][i],st[j-1][i+(1<<(j-1))]);
}
}
}
inline int query(int l,int r){
if(l > r) return 0;
int k = log2(r-l+1);
return max(st[k][l],st[k][r-(1<<k)+1]);
}
namespace TCS{
int dfn[N],siz[N],fa[N],son[N],top[N],tot,ori[N],dep[N];
void dfs1(int x){
siz[x] = 1;
dep[x] = dep[fa[x]] + 1;
for(auto i : edge[x]){
int y = i.first;
if(y == fa[x]) continue;
fa[y] = x;
dfs1(y);
siz[x] += siz[y];ori[y] = i.second;
if(siz[son[x]] < siz[y]) son[x] = y;
}
}
void dfs2(int x,int t){
dfn[x] = ++tot;
a[tot] = ori[x];
top[x] = t;
if(son[x]) dfs2(son[x],t);
else return;
for(auto i:edge[x]){
int y = i.first;
if(y == fa[x] || y == son[x]) continue;
dfs2(y,y);
}
}
inline int Query(int x,int y){
int fx = top[x],fy = top[y],ans = 0;
while(fx != fy){
if(dep[fx] < dep[fy]) swap(x,y),swap(fx,fy);
ans = max(ans,query(dfn[fx],dfn[x]));
x = fa[fx];
fx = top[x];
}
if(dep[x] > dep[y]) swap(x,y);
ans = max(ans,query(dfn[x]+1,dfn[y]));
return ans;
}
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
cout.tie(nullptr)->sync_with_stdio(false);
cin>>n>>m>>q;
for(int i = 1;i <= n; ++i) fa[i] = i;
for(int i = 1,u,v;i <= m; ++i){
cin>>u>>v;
merge(u,v,i);
}
int s = get_fa(1);
TCS::dfs1(s);TCS::dfs2(s,s);
pre();
for(int i = 1;i < n; ++i) ans[i] = TCS::Query(i,i+1);
pre1();
int l,r;
for(int i = 1;i <= q; ++i){
cin>>l>>r;
if(l == r){cout<<0<<'\n';continue;}
cout<<query(l,r-1)<<'\n';
}
}
T3 容易的多元拉格朗日反演练习题(multi)
大难题,谁家出题人往csp模拟赛里放AGC的D题啊
不会啊,防AK题,跳了
T4 朴素的抽象代数题(algebra)
难题,找循环节,懒得打了。
总结:唐。
__________________________________________________________________________________________
本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18325849