T1 星际旅行


题目描述




一个图存在欧拉路的条件是有\(2/0\)个点有奇数个出度,把一条无向边拆成两条,所以可以选择拆两个自环、一个自环一条边、连接同一个点的边。

先判断图是否是边联通,不联通则输出0

于是答案就是

\(\textrm{C}_{zi}^{2}\)+\(zi\)*\(bian\)+\(\sum_{i=1}^{n}\textrm{C}_{in_{i}}^{2}\)

其中\(zi\)就是自环总数,\(bian\)就是边总数,\(in_{i}\)表示\(i\)点出度。

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
namespace EMT{
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
#define pf printf
typedef long long ll;
#define int long long
inline ll read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void pi(int x){pf("%lld ",x);}inline void pn(){pf("\n");}
const int N=1e5+100;int co,head[N];
struct node{int next,to;}e[N<<1];inline void add(int next,int to){e[++co].next=head[next],e[co].to=to,head[next]=co;}
int zi,n,m,in[N],fn;bool v[N];
int h[N];
inline void dfs(int k){
v[k]=1;
queue<int>q;
q.push(k);
while(!q.empty()){
int x=q.front();q.pop();
for(register int i=head[x];i;i=e[i].next){
if(!v[e[i].to])v[e[i].to]=1,q.push(e[i].to);
}
}
}
inline short main(){
n=read();m=read();
F(i,1,m){
int a=read(),b=read();
if(a==b)zi++,h[a]++;
else add(a,b),add(b,a),in[a]++,in[b]++;
}
F(i,1,n)if(in[i]||h[i]){dfs(i);break;}
F(i,1,n)if(!v[i]&&(in[i]||h[i])){pi(0);return 0;}
fn+=zi*(zi-1)/2;
fn+=zi*co/2;
F(i,1,n)fn+=in[i]*(in[i]-1)/2;
pi(fn);return 0;
}
}
signed main(){return EMT::main();}

T2 砍树

题目描述


这个题不能二分,因为此题没有单调性。题意就是求一个最大的\(d\),满足

\(\sum_{i=1}^{n}\)(┌\(\frac{a_{i}}{d}\)┐\(*d-a_{i}\))\(<=k\)

将\(\sum_{i=1}^{n}a_{i}\)移项并将\(d\)除过去可得

\(\sum_{i=1}^{n}\)┌\(\frac{a_{i}}{d}\)┐\(<=\frac{k+\sum_{i=1}^{n}a_{i}}{d}\)

其中左边一项向下取整依然等价,所以就变成了

\(\sum_{i=1}^{n}\)┌ \(\frac{a_{i}}{d}\) ┐ \(<=\)└\(\frac{k+\sum_{i=1}^{n}a_{i}}{d}\) ┘

┌ ┐代表向上取整,└ ┘代表向下取整

于是我们可以找出每一个└\(\frac{k+\sum_{i=1}^{n}a_{i}}{d}\) ┘值的最大临界值\(d\),因为\(d\)最大时\(\sum_{i=1}^{n}\)┌ \(\frac{a_{i}}{d}\) ┐ 才最小,也最符合题意。

预处理后暴力判断即可。

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
namespace EMT{
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
#define f(x) for(register int i=head[x],j;i;i=e[i].next)
#define pf printf
typedef long long ll;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void pi(ll x){pf("%lld ",x);}inline void pn(){pf("\n");}
const int N=110;int k,n,cnt,a[N];ll rec[1000040],T;
inline bool check(ll x){ll co=0;F(i,1,n){co+=ceil((double)a[i]/x);if(co>T/x)return 0;}return 1;}
inline short main(){
n=read();k=read();T=k;
F(i,1,n)a[i]=read(),T+=a[i];
F(i,1,sqrt(T)){
rec[++cnt]=T/(T/i);
rec[++cnt]=T/i;
}
sort(rec+1,rec+cnt+1);int len=unique(rec+1,rec+cnt+1)-rec-1;
D(i,len,1){if(check(rec[i])){pi(rec[i]);return 0;}}
return 0;
}
}
signed main(){return EMT::main();}

T3 超级树

题意描述


考虑\(dp[i][j]\)表示一棵\(i\)超级树,有\(j\)条点不重复的路径的方案数。考虑\(dp[i]\)对\(dp[i+1]\)的

贡献:枚举左子树和右子树的路径条数l、r,记\(num=dp[i][l]*dp[i][r]\),则有

• 什么也不做 \(dp[i+1][l+r]+=num\)

• 根自己作为一条新路径 \(dp[i+1][l+r+1]+=num\)

• 根连接到左子树(或右子树)的某条路径上 \(dp[i+1][l+r]+=2*num*(l+r)\)

• 根连接左子树和右子树的各一条路径 \(dp[i+1][l+r-1]+=2*num*l*r\)

• 根连接左子树(或右子树)的两条路径 \(dp[i+1][l+r-1]+=num*(l*(l-1)+r*(r-
1))\)

边界为\(dp[1][0]=dp[1][1]=1\),答案为\(dp[k][1]\)。

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
namespace EMT{
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
#define pf printf
typedef long long ll;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
const int N=310;
ll tot,mod;int k;
ll ans,dp[N][N];
inline short main(){
k=read();mod=read();
dp[1][1]=dp[1][0]=1;
F(i,1,k-1){
F(l,0,k){
F(r,0,k-l){
if(dp[i][l]&&dp[i][r]){
ll num=dp[i][l]*dp[i][r]%mod;
(dp[i+1][l+r]+=num)%=mod;
(dp[i+1][l+r+1]+=num)%=mod;
(dp[i+1][l+r]+=2*num*(l+r))%=mod;
(dp[i+1][l+r-1]+=2*num*l*r)%=mod;
(dp[i+1][l+r-1]+=num*(l*(l-1)+r*(r-1)))%=mod;
}
}
}
}
pi(dp[k][1]%mod);
return 0;
}
}
int main(){return EMT::main();}

T4 求和

题目描述


一开始\(dfs\)预处理即可。

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
namespace EMT{
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
#define f(x) for(register int i=head[x],j;i;i=e[i].next)
#define pf printf
typedef unsigned long long ll;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void pi(ll x){pf("%lld ",x);}inline void pn(){pf("\n");}
const ll mod=998244353;const int N=3e5+100;int n,m,head[N],co,deep[N],fa[N][21];ll sum[N][51];
struct node{int next,to;}e[N<<1];inline void add(int next,int to){e[++co].next=head[next],e[co].to=to,head[next]=co;}
inline ll ksm(ll a,int b){
ll ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}return ans;
}
inline void dfs(int k,int Fa){
F(i,1,50)sum[k][i]=(sum[Fa][i]+ksm(deep[k],i))%mod;
f(k){
j=e[i].to;if(j==Fa)continue;deep[j]=deep[k]+1;
fa[j][0]=k;F(l,1,20)if((1<<l)<=deep[j])fa[j][l]=fa[fa[j][l-1]][l-1];else break;
dfs(j,k);
}
}
inline int getlca(int a,int b){
if(deep[a]<deep[b])swap(a,b);
D(i,20,0)if((1<<i)<=deep[a]-deep[b])a=fa[a][i];
if(a==b)return a;
D(i,20,0)if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];
return fa[a][0];
}
inline short main(){
n=read();
F(i,1,n-1){int x=read(),y=read();add(x,y);add(y,x);}
m=read();dfs(1,0);
F(i,1,m){
int a=read(),b=read(),k=read();
int lca=getlca(a,b);
if(lca==a){
pi(((sum[b][k]-sum[fa[a][0]][k])%mod+mod)%mod);pn();
}else if(lca==b){
pi(((sum[a][k]-sum[fa[b][0]][k])%mod+mod)%mod);pn();
}else{
pi(((sum[a][k]+sum[b][k]-sum[lca][k]-sum[fa[lca][0]][k])%mod+mod)%mod);pn();
}
}
return 0;
}
}
signed main(){return EMT::main();}

noip模拟8的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  10. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

随机推荐

  1. Spring学习总结(一)---谈谈对Spring IOC的理解(一:理论知识理解)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  2. Luogu P4313 文理分科

    link 最小割 双倍经验 这道题运用了最小割最常用的一种用法:集合划分. 因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用就是最小代价划分集合了. 本题中,题意是将 \(n\cdot m ...

  3. XDFZOI 月赛 201905 Sliver

    组题人自己组完过后,才发现自己还是太弱了... T1 简单模拟. 按照游戏规则直接模拟显然是不明智的,所以我们可以像石头剪刀布一样,将判断改变为检验. 同时,我们发现,一共只有48种牌,所以我们可以直 ...

  4. Django基础005-Django开发的整体过程

    1.写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:id ...

  5. SpringBoot缓存管理(三) 自定义Redis缓存序列化机制

    前言 在上一篇文章中,我们完成了SpringBoot整合Redis进行数据缓存管理的工作,但缓存管理的实体类数据使用的是JDK序列化方式(如下图所示),不便于使用可视化管理工具进行查看和管理. 接下来 ...

  6. WIN10 GMSSL编译

    从git上拉取GMSSL代码 从http://gmssl.org/上可以拉取,或者直接从git上https://github.com/guanzhi/GmSSL拉也行. 我是在git上下的,文件为gm ...

  7. java面向对象程序设计(下)-接口的定义

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...

  8. [刘阳Java]_MySQL数据优化总结_查询备忘录

    数据库优化是在后端开发中必备技能,今天写一篇MySQL数据优化的总结,供大家看看 一.MySQL数据库优化分类 我们通过一个图片形式来看看数据优化一些策略问题 不难看出,优化有两条路可以选择:硬件与技 ...

  9. 机器学习Sklearn系列:(五)聚类算法

    K-means 原理 首先随机选择k个初始点作为质心 1. 对每一个样本点,计算得到距离其最近的质心,将其类别标记为该质心对应的类别 2. 使用归类好的样本点,重新计算K个类别的质心 3. 重复上述过 ...

  10. Scala学习——基础入门

    基础语法 1)注意点 1)区分大小写 -  Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 2)类名 - 对于所有的类名的第一个字母要大写. 3)方法名 ...