2.7模拟总结

文章目录

  • 前言
  • 考场
  • 题目解析
    • T1
    • T2
    • T3
  • 代码
    • T1 forest
    • T2 euler
    • T3 graph

前言

130pts
20+100+10
终于没有挂分!
开心!
然而今天的题确实过于阴间…三道题几乎都没法写暴力,爆零场了属于是。
我这个分数都能到rnk4勒。
(rnk39->rnk4,乐)

考场

一拿题我就觉得不太妙。
T1数树题,第一眼看到输入一个数输出一个数就想到应该是生成函数+多项式,但是不给NTT模数?
难道这玩意能dp?
…本场满分200分。
T2看起来还挺正常的,把二分写脸上了。
T3题如其名,动态沙漠玩期望,《毒瘤》,我突然发现自己仙人掌是一道题都没做过,感觉可能要LCT罢,但是那个期望我也没什么想法…本场满分100分。

20min,我差不多明白了本场考试的阴间,决定死磕T1了,感觉拿下的话应该也不会太差。
(但是由于前两天的《优异表现》,加上T2无法对拍,我也做好了爆零的心理准备)
稍微分析了一下发现这个T2是相当可做,二分完答案后从度数的角度入手变成了一个网络流模型,然后这个网络流还是二分图,点边级别都是 O(m)O(m)O(m),这样单次check函数 O(mm)O(m\sqrt m)O(mm),挂个二分的log似乎就过了?

然后就开始写。
不太难写,不久就写完了。没有对拍心乱如麻…
然后就写了个环的datamaker,然后在代码里疯狂assert
自己拍自己了属于是
拍了一下发现自环的定向似乎有锅,加了个特判。
(“自环的定向”这东西本身就离谱,其实只是我的assert锅了,答案不会出错。)
然后再拍似乎就没啥问题了。

然后还有俩点,就去瞅瞅T1/3吧。

一看T3数据:k=0?大喜过望:我会并查集!
就这样十分到手。

再看T1。
越看越蒙,我甚至连它是个什么算法都没有头绪,难道真是dp?
但是这种单输入题不就是给打表准备的嘛,开始试图骗20分。
如何枚举有标号森林形态?
写个dfs,枚举当前的结点和之前哪个结点连边,然后与每片森林最多连一条边,整个带撤销并查集就可以了。比想象中好写不少。
要是无标号我恐怕就真不会了,似乎得从重心入手,可能得树哈希?
n<=10跑的飞快,8s就把我的表打出来了。
填到数组里一交20分到手=v=。
为了让我的代码显得厚重一点还把暴搜贴进去不调用一起交上去了。

然后还有一个多小时。
又又又又检查了一下T2,然后实在没有事干,就去看上午回放了。
没啥大变化,几乎和去年的视频还是一样的,就是声音变成男生了,还不如女声好听,但讲课节奏能更舒服一些。
也有收获吧,把构造最小点覆盖的方法揉到网络流整理里面了,之前第一次看我没有理解那个。
再看关押犯人那个模型还是觉得不如开虚点…

题目解析

T1

科技题。
Prufer 序列我确实不会啊…
补了两个月科技,竟然又被卡科技了?
qwq
Prufer序列就是听着高大上,其实还是挺简单的。
简洁而强大,这就是优雅。

答案可以通过1号点的贡献乘n得到。
一个重要的处理技巧是枚举1号点所在的联通块大小
套点组合数后面的式子就比较显然了。

T2

做的还是不错的。
感觉题解的建图还没有我的建图简洁

T3

真心毒瘤题。
首先是一个trick:用LCT维护圆方树。
前几天还做过一道需要这个方法的题。
然后处理那个期望的关键是:连通块数=点数-边数+环数
然后由于期望的线性性可以分别求解(可以说把线性性用的出神入化了)。
求黑环的期望的时候需要一个容斥。然而我发现自己讲不清楚这个容斥怎么来的,就去补了一下容斥的基础。
其实它啥也不是,就是朴素容斥而已。
感觉这两天把期望和容斥这两块基础补了还是不错的。

代码

T1 forest

#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=5e3+100;
const int M=2e5+100;
const int inf=1e9;int mod;
inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;k>>=1;x=x*x%mod;}return res;
}int n,m;ll jc[N],ni[N];
inline ll C(int n,int m){return jc[n]*ni[m]%mod*ni[n-m]%mod;
}
ll f[N],g[N],s[N],ans[N];
void init(){n=5000;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,assert(ni[i]*jc[i]%mod==1);f[1]=1;for(int i=2;i<=n;i++) f[i]=ksm(i,i-2);g[0]=1;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++) g[i]=(g[i]+f[j]*C(i-1,j-1)%mod*g[i-j])%mod;}s[1]=0;for(int i=2;i<=n;i++){ll b=ksm(i-1,i-1);for(int j=1;j<i;j++){b=b*ni[i-1]%mod*jc[i-2]%mod;s[i]=(s[i]+1ll*j*j%mod*C(i-2,j-1)%mod*b)%mod;}}for(int i=1;i<=n;i++){for(int j=1;j<=i;j++) ans[i]=(ans[i]+s[j]*C(i-1,j-1)%mod*g[i-j])%mod;ans[i]=ans[i]*i%mod;}//printf("f: ");for(int i=1;i<=n;i++) printf("%lld ",f[i]);puts("");//printf("g: ");for(int i=1;i<=n;i++) printf("%lld ",g[i]);puts("");//printf("s: ");for(int i=1;i<=n;i++) printf("%lld ",s[i]);puts("");//printf("ans: ");for(int i=1;i<=n;i++) printf("%lld ",ans[i]);puts("");return;
}signed main(){freopen("forest.in","r",stdin);freopen("forest.out","w",stdout);//debug("%d\n",(int)sizeof(mi)/1024/1024);int T=read();mod=read();init();while(T--){printf("%lld\n",ans[read()]);}return 0;
}
/*
4 3
1 2 1 1
2 3 1 1
3 1 1 1 
*/

T2 euler

#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=4e4+100;
const int M=2e5+100;
const int inf=1e9;
const double eps=1e-10;int n,m;int s,t,tot;
struct node{int to,nxt,cap;
}p[M<<1];
int fi[N],cur[N],cnt;
inline void addline(int x,int y,int c){p[++cnt]=(node){y,fi[x],c};fi[x]=cnt;
}
inline void add(int x,int y,int c){//printf("add: %d-> %d cap=%d\n",x,y,c);addline(x,y,c);addline(y,x,0);
}
int bel[N];
queue<int>q;
int bfs(){fill(bel,bel+1+tot,0);bel[s]=1;q.push(s);while(!q.empty()){int now=q.front();q.pop();//printf("now=%d\n",now);for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(bel[to]||!p[i].cap) continue;bel[to]=bel[now]+1;q.push(to);}}return bel[t];
}
int dfs(int x,int lim){if(!lim||x==t) return lim;int res(0);for(int &i=cur[x];~i;i=p[i].nxt){int to=p[i].to;if(bel[to]!=bel[x]+1) continue;int add=dfs(to,min(lim,p[i].cap));res+=add;lim-=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;}if(!res) bel[x]=-1;return res;
}
int dinic(){int flow(0),tmp(0);while(bfs()){//ok;while((tmp=dfs(s,inf))) flow+=tmp;}//printf("flow=%d\n",flow);return flow;
}int fa[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}int du[N];
int u[N],v[N],v1[N],v2[N];
int que[N<<1],num;
bool check(int k){k=que[k];//printf("check: k=%d\n",k);memset(fi,-1,sizeof(fi));cnt=-1;tot=m+n;s=++tot;t=++tot;for(int i=1;i<=m;i++){add(s,i,1);if(v1[i]<=k) add(i,v[i]+m,1);if(v2[i]<=k) add(i,u[i]+m,1);}for(int i=1;i<=n;i++){if(du[i]&1) return false;add(i+m,t,du[i]/2);}return dinic()==m;
}int x[N],y[N];
int ans[N],top;
void oula(int x,int frm){for(int i=fi[x];~i;i=fi[x]){int to=p[i].to;fi[x]=p[i].nxt;oula(to,p[i].cap);}if(frm) ans[++top]=frm;return;
}signed main(){freopen("euler.in","r",stdin);freopen("euler.out","w",stdout);n=read();m=read();for(int i=1;i<=n;i++) fa[i]=i;//int block=n;for(int i=1;i<=m;i++){u[i]=read();v[i]=read();v1[i]=read();v2[i]=read();du[u[i]]++;du[v[i]]++;que[++num]=v1[i];que[++num]=v2[i];if(find(u[i])!=find(v[i])){fa[find(u[i])]=find(v[i]);//block--;}}int id(0);for(int i=1;i<=n;i++){if(!du[i]) continue;if(!id) id=find(i);else if(id!=find(i)){//assert(0);//debug("NIE\n");puts("NIE");return 0;}}sort(que+1,que+1+num);num=unique(que+1,que+1+num)-que-1;que[num+1]=que[num]+1;//check(num+1);return 0;int st=1,ed=num+1;while(st<ed){int mid=(st+ed)>>1;if(check(mid)) ed=mid;else st=mid+1;}if(st==num+1){//assert(0);//debug("NIE\n");puts("NIE");return 0;}check(st);//int mx(0);for(int i=1;i<=m;i++){for(int j=fi[i];~j;j=p[j].nxt){int to=p[j].to;if(to==s||p[j].cap) continue;to-=m;//if(u[i]==v[i]) mx=max(mx,min(v1[i],v2[i]));//else if(to==u[i]) mx=max(mx,v2[i]);//else mx=max(mx,v1[i]);if(to==u[i]){				x[i]=v[i],y[i]=u[i];}else{				//assert(to==v[i]);x[i]=u[i],y[i]=v[i];}}//assert(x[i]);}//debug("mx=%d ans=%d\n",mx,que[st]);//assert(mx==que[st]);memset(fi,-1,sizeof(fi));cnt=-1;for(int i=1;i<=m;i++) addline(x[i],y[i],i);for(int i=1;i<=n;i++){if(du[i]){oula(i,0);break;}}if(top!=m){//assert(0);puts("NIE");return 0;}printf("%d\n",que[st]);while(top) printf("%d ",ans[top--]);return 0;
}
/*
4 3
1 2 1 1
2 3 1 1
3 1 1 1 
*/

T3 graph

#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=6e5+100;
const int M=2e5+100;
const int inf=1e9;
const int mod=998244353;inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;k>>=1;x=x*x%mod;}return res;
}int n,m;
int id,E,o,k;int tr[N][2],sum[N],val[N],f[N],rev[N];
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) sum[x]=sum[tr[x][0]]+sum[tr[x][1]]+val[x];return;
}
inline void Rev(int x){if(x){rev[x]^=1;swap(tr[x][0],tr[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){int y(x),top(0);zhan[++top]=y;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;
}
inline void access(int x){for(int y=0;x;y=x,x=f[x]){splay(x);tr[x][1]=y;pushup(x);}
}
inline void makeroot(int x){access(x);splay(x);Rev(x);
}
inline int findroot(int x){access(x);splay(x);while(pushdown(x),tr[x][0]) x=tr[x][0];return x;
}
inline void split(int x,int y){makeroot(x);access(y);splay(y);
}
inline void link(int x,int y){makeroot(x);makeroot(y);f[x]=y;
}
inline void cut(int x,int y){split(x,y);f[x]=tr[y][0]=0;pushup(y);
}
int a[N],num;
void dfs(int x){if(!x) return;pushdown(x);dfs(tr[x][0]);a[++num]=x;dfs(tr[x][1]);return;
}
inline void add(int x,int y){num=0;if(findroot(x)!=findroot(y)) link(x,y),++E;else{split(x,y);if(sum[y]) return;++E;int now=++id;val[id]=sum[id]=1;dfs(y);for(int i=1;i<num;i++) cut(a[i],a[i+1]);for(int i=1;i<=num;i++) link(now,a[i]);return;}
}
ll w[N],b[N];
ll jc[N],ni[N];
inline ll C(int n,int m){return jc[n]*ni[m]%mod*ni[n-m]%mod;
}
void init(){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;//assert(ni[i]*jc[i]%mod==1);ll bas=ksm(ksm(n,k),mod-2);for(int x=0;x<=n;x++){w[x]=ksm(n-x,k)*bas%mod;//printf("x=%d w=%lld\n",x,w[x]);}return;
}
inline ll B(int x){if(b[x]!=-1) return b[x];ll res(0);for(int i=0;i<=x;i++){res=(res+((i&1)?-1:1)*C(x,i)*w[i]%mod+mod)%mod;}//printf("x=%d b=%lld\n",x,res);return b[x]=res;
}int lst(0);
ll now;
signed main(){freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);id=n=read();m=read();k=read();o=read();init();memset(b,-1,sizeof(b));now=n*(w[1]+o*B(1))%mod;//printf("---%lld %lld+%d*%lld\n",w[1]+o*B(1),w[1],o,B(1));while(m--){int x=read()^lst,y=read()^lst;//printf("(%d %d)\n",x,y);if(x==y){printf("%d\n",lst);continue;}add(x,y);if(num) now=(now+w[num]+o*B(num))%mod;lst=(now-E*(w[2]+o*B(2))%mod+mod)%mod;//printf("  E=%d num=%d now=%lld\n",E,num,now);printf("%d\n",lst);}return 0;
}
/*
4 3
1 2 1 1
2 3 1 1
3 1 1 1 
*/

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

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

相关文章

基于xlua和mvvm的unity框架

1、框架简介这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI&#xff0c;于是下载下来学习了一下。XUUI基于xlua&#xff0c;又借鉴了mvvm的设计概念。xlua是目前很火的unity热更方案&#xff0c;不仅支持纯lua脚本热更&#xff0c;也可以做 C# 代码的bug hot…

A - Tit for Tat CodeForces - 1516A

A - Tit for Tat CodeForces - 1516A 题意&#xff1a; 一个长度为 n 的数组&#xff0c;现在希望你对这个数组进行至多k次操作&#xff1a;在数组中选择 2 个不同的元素&#xff0c;将第一个元素加 1 &#xff0c;然后从第二个元素减 1 。不过他有一个要求&#xff0c;进行操…

Codeforces Round #703 (Div. 2) 题解

文章目录A. Shifting StacksB. Eastern ExhibitionC. Guessing the GreatestD. Max MedianE. Paired PaymentF. Pairs of Paths#703 (Div. 2)A. Shifting Stacks 从左往右构造递增0,1,2...&#xff0c;如果这样都不能递增就肯定无解 雷区&#xff1a;不能用等差数列算个数&am…

AGAGA XOOORRR CodeForces - 1516B

AGAGA XOOORRR CodeForces - 1516B 题意&#xff1a; 给定一个长度为n的序列&#xff0c;对其进行若干次操作&#xff0c;每次操作将某相邻两数变为他们的异或和&#xff08;操作后序列长度减一&#xff09;。问是否可以经过若干次操作&#xff0c;得到一个长度至少为2且所有…

2.8模拟总结

前言 80pts 303020 rnk10 三个暴力分… T2拿虚树玩了半天结果假了qwq 乍一看似乎都挺可做的。 但是一道都做不出来 &#xff08;觉得写考场过程有点流水账&#xff0c;不写了&#xff0c;一些想说的写在对应题目里吧&#xff09; 题目解析 T1 三角查找&#xff08;triangle&…

如何在ASP.NET Core中使用JSON Patch

原文&#xff1a; JSON Patch With ASP.NET Core作者&#xff1a;.NET Core Tutorials译文&#xff1a;如何在ASP.NET Core中使用JSON Patch地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10433615.html译者&#xff1a;Lamond LuJSON Patch是一种使用API显式更新文档的方…

Codeforces Round #709 (Div. 2, based on Technocup 2021 Final Round) 题解

文章目录A. Prison BreakB. Restore ModuloC. Basic DiplomacyD. PlaylistE. Skyline PhotoF. Useful Edges#709 (Div. 2)A. Prison Break 就是每个监狱破一扇门&#xff0c;输出aba\times bab即可 B. Restore Modulo 就是取模意义下的操作&#xff0c;分大小操作&#xff0…

351E. Jeff and Permutation

351E. Jeff and Permutation 题意&#xff1a; 一个长度为n的序列&#xff0c;你可以选择一些位置&#xff0c;使其变成相反数&#xff0c;问逆序对最少是多少&#xff1f; 题解&#xff1a; 对于第i位&#xff0c;我们开始考虑他能决定的逆序对&#xff1f;对于其他任意位…

.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接

众所周知在.NET下的RSA类所生成的密钥为Xml格式&#xff0c;而其他语言比如java一般使用pkcs8格式的密钥&#xff0c;JavaScript一般使用pkcs1格式。我们在开发过程中很可能遇到需要与其他语言开发的api进行对接&#xff0c;如果遇到RSA加密解密&#xff0c;我们肯定需要保证ke…

2.9模拟总结

文章目录前言题目解析序列计数&#xff08;sequence&#xff09;T2 网格选点&#xff08;grid&#xff09;T3 孤立点集&#xff08;isolated&#xff09;代码T1T2T3总结前言 180pts 3050100 rnk10 题目比较简单的一场考试。 不太满意。 T3是做过的原题&#xff0c;切了不算啥…

AtCoder Beginner Contest 203(Sponsored by Panasonic)题解

文章目录A - ChinchirorinB - AtCoder CondominiumC - Friends and Travel costsD - PondE - White PawnF - WeedABC203A - Chinchirorin 三个条件if判 #include <cstdio> int main() {int a, b, c;scanf( "%d %d %d", &a, &b, &c );if( a b ) …

AcWing 1068. 环形石子合并

AcWing 1068. 环形石子合并 题意&#xff1a; n堆石头围成一个圈&#xff0c;然后将相邻两堆合并成新的一堆&#xff0c;得分为新的一堆的石头数 问最高得分合最低得分 题解&#xff1a; 很简单&#xff0c;区间dp的模板题 和这个题一样 状态转移方程&#xff1a; dpmax[i]…

2.10模拟总结

文章目录前言题目解析随机减法&#xff08;calculate&#xff09;大图书馆&#xff08;bibliotheca&#xff09;子串选取 &#xff08;substr&#xff09;代码T1T2T3总结前言 200pts 4010060 rnk3 拿到牌勒嘿嘿嘿&#xff08;脑补流口水黄豆&#xff09; T3两个log想在ybt的机…

ABP VNext 微服务演示,项目状态和路线图

在ABP vNext上的第一个公告之后,我们对代码库进行了很多改进(GitHub存储库上的1100多次提交).我们已经创建了功能,示例,文档等等.在这篇文章中,我想告诉你一些新闻和项目的状态.ABP微服务演示解决方案ABP框架的主要目标之一是提供创建微服务解决方案的便利基础设施.我们一直在努…

加分二叉树

加分二叉树 题意&#xff1a; 给你一个数的中序表达式&#xff0c;然后一颗子树的分数左子树的分数*右子树的分数根的分数 给你所有点的分数&#xff0c;让你构造出分值最大的树&#xff0c;输出前序遍历 题解&#xff1a; 区间dp问题 设dp[i][j]表示中序遍历是w[i~j]的所有…

AtCoder ZONe Energy Programming Contest 题解

文章目录A - UFO InvasionB - Sign of FriendshipC - MAD TEAMD - Message from AliensE - SneakingF - Encounter and FarewellZONe Energy Programming ContestA - UFO Invasion 太简单了。 #include <cstdio> char ch[10] { Z, O, N, e }; char s[20];int main() {…

2.11模拟总结

前言 145&#xff08;175&#xff1f;&#xff09;pts 100450&#xff08;30&#xff1f;&#xff09; rnk11&#xff08;8&#xff1f;&#xff09; 之所以有括号是因为T3莫名其妙的TLE了&#xff1f; 考后我一模一样的码再交一遍30分就到手了… 应该不是我的问题吧&#xff…

[aspnetcore.apidoc]一款很不错的api文档生成工具

简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger最初我们也有在试用swagger&#xff0c;但总是有些感觉&#xff0c;感觉有点不满意&#xff0c;就但从api文档角度来说&#xff0c;从前后端文档沟通角度来讲apidoc的表现形式&#xff0c;要比swagger简单的多&…

【学习笔记】浅谈短小可爱的左偏树(可并堆)

文章目录左偏树左偏树的合并(merge)操作例题罗马游戏[Apio2012]dispatching[JLOI2015]城池攻占[Baltic2004]sequence左偏树 左偏树是一个堆&#xff0c;而且是一个可并堆&#xff0c;所以一定有权值的限制 以小根堆为例&#xff0c;那么必须满足节点权值小于左右儿子权值&…

2.12 模拟

文章目录前言题目解析染色计划&#xff08;color&#xff09;奇度边集&#xff08;edges&#xff09;猜拳游戏&#xff08;guess&#xff09;代码T1T2LCT整体二分总结前言 120pts 期望&#xff1a;4010020160 实际&#xff1a;406020120 rnk 9 我yue了。 怎么又是不可抗力性挂…