题面:https://www.cnblogs.com/Juve/articles/11712702.html

树:

我太sb了不知道DROT是1,还在sb找根

记录一个fa[]数组,表示x的祖先中第一个智商比x大的,用栈维护

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
const int MAXN=1e5+;
int n,q,w[MAXN],sta[MAXN],top=,rb[MAXN],topp=,fa[MAXN],deep[MAXN];
int to[MAXN<<],nxt[MAXN<<],pre[MAXN],cnt=;
inline void add(re int u,re int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
void dfs(int x,int f){
deep[x]=deep[f]+;
int res=;
while(w[x]>w[sta[top]]){
rb[++topp]=sta[top];
--top,++res;
}
fa[x]=sta[top];
sta[++top]=x;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==f) continue;
dfs(y,x);
}
--top;
while(res){
sta[++top]=rb[topp--];
--res;
}
}
signed main(){
scanf("%d%d",&n,&q);
for(re int i=;i<=n;++i) scanf("%d",&w[i]);
for(re int i=,u,v;i<n;++i){
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
w[]=0x7fffffff;sta[++top]=;
dfs(,);
for(re int i=,u,v,c,res;i<=q;++i){
scanf("%d%d%d",&u,&v,&c);
res=;
if(c<w[u]) c=w[u],++res;
while(deep[u]>=deep[v]){
if(c<w[u]) c=w[u],++res;
u=fa[u];
}
if(c<w[v]) ++res;
printf("%d\n",res);
}
return ;
}

环:

我没脸抄的方程

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+,mod=1e9+;
int n,e,p[MAXN],q[MAXN],ans;
int q_pow(int a,int b,int p){
int res=;
while(b){
if(b&) res=res*a%p;
a=a*a%p;
b>>=;
}
return res;
}
signed main(){
scanf("%lld%lld",&n,&e);
for(int i=;i<=n;++i) q[i]=n-;
for(int i=,u,v;i<=e;++i){
scanf("%lld%lld",&u,&v);
++p[u],--q[u],--q[v];
}
ans=n*(n-)%mod*(n-)%mod*q_pow(,mod-,mod)%mod;
for(int i=;i<=n;++i){
int res=p[i]*(p[i]-)%mod*q_pow(,mod-,mod)%mod+p[i]*q[i]%mod*q_pow(,mod-,mod)%mod+q[i]*(q[i]-)%mod*q_pow(,mod-,mod)%mod;
ans=(ans-res+mod)%mod;
}
printf("%lld\n",ans);
return ;
}

礼物:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int mod=1e9+,MAXN=1e7+,MAXM=1e7+;
int n,a[MAXN],b[MAXN],ans;
inline int q_pow(re int a,re int b,re int p){
int res=;
while(b){
if(b&) res=res*a%p;
a=a*a%p;
b>>=;
}
return res;
}
int fac[MAXM<<],inv[MAXM<<];
inline void get_c(re int N){
fac[]=fac[]=inv[]=;
for(int i=;i<=N;++i) fac[i]=fac[i-]*i%mod;
inv[N]=q_pow(fac[N],mod-,mod);
for(int i=N-;i>=;--i) inv[i]=inv[i+]*(i+)%mod;
}
inline int C(re int n,re int m){
if(m>n) return ;
if(n==m) return ;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int maxx=,tong[MAXM<<],bas=1e7+;
signed main(){
scanf("%lld",&n);
for(re int i=;i<=n;++i){
scanf("%lld%lld",&a[i],&b[i]);
maxx=max(maxx,a[i]+b[i]);
}
get_c(maxx*+);
for(int i=;i<=n;++i){
for(int t=-a[i];t<=b[i];++t) ans=(ans+tong[t+bas]*C(a[i]+b[i],a[i]+t)%mod)%mod;
for(int t=-b[i];t<=a[i];++t) tong[t+bas]=(tong[t+bas]+C(a[i]+b[i],a[i]-t))%mod;
}
printf("%lld\n",*ans%mod);
return ;
}

最长不下降子序列:

n有1e12,但值域150,发现它是循环的,处理循环节即可

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e6+;
int n,t,a,b,c,d,p[MAXN],ans=,maxx=,cc[MAXN];
int lowbit(int x){
return x&(-x);
}
void update(int pos,int val){
for(int i=pos;i<=maxx;i+=lowbit(i)){
cc[i]=max(cc[i],val);
}
}
int query(int pos){
int res=;
for(int i=pos;i>;i-=lowbit(i)){
res=max(res,cc[i]);
}
return res;
}
int vis[MAXN];
signed main(){
scanf("%lld%lld%lld%lld%lld%lld",&n,&t,&a,&b,&c,&d);
if(n<=){
p[]=maxx=t;
for(int i=;i<=n;++i){
p[i]=(p[i-]*p[i-]%d*a%d+b*p[i-]%d+c%d)%d;
maxx=max(p[i],maxx);
}
++maxx;
for(int i=;i<=n;++i){
int res=query(p[i]+)+;
update(p[i]+,res);
ans=max(ans,res);
}
printf("%lld\n",ans);
return ;
}
p[]=maxx=t;
vis[t]=;
int pos=,q=;//q:xunhuanchangdu
for(int i=;i<=n;++i){
p[i]=(p[i-]*p[i-]%d*a%d+b*p[i-]%d+c%d)%d;
maxx=max(p[i],maxx);
if(vis[p[i]]){
pos=i;
q=i-vis[p[i]];
break;
}
vis[p[i]]=i;
}
++maxx;
if(!pos){
//cout<<pos<<endl;
for(int i=;i<=n;++i){
int res=query(p[i]+)+;
update(p[i]+,res);
ans=max(ans,res);
}
printf("%lld\n",ans);
return ;
}else{
int len=n-vis[p[pos]]+;
int xh=len/q;//xunhuanjici
int ys=len%q;//yuji
for(int i=;i<=pos-;++i){
int res=query(p[i]+)+;
update(p[i]+,res);
ans=max(ans,res);
}
for(int k=;k<=q;++k){
for(int i=pos;i<=min(n,pos+q-);++i){
p[i]=p[i-q];
int res=query(p[i]+)+;
update(p[i]+,res);
int tmp=i-pos+;
res=res+xh-k-+(tmp<=ys);
ans=max(ans,res);
}
pos=pos+q;
}
printf("%lld\n",ans);
return ;
}
return ;
}

完全背包问题:

同余系最短路,咕咕

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
const int MAXN=;
int n,m,l,c,v[MAXN],pos,minn=0x3f3f3f3f3f3f3f3f;
int dis[],cnt[];
queue<int>q;
bool in[];
void spfa(){
memset(dis,0x3f,sizeof(dis));
memset(cnt,0x3f,sizeof(cnt));
dis[]=cnt[]=;
in[]=;
q.push();
while(!q.empty()){
int x=q.front();
q.pop();
in[x]=;
for(int i=;i<=n;++i){
int y=(x+v[i])%minn;
if(v[i]>=l&&cnt[x]>=c) break;
if(dis[y]>dis[x]+v[i]){
dis[y]=dis[x]+v[i];
if(v[i]>=l) cnt[y]=cnt[x]+;
if(!in[y]) q.push(y),in[y]=;
}else if(dis[y]==dis[x]+v[i]){
if(cnt[y]>cnt[x]+(v[i]>l)){
cnt[y]=cnt[x]+;
if(!in[y]) q.push(y),in[y]=;
}
}
}
}
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;++i){
scanf("%lld",&v[i]);
minn=min(minn,v[i]);
}
scanf("%lld%lld",&l,&c);
sort(v+,v+n+);
spfa();
for(int i=,x;i<=m;++i){
scanf("%lld",&x);
if(dis[x%minn]<=x) puts("Yes");
else puts("No");
}
return ;
}

最近公共祖先:

想到了正解,但不会维护subtree(fa[x])-subtree(x)的信息

考虑dfs序,更新时减去子树x即可

重复染的点可以直接break

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+;
int n,m,w[MAXN];
bool vis[MAXN];
int to[MAXN<<],nxt[MAXN<<],pre[MAXN],cnt=;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
int in[MAXN],out[MAXN],fa[MAXN],dfn=;
void dfs(int x){
in[x]=++dfn;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x]) continue;
fa[y]=x;
dfs(y);
}
out[x]=dfn;
}
int tr[MAXN<<],laz[MAXN<<];
void down(int k){
tr[k<<]=max(tr[k<<],laz[k]);
tr[k<<|]=max(tr[k<<|],laz[k]);
laz[k<<]=max(laz[k<<],laz[k]);
laz[k<<|]=max(laz[k<<|],laz[k]);
laz[k]=;
}
void update(int k,int l,int r,int opl,int opr,int val){
if(opl<=l&&r<=opr){
tr[k]=max(tr[k],val);
laz[k]=max(laz[k],val);
return ;
}
if(laz[k]) down(k);
int mid=(l+r)>>;
if(opl<=mid) update(k<<,l,mid,opl,opr,val);
if(opr>mid) update(k<<|,mid+,r,opl,opr,val);
tr[k]=max(tr[k<<],tr[k<<|]);
}
int query(int k,int l,int r,int opt){
if(l==r) return tr[k];
if(laz[k]) down(k);
int mid=(l+r)>>;
if(opt<=mid) return query(k<<,l,mid,opt);
else return query(k<<|,mid+,r,opt);
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;++i){
scanf("%lld",&w[i]);
}
for(int i=,u,v;i<n;++i){
scanf("%lld%lld",&u,&v);
add(u,v),add(v,u);
}
dfs(),vis[]=;
for(int i=;i<=m;++i){
char opt[];
int v,ans;
scanf("%s%lld",opt,&v);
if(opt[]=='M'){
update(,,n,in[v],out[v],w[v]);
vis[v]=;
while(vis[fa[v]]!=){
update(,,n,in[fa[v]],in[v]-,w[fa[v]]);
update(,,n,out[v]+,out[fa[v]],w[fa[v]]);
v=fa[v];
}
}else{
ans=query(,,n,in[v]);
if(!ans) ans=-;
printf("%lld\n",ans);
}
}
return ;
}

csps-模拟7980题解的更多相关文章

  1. CSP-S 模拟53 题解

    题解: T1 u: 一看到修改这么多,但询问其实只有一个不难想到差分,但是他这个形状可以说很不规则,于是我们想到分别维护竖着的和斜着的差分,然后最后合并即可. 考场上瞎调了一波系数莫名AC,其实是维护 ...

  2. csp-s模拟99题解

    题面:https://www.cnblogs.com/Juve/articles/11791219.html 上来先看T1,发现和之前做过的treap一样,是线段树维护单调栈,然后打了一个小时,然后它 ...

  3. csp-s模拟9697题解

    题面:https://www.cnblogs.com/Juve/articles/11790223.html 96: 刚一看以为是水题,直接等差数列求和就好了,然后发现模数不是质数,还要1e18*1e ...

  4. CSP-S模拟68 题解

    T1: 不难想到贪心,但是怎么贪,他有两个限制条件,所以不是很好搞,所以用一个类似与wqs二分的思路我可能在口胡,因为你肯定要把最小的给删掉,所以你限定一个x或y,然后在选出另一个限制,所以要同时维护 ...

  5. 反省——关于csp-s模拟50

    本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...

  6. csp-s模拟测试97

    csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...

  7. csp-s模拟测试87

    csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...

  8. csp-s模拟测试80(b)

    csp-s模拟测试80(b) 水题没什么可写的. $T1SB$规律题正解调了仨小时就过了. $T2SBDp$题颓完题解就秒了. $T3SB$数据结构考场想到正解就弃了,考后太懒一半正解一发随机化就A了 ...

  9. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  10. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

随机推荐

  1. php的生命周期的概述

    1. PHP是随着WEB服务器(apache)的启动而运行的: 2. PHP通过mod_php5.so()模块和服务器(apache)相连 3. PHP总共有三个模块:内核.Zend引擎.以及扩展层: ...

  2. CSS3-2d3d

    1.过渡(transition)操作谁,给谁加过渡 transition:要过渡的属性     花费时间    运动曲线    何时开始:    多组属性变化,还是用 逗号 隔开 transition ...

  3. 微信小程序のwxml列表渲染

    列表渲染存在的意义 以电商为例,我们希望渲染5个商品,而又希望容易改变,我们就要在wxml中动态添加. <view> <block wx:for="{{products}} ...

  4. Linux 进程间通信 共享内存

    1.特点: 1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.如管道当在内核空间创建以后,用户空间需要内存  拷贝,需要拷贝数据,所以效率低. 2)为了在多个进 ...

  5. Struts2开发环境搭建

    eclipse配置struts2开发环境: 1.导入jar包:复制Struts\apps\struts2-blank\WEB-INF\lib下的所有jar包到当前项目的lib文件夹下 2.在web.x ...

  6. 16. 继承(extends)

    1.语法 class 类名1 extends 类名2{ //成员变量和成员方法 } 2.继承要注意的事项: 1)千万不要为了减少重复代码而去继承,只有真正存在着继承关系的时候才去继承. 2)父类私有的 ...

  7. Vue开发实战

    递归组件 关键是组件在模板内能调用自身,关键是name属性 首先我们先定义数据格式 list: [ { title: '标题1' }, { title: '标题2', children: [ { ti ...

  8. Batch - FOR %%a %%b

    总结 %%a refers to the name of the variable your for loop will write to. Quoted from for /?: FOR %vari ...

  9. Delphi 日期函数列表

    引用单元 :DateUtils CompareDate 比较两个日期时间值日期部分的大小CompareDateTime 比较两个日期时间值的大小CompareTime 比较两个日期时间值时间部分的大小 ...

  10. 字符串dp——牛客多校第五场G

    比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...