noip模拟8
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的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- 全网唯一开源java开发的支持高扩展,高性能的Mqtt集群broker!
SMQTT是一款开源的MQTT消息代理Broker, SMQTT基于Netty开发,底层采用Reactor3反应堆模型,支持单机部署,支持容器化部署,具备低延迟,高吞吐量,支持百万TCP连接,同时支持 ...
- webpack(11)配置文件分离为开发配置、生成配置和基础配置
前言 上篇我们已经配置好了本地开发服务器,但是配置的相对比较凌乱,一个文件中有些是开发时用到的配置,有些是生成时用到的配置,有些是开发和生成都要用到的配置,所以我们这里把环境分为3个环境 webpac ...
- C语言中的.h和.c文件
1.h为头文件,.c为源文件,其实两者都是代码,没有实质性的区别,只是后缀不一样,是一种编程规范,主要是为了解决定义与调用之间的混乱. 2.h文件一般写一些函数声明.宏定义.结构体等内容:c文件是程序 ...
- nginx的基本使用
下载: https://nginx.org/en/download.html Window下安装: 下载好了之后直接解压就行了.(解压目录切记别含有中文) 启动:1️⃣直接双击nginx.exe2️ ...
- 洛谷P5463 小鱼比可爱(加强版) 题解
写博客不易,来玩会? 这道题我和dalao们的做法略有不同,我用的是归并排序做法qwq 归并排序求逆序对大家应该很清楚了,我这里就来讲讲如何用归并排序求出这道题的答案 让我们先观察一下规律 举个栗子, ...
- 【Azure 环境】Azure通知中心(Notification Hub)使用百度推送平台解说
问题描述 在通知中心的页面中显示支持BaiDu,介绍一下支持的是百度(Baidu)的什么吗?Azure的这个功能在国内使用的时候是否可以保证国内安卓手机的信息送达率? 问题解答 通知中心的页面中的Ba ...
- Oracle-索引分裂研究
目录 索引分裂介绍 分类 索引分裂实验 基础环境准备 基础信息统计--之前 数据插入 基础信息统计--之后 Trace 数据统计 数据分析 索引PRI_ID之dba_extents视图 索引PRI_I ...
- python 按行查找文本文件,找出答案,并提示置顶答案
1.整理好答案文件为文本文件:不能有空行:每个题干前有数字做为题号:每个题答案第一个字符为字母,答案占一行import time import time import sys import os im ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十一集补充:修改fastdfs的http.conf文件进行防盗链,重启nginx失败】
1,进入fastdfs的安装目录: 2,修改http.conf文件,详情可参考: https://www.cnblogs.com/xiaolinstudy/p/9341779.html 3,重启ngi ...
- 【Uva11400 Lighting System Design】动态规划
分析 先按照电压从小到大排序,做一下前缀和s[i]求i之前的电灯泡的数量. 状态:$ F_i\(表示到\) i$个灯泡的最小开销. 状态转移方程:$ F_i=F_j+(s[i]-s[j])\times ...