190911 CSP-S 2019模拟

这是一篇关于CSP-S 2019模拟赛的解析文章,涵盖了A、B、C三个部分。A题涉及长链剖分,B题相对简单,是关于仙人掌的dp问题,C题则在数论之神的指导下,通过转化处理为两两互质的情况来解决。
摘要由CSDN通过智能技术生成

A

d d dd dd长链剖分与辣鸡 W O J WOJ WOJ
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
#define pb push_back
using namespace std;
const int rlen=1<<18|1;
char buf[rlen],*ib=buf,*ob=buf;
#define gc() (((ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin)),ib==ob)?-1:*ib++)
typedef pair<int,int> pii;
typedef long long ll;
inline int read(){
   
	int ans=0;
	char ch=gc();
	while(!isdigit(ch))ch=gc();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
	return ans;
}
const int mod=998244353;
inline int add(int a,int b){
   return (a+=b)<mod?a:a-mod;}
inline int dec(int a,int b){
   return (a-=b)<0?a+mod:a;}
inline int mul(int a,int b){
   return (ll)a*b%mod;}
inline void Add(int&a,int b){
   (a+=b)<mod?a:(a-=mod);}
inline void Dec(int&a,int b){
   (a-=b)<0?(a+=mod):a;}
inline void Mul(int&a,int b){
   a=(ll)a*b%mod;}
inline int ksm(int a,int p){
   int ret=1;for(;p;p>>=1,Mul(a,a))if(p&1)Mul(ret,a);return ret;}
const int N=1e6+5;
namespace sgt{
   
	#define lc (p<<1)
	#define rc (p<<1|1)
	#define mid (l+r>>1)
	ll mx[N<<2],add[N<<2];
	inline void pushnow(int p,ll v){
   add[p]+=v,mx[p]+=v;}
	inline void pushdown(int p){
   (add[p])&&(pushnow(lc,add[p]),pushnow(rc,add[p]),add[p]=0);}
	inline void update(int p,int l,int r,int k,ll v){
   
		if(l==r){
   mx[p]=max(mx[p],v);return;}
		pushdown(p);
		k<=mid?update(lc,l,mid,k,v):update(rc,mid+1,r,k,v);
		mx[p]=max(mx[lc],mx[rc]);
	}
	inline void modify(int p,int l,int r,int ql,int qr,ll v){
   
		if(ql<=l&&r<=qr)return pushnow(p,v);
		pushdown(p);
		if(qr<=mid)modify(lc,l,mid,ql,qr,v);
		else if(ql>mid)modify(rc,mid+1,r,ql,qr,v);
		else modify(lc,l,mid,ql,qr,v),modify(rc,mid+1,r,ql,qr,v);
		mx[p]=max(mx[lc],mx[rc]);
	}
	inline ll query(int p,int l,int r,int ql,int qr){
   
		if(ql<=l&&r<=qr)return mx[p];
		pushdown(p);
		if(qr<=mid)return query(lc,l,mid,ql,qr);
		else if(ql>mid)return query(rc,mid+1,r,ql,qr);
		return max(query(lc,l,mid,ql,qr),query(rc,mid+1,r,ql,qr));
	}
	#undef lc
	#undef rc
	#undef mid
}
inline void ckmax(ll&a,ll b){
   a=a>b?a:b;}
int n,fa[N],dep[N],mxdep[N],hson[N],len[N],L[N],R[N];
ll ans[N];
int pred[N],num[N],tot=0;
vector<pii>e[N];
void dfs1(int p){
   
	mxdep[p]=dep[p];
	for(ri i=0,v;i<e[p].size();++i){
   
		dep[v=e[p][i].fi]=dep[p]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值