T1星际旅行

给出n个点,m条边,求满足一条路径使得m-2条边经过2次,2条边经过1次的方案数.并且题目中给出有自环.

看到题面我以为是个计数DP,可能是计数题做多了吧哈哈.其实仔细朝图的方向想一想就会发现,把每条边double一下,题目的要求就是去掉两条边,然后还能是欧拉路一笔画走完.

欧拉路的性质就是点的度数为偶,或者是其中两点度数为奇数.所以就要考虑拆边怎莫拆.

因为我把路径double了一下,所以现在度数都是偶数,如果随便拆两条边,那么肯定会出现四个单点,所以我拆的两条边要有公共点.在来看自环,很明显自环对奇偶是毫无影响的,所以可以是任意一个自环和一个边,或者是任意两个自环.

以上三种加起来便是方案书.注意要判不联通的情况,而且因为题目是在边上做文章,所以点联不联通是无所谓的,我只需判边,用并查集即可.

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ji,head[300001],in[300001],fa[300001],cnt,sum[300001],ans;
struct AYX
{int to,next;}bian[600001];
inline int find(int x)
{ if(x!=fa[x])return fa[x]=find(fa[x]);
return x;
}
inline void add(int u,int v)
{ bian[++ji].next=head[u];
bian[ji].to=v;
head[u]=ji;
}
signed main()
{ scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)fa[i]=i;
for(int i=1;i<=m;++i)
{ int a,b;
scanf("%lld%lld",&a,&b);
if(a==b)++cnt,++sum[a],++sum[b];
else {++in[a],++in[b];fa[find(a)]=find(b);}
add(a,b);add(b,a);
}
int ww=0;
for(int i=1;i<=n;++i)
for(int j=head[i];j;j=bian[j].next)
{ int v=bian[j].to;
if(!ww){ww=find(v);continue;}
if(ww!=find(v))
{ printf("0\n");
return 0;
}
}
for(int i=1;i<=n;++i)ans+=(in[i]-1)*in[i]/2;
ans+=cnt*(cnt-1)/2;
ans+=cnt*(m-cnt);
printf("%lld\n",ans);
}

T2砍树

式子不好搞,额,不是不好推,是不好打...........

maxd 要满足floor(a[i]/d)*d-a[i]<=k;

转化一下得到floor(a[i]/d)<=(k+a[i])/d;

k+a[i]为定值,设为T;则floor(a[i]/d)<=T/d;

明显是数论分块,检查每一个右端点取max就好,因为只有100个数,check时暴力算就行.

复杂度T^(1/2)*n;

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[3000001],k,T,ans;
inline bool check(int x)
{ int d=T/x,sum=0;
for(int i=1;i<=n;++i)
{ if(a[i]%x==0)sum+=a[i]/x;
else sum+=a[i]/x+1;
}
return sum<=d;
}
inline void work()
{ for(int l=1,r;l<=T;l=r+1)
{ r=T/(T/l);
if(check(r))ans=max(ans,r);
}
printf("%lld\n",ans);
}
signed main()
{ scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]),T+=a[i];
T+=k;
work();
}

T3超级树

这个计数dp不好搞,这是真不好搞.

f[i][j]表示第i个,有j条点不重复的路径.

设num=f[i-1][l]*f[i-1][r];

f[i][l+r]+=num;这是对这棵树神魔也不做.

f[i][l+r+1]+=num;这是将跟节点作为一条新路径.

f[i][l+r]+=num(l+r)2;这是将根连到左右子树的某个路径上.

f[i][l+r-1]+=num* l* r *2;这是将根与左右各一条相连.

f[i][l+r-1]+=num(l(l-1)+r*(r-1));这是根与同一子树中两条路径相连.

因为最终对ans有贡献的只有k个状态,所以第二维只有k.

code

#include<bits/stdc++.h>
#define re register
using namespace std;
int k,mod;
long long f[3001][3001];
signed main()
{ scanf("%d%d",&k,&mod);
f[1][0]=f[1][1]=1;
for(re int i=2;i<=k;++i)
for(re int j=0;j<=k;++j)
for(re int r=0;r<=j;++r)
{ int l=j-r;
long long sum=f[i-1][l]*f[i-1][r]%mod;
f[i][l+r]=(f[i][l+r]+sum)%mod;
f[i][l+r+1]=(f[i][l+r+1]+sum)%mod;
f[i][l+r]=(f[i][l+r]+sum*2*(l+r))%mod;
f[i][l+r-1]=(f[i][l+r-1]+2*sum*l*r)%mod;
f[i][l+r-1]=(f[i][l+r-1]+sum*(l*(l-1)+r*(r-1)))%mod;
}
printf("%lld\n",f[k][1]%mod);
}

T4求和

数据超水,暴力都能撵过去,可惜我没mod,100-->0..............

正解也够暴力的,就是预处理每个dep的1-50次方,和其前缀和.询问时求lca,O(1)搞出ans;

code就借WTZ一用,也算有咱一半产权吧.

#include<bits/stdc++.h>
#define mod 998244353
#define int long long
using namespace std;
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<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0) x=-x,putchar('-');
if(x>10) write(x/10);
putchar(x%10+'0');
}
int n,m,ans;
int siz[300010],fa[300010],son[300010],top[300010],dep[300010],mxd=0;
int depk[300010][51],sum[300010][51];
int head[300010],ver[600010],to[600010],tot;
inline void add(int x,int y){
ver[++tot]=y;
to[tot]=head[x];
head[x]=tot;
}
inline void dfs1(int x,int fath,int depth){
int maxson=-1;
fa[x]=fath,dep[x]=depth,siz[x]=1;mxd=max(mxd,depth);
for(int i=head[x];i;i=to[i]){
int y=ver[i];
if(y==fath) continue;
dfs1(y,x,depth+1);
siz[x]+=siz[y];
if(siz[y]>maxson) son[x]=y,maxson=siz[y];
}
}
inline void dfs2(int x,int topf){
top[x]=topf;
if(!son[x]) return;
dfs2(son[x],topf);
for(int i=head[x];i;i=to[i]){
int y=ver[i];
if(y==fa[x]||y==son[x]) continue;
dfs2(y,y);
}
}
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 x;
}
signed main(){
n=read();
for(int i=1,x,y;i<n;i++){
x=read(),y=read();
add(x,y),add(y,x);
}
dfs1(1,0,0);dfs2(1,1);
for(int i=1;i<=mxd;i++){
depk[i][1]=i;
for(int j=2;j<=50;j++) depk[i][j]=depk[i][j-1]*i%mod;
}
for(int i=1;i<=mxd;i++) for(int j=1;j<=50;j++) sum[i][j]=(sum[i-1][j]+depk[i][j])%mod;
m=read();
for(int i=1,x,y,k,lca;i<=m;i++){
x=read(),y=read(),k=read();
lca=LCA(x,y);
ans=0;
ans=(sum[dep[x]][k]-sum[dep[lca]][k]+mod)%mod+(sum[dep[y]][k]-sum[dep[fa[lca]]][k]+mod)%mod;
printf("%lld\n",ans%mod);
}
return 0;
}

NOIP 模拟八 考试总结的更多相关文章

  1. 【noip模拟】考试总结

    今天睡了14个小时啊 把一星期的觉都补回来了 要不是被叫醒了 我肯定还在睡觉- - 其实现在还想睡... 集训真是伤身啊 感觉再睡就要睡成sb了 鉴于昨天被完虐(真·完虐 怒垫底) 来写篇总结 得分: ...

  2. NOIP 模拟 6 考试总结

    T1 这道题是一道裸的暴力,考场写挂了 \(5pts\) 原因竟是忘了删注释,难受 题解 T2 这道题是一道启发式合并,没想出来,拿了个暴力分跑了 题解 T3 这道题就是一道数学期望,想出来就水得很, ...

  3. NOIP 模拟九 考试总结

    T1 考场上先干的T2,最后慌慌张张没去想正解,打算把树建起来,拿70分的部分分,于是写树剖LCA,板子好像忘了,回忆了好久还模拟了好几遍才打对树剖LCA............期望70,结果0.考试 ...

  4. NOIP 模拟 10 考试总结

    T1 一道很妙的题,打暴力分也很多,但是考试的时候忘开 long long 了. 题解 T2 一道挺水的题,不过...(打挂了) 题解 T3 此题甚妙,转化真多,不过对思维是一个非常大的扩展 题解 考 ...

  5. NOIP 模拟六 考试总结

    T1辣鸡 T1就搞得这莫不愉快.. 大致题意是给你几个矩形,矩形覆盖的点都标记上,每个矩形无重复部分,求满足(x,y) (x+1,y+1)都标记过的点对数,范围1e9. 看起来很牛的样子,我确实也被1 ...

  6. NOIP 模拟一 考试总结

    序列 考场上信心满满的打了nlogn的做法,我以为我稳了.据考试结束1h时发现看错题目了,打成了不连续的子序列.匆匆改了n2logn的做法.考试结束后,我发现我跪了.原来到终点才会发现我做的和人家不是 ...

  7. NOIP 模拟 八十五

    T1 冲刺NOIP2021模拟18 莓良心 容易发现答案和每一个 \(w_i\) 无关,我们只需要求出总和然后计算方案数. 对于每一个数贡献的方案数是相同的,首先是自己的部分就是\(\begin{Bm ...

  8. 2016.11.6 night NOIP模拟赛 考试整理

    题目+数据:链接:http://pan.baidu.com/s/1hssN8GG 密码:bjw8总结: 总分:300分,仅仅拿了120份. 这次所犯的失误:对于2,3题目,我刚刚看就想到了正确思路,急 ...

  9. NOIP 模拟 7 考试总结

    T1 超级大水题,用 \(kmp\) 和 \(hash\) 均能过,但都忘了,结果只打了个暴力.难受.板子题,题解就不放了 Code #include<bits/stdc++.h> #de ...

随机推荐

  1. mzy git学习,git推送到远程库(八)

    git在同步到远程库 关于git中多个用户切换的事情: 完全使用账户密码策略连接远程库: 之前一直尝试在本地切换多个用户,发现一直不行,很奇怪?后面发现必须要去win10的凭据管理器删除当前git的凭 ...

  2. Vue.JS快速上手(组件间的通信)

    前言 Vue采用的是组件化思想,那么这些组件间是如何通信的呢?下面详细介绍一下. 所谓组件间通信,不单单是我们字面上理解的相互传递数据,这里还包括一个组件访问另一个组件的实例方法等,如父组件通过ref ...

  3. 详解 Apache SkyWalking 跨进程传播协议

    简介 SkyWalking 跨进程传播协议是用于上下文的传播,本文介绍的版本是3.0,也被称为为sw8协议. Header项 Header应该是上下文传播的最低要求. Header名称:sw8. He ...

  4. python 实用技巧:几十行代码将照片转换成素描图、随后打包成可执行文件(源码分享)

    效果展示 原始效果图 素描效果图 相关依赖包 # 超美观的打印库 from pprint import pprint # 图像处理库 from PIL import Image # 科学计算库 imp ...

  5. Kubernetes-Pod介绍(-)

    前言 本篇是Kubernetes第四篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战.从现在开始都是重要的核心概念,此篇偏一些Pod的概念介绍,后续每篇都会有实战. Kubernetes系列 ...

  6. Vs code自动生成Doxygen格式注释

    前言 ​ 程序中注释的规范和统一性的重要性不言而喻,本文就推荐一种在用vscode编写代码时自动化生成标准化注释格式的方法,关于Doxygen规范及其使用可查看博文 代码注释规范之Doxygen. ​ ...

  7. Redis-初见

    目录 启动and连接 JRedis 宝塔 Redis.conf RDB AOF(Append Only File) 发布和订阅 主从复制 一主二从 复制原理 宕机后的手动配置主机 哨兵模式 Redis ...

  8. MySQL数据库初体验

    一.数据库的基本概念1.数据(Data) 描述事物的符号记录 包括数字,文字,图形,图像,声音,档案记录等 以"记录"形式按统一的格式进行存储 2.表 将不同的记录组织在一起 用来 ...

  9. linux性能瓶颈排查--内存+cpu+网络+磁盘+应用瓶颈

    概述 作为运维人员,肯定遇到过以下场景,应用突然卡住了,或者异常退出,cpu占用过高等各种异常情况,一般遇到这些异常情况,该如何去查找具体原因呢? linux和jdk提供了一些命令和工具来查看内存.c ...

  10. leetcode-螺旋矩阵(指针)

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2 ...