[NowCoder]牛客OI周赛1 题解
A.分组
首先,认识的人不超过3个,因此不存在无解的方案
考虑直接构造,先把所有点设为1,顺序扫一遍把有问题的点加入队列
每次取队头,将其颜色取反,再更新有问题的点
复杂度:考虑到每个点不会操作2次,所以是\(O(N+M)\)
到目前为止、AC的代码几乎都是因为数据水才AC的错误代码
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i=(a);i<=(b);++i)
#define DEC(i,a,b) for(int i=(a);i>=(b);--i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
template<typename T,typename U> inline bool smax(T&x,const U&y){return y>x?(x=y,1):0;}
template<typename T,typename U> inline bool smin(T&x,const U&y){return y<x?(x=y,1):0;}
typedef long long ll;
#define pb push_back
inline int read(){
int w=0,p=0;char c;
while(!isdigit(c=getchar()))if(c=='-')p=1;
while(isdigit(c))w=(w<<1)+(w<<3)+(c^'0'),c=getchar();
return p?-w:w;
}
const int n=read(),N=1e5+5;
vector<int>g[N];
int q[N<<2],l=1,r,c[N],s[N];
bool ins[N];
void solve(){
REP(i,1,n)c[i]=1;
REP(x,1,n){
for(int y:g[x])if(c[x]==c[y])++s[x];
if(s[x]>=2)q[++r]=x,ins[x]=1;
}
while(l<=r){
int&x=q[l++];if(!ins[x])continue;ins[x]=0;
c[x]^=3;s[x]=0;
for(int y:g[x])if(c[x]==c[y]){
++s[x],++s[y];
if(s[y]>=2&&!ins[y])q[++r]=y,ins[y]=1;
}else if(--s[y]<2)ins[y]=0;
}
}
int main(){
int m=read();
while(m--){int x=read(),y=read();g[x].pb(y),g[y].pb(x);}
solve();
REP(i,1,n)printf("%d ",c[i]);
return 0;
}
B.树
计数类问题,考虑计算以每个节点为下端点的合法方案数
设\(s[x]\)为子树大小,\(d[x]\)为x的深度,\(son_x\)为x的儿子集合
计算节点x时,显然两条路径的下端点都在x的不同子树内,方案数为
\]
考虑上端点位置有几种不同情况
第一、分别在S1,S2(除了子树y的两个不同子树)
第二、分别在S1S2,S3S4
第三、在S到T路径上的点(两个端点相同,这个单独算上去即可)
(考试时候漏算了第一种,挂成30分。。)
因此,$$f[x]=\sum_{u\in S..T}(s[u]-s[son[u]])\times(n-s[u])+C_{s[u]-s[son[u]]}^2-\sum_{v\in son_u, v\ne son[u]}C_{s[v]}^2$$
\]
前缀和优化即可
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
typedef long long ll;
inline int read(){char c;int w;
while(!isdigit(c=getchar()));w=c&15;
while(isdigit(c=getchar()))w=w*10+(c&15);return w;
}
inline char smax(int&x,const int&y){return x<y?x=y,1:0;}
inline char smin(int&x,const int&y){return x>y?x=y,1:0;}
const int n=read(),l=read(),r=read(),N=2e5+5,p=1e9+7;
vector<int>g[N];
int a[N],dep[N];ll b[N],s[N],t[N],ans;
void go(int x,int f){
dep[x]=dep[f]+1;s[x]=1;
for(int y:g[x])if(y!=f)go(y,x),s[x]+=s[y],t[x]=(t[x]+s[y]*(s[y]-1)/2)%p;
t[x]=(s[x]*(s[x]-1)/2-t[x]+p)%p;
}
inline void inc(ll&x,const ll&y){x+=y;if(x>=p)x-=p;;}
void dfs(int x,int f){
const int&d=dep[x];a[d]=x;
if(f)b[d-1]=(b[d-2]+t[f]+((s[f]-s[x])*((n-s[f]<<1)-s[x]-1+s[f])-s[f]*(s[f]-1)+s[x]*(s[x]-1)>>1))%p;
if(d>l){
const int top=max(1,d-r),down=d-l;
inc(ans,(b[down]-b[top-1]+p)*(t[x]<<1|1)%p);
inc(ans,(down-top+1)*t[x]%p);
}
for(int y:g[x])if(y!=f)dfs(y,x);
}
#define pb push_back
int main(){
REP(i,2,n){int x=read(),y=read();g[x].pb(y),g[y].pb(x);}
go(1,0);dfs(1,0);
cout<<(ans%p+p)%p;
return 0;
}
C.序列
注意到,如果交换一个序列的不同2个数,得到的F矩阵就是不同的
因此只需要求有序序列方案,再乘以斯特林数即可
这样转化为:x个不同的数,递增排列,相邻数相差不超过K,最大值最小值相差不超过M的方案数
设f[i][j]表示i个数,最大最小相差j的方案数,枚举最后两个数差值转移,然后前缀和优化一下即可
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a),i##_(b);i<=i##_;++i)
using namespace std;
const int N=2005,p=998244353;
int n,m,k,a[N][N],f[N][N],jc[N],s[N][N],ans;
int main(){
cin>>n>>m>>k;a[0][0]=jc[0]=1;
REP(i,1,n)jc[i]=1ll*jc[i-1]*i%p;
REP(i,1,n)REP(j,1,i)a[i][j]=(a[i-1][j-1]+1ll*a[i-1][j]*j)%p;
REP(i,0,m)s[1][i]=1;f[1][0]=1;
REP(i,2,n)REP(j,1,m)
f[i][j]=(f[i][j]+s[i-1][j-1]-(j-k>0?s[i-1][j-k-1]:0))%p,s[i][j]=(s[i][j-1]+f[i][j])%p;
REP(i,1,n)ans=(ans+1ll*s[i][m]*a[n][i]%p*jc[i])%p;
cout<<(ans+p)%p;
return 0;
}
[NowCoder]牛客OI周赛1 题解的更多相关文章
- [NowCoder]牛客OI周赛3
A.地斗主 题意:\(4\times N\) 的地板,在上面铺 \(1\times 2\) 和 \(2\times 1\) 的地砖,求铺满方案数, \(N\le 10^9\) 原题..先把一列的状态压 ...
- 牛客OI周赛8-提高组A-用水填坑
牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...
- 牛客OI周赛9-提高组题目记录
牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...
- 牛客OI周赛2-提高组
A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
- 牛客OI周赛10-普及组-A眼花缭乱的街市-(加速+二分)
https://ac.nowcoder.com/acm/contest/901/A 很简单的一道题,全场只有20+AC,卡时间.新学了cin加速语法和数组二分查找的函数调用. 知道有个读写挂,可以加速 ...
- 牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)
链接:https://ac.nowcoder.com/acm/contest/942/B 来源:牛客网 Game with numbers 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...
- 牛客OI周赛7-普及组 解题报告
出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...
随机推荐
- POJ 2081 Recaman's Sequence
Recaman's Sequence Time Limit: 3000ms Memory Limit: 60000KB This problem will be judged on PKU. Orig ...
- POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks
http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15680 ...
- ArcGIS api for javascript——加载图标
描述 这个示例展示了如何能用一个动画图片显示地图正在加载.在这个示例中,图片是一个小的动画GIF.当地图第一次加载或用户缩放和平移地图时显示图片.当所有图层加载完成图片消失. 这个示例是通过event ...
- Qt中事件分发源码剖析
Qt中事件分发源码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,而且进行分发,这些都是在exec中进行的. 以下举例说明: 1)首先看看以下一段演示样例代码: ...
- Linux下网络服务的安全设置
Linux下网络服务的安全设置 Linux操作系统由于其良好的稳定性.健壮性.高效性和安全性.正在成为各种网络服务的理想平台.各种网络应用在Linux系统上部有性能卓越的应用,例如,提供We ...
- HTTP 各种特性应用(三)
一. 数据协商 分类: 客户端请求: Accept: Accept:表明 我想要什么样的数据 Accept-Encoding:数据是什么样的编码方式 进行传输.主要限制 服务端怎样进行数据的压缩. A ...
- 参考分享《Python深度学习》高清中文版pdf+高清英文版pdf+源代码
学习深度学习时,我想<Python深度学习>应该是大多数机器学习爱好者必读的书.书最大的优点是框架性,能提供一个"整体视角",在脑中建立一个完整的地图,知道哪些常用哪些 ...
- 几种类型的db,以及最新的db排名,看一下
5月数据库排名: http://geek.csdn.net/news/detail/196118 另外这篇文章里面提到了一些内嵌式数据库: http://blog.csdn.net/leagoal/a ...
- js实现table排序(jQuery下的jquery.sortElements)
项目中要实现table排序的功能. 网上有非常多解决方式,非常多都基于jQuery. jquery.tablesorter.大小17KB.只是他的首页在ie10下兼容性有点问题. DataTables ...
- C#中函数的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...