2.15模拟总结

前言

day11
期望:40+60+30=130
实际:40+0+30=70
rnk16

挂大分了。。
T2树边不加双向:60->0。
这什么伞兵bug啊!
整体状态也不太好,T2死磕无果。
T1看出正解结果写不出来拉插,乐。

题目解析

T1 网格序列(grid)

一开始看就不太想做的一个题。
因为对自己计数方面的能力还是不太自信。。。
还是喜欢树算法awa。
死磕T2N年后回来发现这个题有点纸老虎,拉插一下不就能过吗awa
然后…拉插柿子长啥样来着…
然后就for循环40分跑路了。

关键性质:一个序列合法,当且仅当行最大值的最大值等于列最大值的最大值
有了这个就不难列出答案的式子了:
ans=∑i=1k(in−(i−1)n)(im−(i−1)m)ans=\sum_{i=1}^k(i^n-(i-1)^n)(i^m-(i-1)^m)ans=i=1k(in(i1)n)(im(i1)m)
这个东西显然是一个 n+m+1n+m+1n+m+1 次的多项式。
直接连续选点快速插值即可 O(n)O(n)O(n) 求单点值。
求函数值的时候快速幂会炸,需要线性筛把 xn,xmx^n,x^mxn,xm 这两个东西当成积性函数筛出来(还是完全积性的呢!
然后就做完了。
确实是不太难的一道题,唉。

T2 交换游戏(exchange)

今日死因了属于是。
一直在想dfs序转二维数点问题,但是那样的话二维线段树直接就带上两个log了。
然后就一直在寻找各种优化到方法,后来整了一个差分加二维线段树合并的神奇科技拿掉了一个log,却带上了18倍常数。
呵呵,还不如个log。

正解感觉和NOI那道轻重边异曲同工,都是利用染色来进行题意的转化。
题意从另一个角度来看就是,一棵树一条边的两端点在另一棵树上形成的链之间的边是需要在考虑范围的。
然后用染色满足反过来的限制,dsu on tree 维护。
确实巧妙。

T3 树的删除(delete)

别说这个题我还真想到LCT了。
但是我也就只看出操作1可以当成换根,对于维护排名还是很茫然。
按照题解的思路,这个“链”可以恰好用类似access维护虚实边的方式维护。
确实不太好想到…但是既然觉得是LCT其实应该从那个算法反过来出发想想的。

感叹出题人真是用心良苦。

代码

T1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=2e6+100;
const int M=1e6+100;
const int mod=998244353;int n,m,k;inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}ll nmi[N],mmi[N];
int vis[N],prime[N],tot;
void init(){nmi[1]=mmi[1]=1;for(int i=2,o=n+m+2;i<=o;i++){if(!vis[i]){prime[++tot]=i;nmi[i]=ksm(i,n);mmi[i]=ksm(i,m);}for(int j=1;j<=tot&&prime[j]<=o/i;j++){int now=prime[j];nmi[now*i]=nmi[now]*nmi[i]%mod;mmi[now*i]=mmi[now]*mmi[i]%mod;vis[now*i]=1;if(i%now==0) break;}}return;
}
ll f[N];
ll jc[N],ni[N],pre[N],suf[N];
ll lagrange(int n,ll *y,int k){//if(k<=n) return y[k];jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;ni[n]=ksm(jc[n],mod-2);for(int i=n-1;i>=0;i--) ni[i]=ni[i+1]*(i+1)%mod;pre[0]=1;for(int i=1;i<=n;i++) pre[i]=pre[i-1]*(k-i+mod)%mod;suf[n+1]=1;for(int i=n;i>=1;i--) suf[i]=suf[i+1]*(k-i+mod)%mod;ll ans(0);for(int i=1;i<=n;i++){ll add=y[i]*pre[i-1]%mod*suf[i+1]%mod*ni[i-1]%mod*ni[n-i]%mod;//printf("i=%d add=%lld y=%lld pre=%lld suf=%lld ni=%lld %lld\n",i,add,y[i],pre[i-1],suf[i+1],ni[i-1],ni[n-i]);if((n-i)&1) ans=(ans+mod-add)%mod;else ans=(ans+add)%mod;}return ans;
}signed main(){freopen("grid.in","r",stdin);freopen("grid.out","w",stdout);n=read();m=read();k=read();init();int o=n+m+2;for(int i=1;i<=o;i++){f[i]=(f[i-1]+(nmi[i]-nmi[i-1]+mod)*(mmi[i]-mmi[i-1]+mod))%mod;}printf("%lld\n",lagrange(o,f,k));return 0;
}
/*
*/

T2

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=2e5+100;
const int M=1e6+100;
const int mod=998244353;int n,m,k;
bool jd=0;#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
struct node{int lc,rc,sum;
}tr[N<<2];
node merge(node a,node b){if(!a.sum) return b;else if(!b.sum) return a;else return (node){a.lc,b.rc,a.sum+b.sum-(a.rc==b.lc)};
}
int laz[N<<2];
inline void tag(int k){tr[k].lc=tr[k].rc=0;tr[k].sum=1;laz[k]=0;
}
inline void pushdown(int k){if(laz[k]==-1) return;laz[k]=-1;tag(ls);tag(rs);return;
}
inline void pushup(int k){tr[k]=merge(tr[ls],tr[rs]);return;
}
void change(int k,int l,int r,int p,int w){if(l==r){tr[k].lc=tr[k].rc=w;tr[k].sum=1;return;}pushdown(k);if(p<=mid) change(ls,l,mid,p,w);else change(rs,mid+1,r,p,w);pushup(k);
}
node ask(int k,int l,int r,int x,int y){if(x>y) return (node){-1,-1,0};if(x<=l&&r<=y) return tr[k];pushdown(k);if(y<=mid) return ask(ls,l,mid,x,y);else if(x>mid) return ask(rs,mid+1,r,x,y);else return merge(ask(ls,l,mid,x,y),ask(rs,mid+1,r,x,y));
}
struct tree2{vector<int>v[N];void addline(int x,int y){v[x].push_back(y);v[y].push_back(x);}int hson[N],siz[N],dep[N],top[N],tim,fa[N],dfn[N],pos[N];void dfs1(int x,int f){siz[x]=1;dep[x]=dep[f]+1;fa[x]=f;for(int to:v[x]){if(to==f) continue;dfs1(to,x);siz[x]+=siz[to];if(siz[to]>siz[hson[x]]) hson[x]=to;	}return;}void dfs2(int x,int tp){top[x]=tp;dfn[++tim]=x;pos[x]=tim;if(hson[x]) dfs2(hson[x],tp);for(int to:v[x]){if(to==fa[x]||to==hson[x]) continue;dfs2(to,to);}return;}inline void add(int x){if(jd) printf("  add:%d\n",x);change(1,1,n,pos[x],1);return;}inline int Lca(int x,int y){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);x=fa[top[x]];}if(dep[x]<dep[y]) swap(x,y);return y;}inline node find(int x,int anc,int op){if(jd) printf("find: x=%d anc=%d op=%d\n",x,anc,op);node res=(node){-1,-1,0};while(top[x]!=top[anc]){res=merge(ask(1,1,n,pos[top[x]],pos[x]),res);if(jd){printf("  merge: %d %d (%d %d %d)\n",top[x],x,res.lc,res.rc,res.sum);}x=fa[top[x]];}res=merge(ask(1,1,n,pos[anc]+op,pos[x]),res);if(jd){node o=ask(1,1,n,pos[anc]+op,pos[x]);printf("  o: (%d %d %d)\n",o.lc,o.rc,o.sum);printf("  merge: %d %d (%d %d %d)\n",anc,x,res.lc,res.rc,res.sum);}return res;}inline int query(int x,int y){int lca=Lca(x,y);node u=find(x,lca,0),v=find(y,lca,1);if(jd){printf("query: (%d %d) lca=%d u:(%d %d %d) v:(%d %d %d)\n",x,y,lca,u.lc,u.rc,u.sum,v.lc,v.rc,v.sum);}return u.sum+v.sum-(u.lc==v.lc);}
}t2;
int ans[N],u[N],v[N];
struct tree1{vector<int>v[N];void addline(int x,int y){v[x].push_back(y);v[y].push_back(x);}int hson[N],siz[N],dep[N],top[N],tim,fa[N],dfn[N],pos[N];void dfs1(int x,int f){siz[x]=1;dep[x]=dep[f]+1;fa[x]=f;for(int to:v[x]){if(to==f) continue;dfs1(to,x);siz[x]+=siz[to];if(siz[to]>siz[hson[x]]) hson[x]=to;	}return;}void dfs2(int x,int tp){top[x]=tp;dfn[++tim]=x;pos[x]=tim;if(hson[x]) dfs2(hson[x],tp);for(int to:v[x]){if(to==fa[x]||to==hson[x]) continue;dfs2(to,to);}return;}void solve(int x,int kep){for(int to:v[x]){if(to==fa[x]||to==hson[x]) continue;solve(to,0);}if(hson[x]) solve(hson[x],1);t2.add(x);for(int to:v[x]){if(to==fa[x]||to==hson[x]) continue;for(int i=pos[to];i<=pos[to]+siz[to]-1;i++){int now=dfn[i];t2.add(now);}}if(fa[x]) ans[x]=t2.query(x,fa[x]);if(!kep){tag(1);if(jd) printf("clear\n\n");}return;}
}t1;signed main(){freopen("exchange.in","r",stdin);freopen("exchange.out","w",stdout);n=read();for(int i=1;i<n;i++){u[i]=read(),v[i]=read();t1.addline(u[i],v[i]);}for(int i=1;i<n;i++){int x=read(),y=read();t2.addline(x,y);}t2.dfs1(1,0);t2.dfs2(1,1);t1.dfs1(1,0);t1.dfs2(1,1);t1.solve(1,0);for(int i=1;i<n;i++){if(t1.fa[v[i]]==u[i]) swap(u[i],v[i]);printf("%d ",ans[u[i]]-1);}return 0;
}
/*
4
1 2
1 3
1 4
1 2
2 3
3 4
*/

T3

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=4e5+100;
const int M=1e6+100;
const int mod=998244353;int n,m,k;
bool jd=0;int mx,s[N];
inline void add(int p,int w){if(jd) printf("    val=%d\n",p);for(;p<=mx;p+=p&-p) s[p]+=w;
}
inline int ask(int p){int res(0);for(;p;p-=p&-p) res+=s[p];return res;
}int tr[N][2],f[N],siz[N],bot[N],top[N],rev[N],val[N];
void print(){for(int i=1;i<=n;i++) printf("i=%d ls=%d rs=%d fa=%d siz=%d bot=%d top=%d\n",i,tr[i][0],tr[i][1],f[i],siz[i],bot[i],top[i]);puts("");
}
inline bool nroot(int x){return tr[f[x]][0]==x||tr[f[x]][1]==x;
}
inline bool which(int x){return tr[f[x]][1]==x;
}
inline void pushup(int x){if(x){siz[x]=siz[tr[x][0]]+siz[tr[x][1]]+1;bot[x]=tr[x][1]?bot[tr[x][1]]:x;top[x]=tr[x][0]?top[tr[x][0]]:x;}
}
inline void Rev(int x){if(x){swap(tr[x][0],tr[x][1]);swap(bot[x],top[x]);rev[x]^=1;}
}
inline void pushdown(int x){if(rev[x]){rev[x]=0;Rev(tr[x][0]);Rev(tr[x][1]);}
}
inline void rotate(int x){int fa=f[x],gfa=f[fa];int d=which(x),son=tr[x][d^1];f[x]=gfa;if(nroot(fa)) tr[gfa][which(fa)]=x;f[fa]=x;tr[x][d^1]=fa;if(son){f[son]=fa;}tr[fa][d]=son;pushup(fa);pushup(x);
}
int zhan[N];
inline void splay(int x){assert(x);int top(0),y(x);zhan[++top]=x;while(nroot(y)) zhan[++top]=y=f[y];while(top) pushdown(zhan[top--]);for(int fa;fa=f[x],nroot(x);rotate(x)){if(nroot(fa)) which(fa)==which(x)?rotate(fa):rotate(x);}return;
}
int now;
void access(int x,int op=1){//assert(x);if(jd) printf("\naccess: %d\n",x);int ori=x;for(int y(0);x;y=x,x=f[x]){assert(x);splay(x);if(jd) printf("  del: %d siz=%d\n",x,siz[x]);add(val[bot[x]],-siz[x]);int o=tr[x][1];if(o){			//splay(o);//printf("  o=%d bot=%d siz=%d\n",o,bot[o],siz[o]);if(jd) printf("  add: %d siz=%d\n",o,siz[o]);add(val[bot[o]],siz[o]);}//splay(x);tr[x][1]=y;pushup(x);}splay(ori);if(op) val[ori]=++now;//assert(now==bot[now]);if(jd) printf("  add: %d siz=%d\n",ori,siz[ori]);add(val[op?top[ori]:bot[ori]],siz[ori]);if(jd) puts("");
}
void makeroot(int x){access(x);splay(x);Rev(x);
}
vector<int>v[N];
void dfs(int x,int fa){f[x]=fa;for(int to:v[x]){if(to!=fa) dfs(to,x);}return;
}
inline int rnk(int x){splay(x);int o=ask(val[bot[x]]-1);if(jd) printf("o=%d bot=%d siz=%d\n",o,bot[x],siz[tr[x][1]]);o+=siz[tr[x][1]];return o+1;
}
char ss[100];
signed main(){freopen("delete.in","r",stdin);freopen("delete.out","w",stdout);//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);n=read();m=read();mx=n+m;now=n;for(int i=1;i<n;i++){int x=read(),y=read();v[x].push_back(y);v[y].push_back(x);}dfs(n,0);for(int i=1;i<=n;i++){val[i]=i;bot[i]=top[i]=i;siz[i]=1;add(val[i],1);}for(int i=1;i<=n;i++){access(i,0);//print();}for(int i=1;i<=m;i++){int op=read(),x=read();if(op==1){//val[x]=++now;makeroot(x);}else printf("%d\n",rnk(x));if(jd) printf("op=%d x=%d\n",op,x);if(jd) print();}return 0;
}
/*
4
1 2
1 3
1 4
1 2
2 3
3 4
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

文章目录A - Tiny Arithmetic SequenceB - Do you know the second highest mountain?C - Secret NumberD - Game in Momotetsu WorldE - Xor DistancesF - Insertion SortMynavi Programming Contest 2021&#xff08;AtCoder Beginner Contest 201&#xff09;A - Tiny Arit…

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

Rabbits UVALive - 8211

Rabbits UVALive - 8211 题意&#xff1a; n个兔子的位置&#xff0c;兔子每次可以跳到两个兔子之间&#xff0c;问最多可以跳多少下&#xff1f; 题解&#xff1a; 求出所有相邻两数的间隔&#xff0c;然后减去最小间隔就是答案 代码&#xff1a; #include <bits/std…

2.16模拟总结

前言 期望&#xff1a;100700170 实际&#xff1a;400040 rnk14 分全部挂没了&#xff0c;太行了。 T1不开longlong见祖宗&#xff0c;而且KH说的那个也有道理&#xff0c;带权之后树的重心可以不只有两个&#xff0c;所以最后还应该倍增的跳。&#xff08;然而这个地方题解似…

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举判断符合要求的求最小值即可 C - Unexpressed O(n)O(\sqrt{n})O(n​)枚举aaa&#xff0c;暴力翻倍&#xff08;最小的222最多乘323232次就会超过nnn的上…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说&#xff0c;一般通过打日志来进行埋点&#xff0c;然后再通过elk或splunk进行定位及分析问题&#xff0c;更有甚者直接远程服务器&#xff0c;直接操作查看日志&#xff0c;那么&#xff0c;随着业务越来越复杂&#xff0c;企业应用也进入了分布式服务…

YBTOJBZOJ:大根堆(启发式合并)

解析 如果到了链上&#xff0c;本题就是求LIS。 考虑LIS的常见队列做法&#xff0c;其本质就是维护长度为 xxx 的序列的结尾的最小值 qxq_xqx​。 那么在本题尝试如法炮制&#xff0c;对于每个节点&#xff0c;都开一个队列&#xff0c;qxq_xqx​ 表示子树内选了 xxx 个节点后…

Tree UVALive - 8212

Tree UVALive - 8212 题意&#xff1a; 有n个点&#xff0c;k个颜色&#xff0c;每个点都要被染色&#xff0c;相同颜色之间的边算是被该颜色覆盖&#xff0c;问有多少边被所有颜色覆盖 题解&#xff1a; 题目给的是无根树&#xff0c;我们可以将1默认为根然后求所有点的子…

dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

在上一篇文章&#xff08;.NET Core开源行动&#xff1a;一键创建Excel Add-in&#xff09; 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库&#xff0c;你可以通过 dotnet new excel & dotnet run 命令即可完成一个新的Add-in的创建和运行。关于如何加载这…

NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

文章目录A - 2nd Greatest DistanceB - RGB MatchingC - Odd Even SortD - 1 or 2E - Directed TreeF - Logical Operations on TreeNOMURA Programming Contest 2021(AtCoder Regular Contest 121)A - 2nd Greatest Distance 大模拟讨论yyds 将点按x,yx,yx,y分别排序 xxx贡献…

F - Heron and His Triangle UVALive - 8206

F - Heron and His Triangle UVALive - 8206 题意&#xff1a; 给你应该n&#xff0c;然后求一个最小的t&#xff0c;问长度为t-1&#xff0c;t&#xff0c;t1所组成的三角形的面积为整数,t>n 题解&#xff1a; 这题我一开始被题目的-1给迷惑了&#xff0c;以为筛出所有…

YBTOJ:最短时间(长链剖分、线段树)

解析 不难得到最优策略&#xff1a;先尽可能的快的送死直到路径畅通无组&#xff0c;然后一口气冲到t点。 现在的难点就在于如何尽可能的快的送掉特定的次数。 不难发现&#xff0c;花费时间关于死亡次数的函数必然是一个下凸包。 设 fx,if_{x,i}fx,i​ 表示子树内距离 xxx 不…

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件&#xff0c;对于企业内部自研系统提供接口支持&#xff0c;以此来打通多平台下的数据&#xff0c;本次先使用最简单的钉钉群机器人完成多种形式的消息推送&#xff0c;参考钉钉开发文档中自定义机器人环节&#xff0c;此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束&#xff0c;小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中&#xff0c;分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力&#xff0c;自己认为还算满意吧。对于个人来说&#xff0c;自己一直…

【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)

文章目录descriptionsolutioncode【模板】k短路 / [SDOI2010]魔法猪学院description iPig 在假期来到了传说中的魔法猪学院&#xff0c;开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后&#xff0c;iPig 对猪世界的世界本原有了很多的了解&#xff1…

Infinite Fraction Path UVALive - 8207

Infinite Fraction Path UVALive - 8207 题意&#xff1a; 给你n个数&#xff0c;每个数在0到9之间&#xff0c;每个数的下标一次是0~n-1&#xff0c;然后他所能走到的数为(i^21)%n,i为他本身的下标&#xff0c;然后让你求走n步&#xff0c;每一步的数相连&#xff0c;形成的…

YBTOJ洛谷P4869:出现位置(线性基)

解析 关键结论&#xff1a; 若 nnn 个数组成的线性基大小为 SSS&#xff0c;则其子集异或组成的结果有 2S2^S2S 种&#xff0c;且每种结果都有 2n−S2^{n-S}2n−S 种方案。 证明&#xff1a;考虑 n−Sn-Sn−S 个没有加入线性基的元素的任意一个子集&#xff0c;其异或和为 xxx…

.NET Core开源行动:一键创建Excel Add-in

作为.NET Core开源行动的一部分&#xff0c;我此前已经创建和发布了一套基于.NET Core的Office 365开发模板库&#xff0c;是针对Microsoft Graph开发的场景的&#xff0c;有兴趣可以参考 https://github.com/chenxizhang/dotnetcore-office365dev-templates-msgraph &#xff…

【学习笔记】最小生成树系列的必做经典题

最小生成树系列【模板】最小生成树prim算法kruskal算法Borůvka (Sollin)算法次小生成树最小生成树计数最优比率生成树最小乘积生成树最小度限制生成树最小方差树【模板】最小生成树 prim算法 最小生成树的prim\text{prim}prim类似于最短路的dijkstra\text{dijkstra}dijkstra…

2017 ICPC沈阳区域赛

2017 沈阳区域赛 题号题目难度知识点ABBP FormulaBBridgeCEmpty Convex PolygonsDDefense of the AncientsEFive-round Show HandFHeron and His Triangle铜牌题推式子思维GInfinite Fraction Path快银稳铜dfs剪枝HLegends of the Three KingdomsILittle Boxes签到题大数JNew …