(不知道为什么居然爆零了qwq)

(全员爆零诶,最高分10分???还是rand出来的???)

我freopen写错了????自闭了

不行不行再写一遍freopen加深印象,不能再写错了

freopen("文件名","r",stdin);
freopen("文件名","w",stdout);

行吧,还是来整一整老师给的题解吧qwq

忍不住bibi一句出题的这个哥哥好年轻啊qwq,我都不好意思叫人家老师,应该是哥哥


题目

Problem A.最近公共祖先

先列一个表格

这样大概就理解71是怎么出来的了

30pts思路:

将整棵树建出,共有 O(Kn) 个节点,计算任意两个节点的LCA 复杂度 O(n)。

注意到没有必要将所有点对的 LCA 都计算出来, 因为对于同一层的两个节点 u 和 v,

T depth(lca(i, u)) 和 ∑ Tdepth(lca(i, v)) 是相同的, 每一层只需要算一个节点就行, 时间复杂 度 O(n2K n) 。

(以上是老师的思路,但是我现在对建树这种事有点蒙???当时考试的时候爆零了qwq,实际上我的暴力也是可以得30分的。下次一定得记得开long long)

先带上一个七十多行的大暴力:

30分代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define mo 998244353 using namespace std; long long k,n,ans,s,z;
int t[]; struct c{
int num1,num2;
//num1表示以这一层为根的子树的结点数
//num2表示这一层的结点数
}ceng[]; int quick_pow(int a,int b) { //快速幂
int ans=;
if(b==)return ;
while(b){
if(b&)ans=(a*ans)%mo;
a=(a*a)%mo;
b/=;
}
return ans%mo;
} int num1(int n,int k){//求子树点数 n层k叉树
int z=n-;
int num=;
while(z){
num+=quick_pow(k,z);
z--;
}
return num+;
} void ych(){
for(int i=;i<=n;i++){
ceng[n-i+].num1=num1(i,k);//以这一层为根的子树的结点数
ceng[i].num2=quick_pow(k,i-);//这一层的结点数
} } int main(){ scanf("%d%d",&n,&k); ych();//他本来叫做预处理,后来被我改成了于才鸿 for(int i=;i<=n;i++)
ans+=num1(n-i+,k)*quick_pow(k,i-)*i;//求的是子树的
//这里算的是某个点以下的depth之和包括它自己 for(int i=;i<=n;i++)
s+=i*quick_pow(k,i-);//这里算的是每个点自己的depth和 ans-=s;
ans=ans*%mo; for(int i=;i<=n;i++){
for(int j=;j<i;j++){
z+=(k-)*ceng[i-j+].num1*(i-j)*quick_pow(k,i-);
//算的是同一深度的
}
} ans+=z;
ans%=mo; cout<<(ans+s)%mo<<endl;
return ;
}

60pts思路:

更一般的,题目计算的是任意两个点 LCA 的深度,这个数量等于,任意两个点公共的祖先共有多少个。考虑计算第 i 层的某个节点,是多少个点对的公共祖先,这个数量就是该节点子树内节点数的平方。第 i 层的节点所在子树节点数 1+K+···+K n−i=(Kn−i+1−1)/(K−1) 。答案就是 ∑n i=1 ( (Kn−i+1−1)/(K−1) ) 2 ∗ K i−1

即:

求任意两点LCA深度=>任意两点公共祖先数量=>a是多少个点对的公共祖先(枚举对于每个数a,它是x,y的公共祖先=>x,y在a的子树里。有多少个点在a的子树中呢?)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
const int mo=; using namespace std; long long ans,k1; int n; long long pow(long long a,int b){
long long ans=;
if(b==)return ;
while(b){
if(b&)ans = (a*ans)%mo;
a = (a*a)%mo;
b/=;
}
return ans%mo;
} int main(){
scanf("%d%lld",&n,&k1); for(int i=;i<=n;i++)
ans=(ans+pow((long long)(pow(k1,n-i+)-)%mo*pow(k1-,mo-)%mo,)*pow(k1,i-))%mo;
//核心式子的编程语言 cout<<ans%mo<<endl;
}

100pts思路:

#include <bits/stdc++.h>

using namespace std;

const int mod = ;
typedef long long LL;
int fpm(int p, int k)
{
int res = ;
for (p %= mod; k; k >>= , p = (LL) p * p % mod)
if (k & ) res = (LL) res * p % mod;
return res;
}
int main()
{
// freopen("lca.in", "r", stdin);
// freopen("lca.out", "w", stdout);
int n, K; cin >> n >> K;
int e = fpm(K - , mod - ); //e=1/(K-1)
int x = (fpm(K, n) - ) * (LL) e % mod; //x=(K^n-1)/(K-1);
int ans = (fpm(K, n + ) + ) * (LL) x % mod;//ans=(K^(n+1)+1)*((K^n-1)/(K-1))
ans = (ans - * n * (LL) fpm(K, n)) % mod;//ans=(K^(n+1)+1)*((K^n-1)/(K-1))-2nK^n;
ans = ans * (LL) e % mod * (LL) e % mod;//ans*=(1/(K-1))^2;
cout << (ans < ? ans + mod : ans);//三目运算符,判断是否为负数
}

Problem2:最长公共回文子序列:

50pts思路:

经典的做法:

设s,t的反串(eg:abbsf 反串fsbba)为sr,tr,那么求s和t的最长公共回文序列就是求s,sr,t,tr的最长公共子序列。


如何求最长公共子序列?

用DP!

怎么用?

粘一篇别人的博客吧:链接

对于二维的转移方程:

dp[i][j]=   dp[i-1][j-1]   s[i]=t[j];

max{dp[i-1][j],dp[i][j-1]}  s[i]!=t[j];

对于四维的:

用一个DP来做就可以得到50pts了:

然鹅我……写炸了。

#include<bits/stdc++.h>

using namespace std;

int s[],t[],sr[],tr[];
int len_s,len_t,max1,max2;
int dp[][][][];
char s1[],t1[]; void scl(){
for(int i=;i<len_s;i++){
sr[len_s-i]=s1[i];
s[i+]=s1[i];
}
for(int i=;i<len_t;i++){
tr[len_t-i]=t1[i];
t[i+]=t1[i];
}
} int main(){
scanf("%s",s1);
scanf("%s",t1);
len_s=strlen(s1);
len_t=strlen(t1);
scl();
for(int i=;i<=len_s;i++){
for(int j=;j<=len_t;j++){
for(int k=;k<=len_s;k++){
for(int l=;l<=len_t;l++){
if(s[i]==sr[k]&&s[i]==t[j]&&s[i]==tr[l]&&sr[k]==t[j]&&sr[k]==tr[l]&&t[j]==tr[l])
//注意这里不能略写为s[i]==t[j]==sr[k]==tr[l]{
dp[i][j][k][l]=dp[i-][j-][k-][l-]+;
}
else {
max1=max(dp[i-][j][k][l],dp[i][j-][k][l]);
max2=max(dp[i][j][k-][l],dp[i][j][k][l-]);
dp[i][j][k][l]=max(max1,max2);
}
}
}
}
}
cout<<dp[len_s][len_t][len_s][len_t]<<endl;
}

100pts:

暴力:一位一位的遍历,O(n*2m

显然很慢啊qwq;

加速???

维护一个26*n的数组,记录距离某个位置最近的某个字母(26个字母)在哪儿;

不会写qwq自闭

Problem3:

直接讲100pts的贪心:

这个题的原理忘记为啥了???

即解一个二元一次方程组13a+5b=t。

所以我们分别枚举a,b找到最小的t;

复杂度O(30n)

【五一qbxt】test1的更多相关文章

  1. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  2. 【五一qbxt】test2

    又犯了一些迷之错误??要不然yy鼠标就是我的了 1.Superman: 小姐姐的题解:直接用set模拟即可emmmm 里面有很多指针啊,乱七八糟的,不会qwq,先看看我的大模拟吧: #include& ...

  3. 【五一qbxt】day3 动态规划

    动态规划 引例: 斐波那契数列: 边界条件:f0=0: f1=1: 能够直接被求出值的状态 不需要计算其他斐波那契数列的值直接可以得到结果: 转移方程:fn=fn-1+fn-2如何用已有状态求出未知状 ...

  4. 【五一qbxt】day7-1 引水入城

    [noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...

  5. 【五一qbxt】day6 OI中的stl

    from:why 很多很多part…… 1.pair: 相当于把两个变量放在一起: #include<utility> using namespace std; pair<TypeN ...

  6. 【五一qbxt】day5 图论

    图论 学好图论的基础: 必须意识到图论hendanteng xuehuifangqi(雾 图 G = (V,E) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成两条即 ...

  7. 【五一qbxt】day4 数论知识

    这些东西大部分之前都学过了啊qwq zhx大概也知道我们之前跟着他学过这些了qwq,所以: 先讲新的东西qwq:(意思就是先讲我们没有学过的东西) 进制转换 10=23+21=1010(2) =32+ ...

  8. MY TESTS

    励志整理所有的n次考试的博客: [五一qbxt]test1 [五一qbxt]test2 [校内test]桶哥的问题 [6.10校内test] noip模拟 6.12校内test [6.12校内test ...

  9. 【qbxt五一】day2

    简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...

随机推荐

  1. Java中SSM+Shiro系统登录验证码的实现方法

    1.验证码生成类: import java.util.Random; import java.awt.image.BufferedImage; import java.awt.Graphics; im ...

  2. node之events 模块,并通过实例化 EventEmitter 类来绑定和监听事件

    例子来源:http://www.runoob.com/nodejs/nodejs-event-loop.html http://www.runoob.com/nodejs/nodejs-event.h ...

  3. List集合的三个实现类比较

    1. ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 2. Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率低 3. LinkedList 底层数据结构是链 ...

  4. Celery分布式异步任务框架

    一.什么是Celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统.专注于实时处理的异步任务队列,同时也支持定时任务 二.Celery架构 1.Celery的架构由三部分组成: 消 ...

  5. Splay教程

    目录 前言 引入 教程 Rotate Splay 一些其他操作: 区间翻转 结语 前言 Splay是名副其实的区间小能手.它会经常出现在一些有关区间的题上.而本蒟蒻只会Treap,感到分外难受,于是就 ...

  6. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  7. R_Studio(学生成绩)使用主成分分析实现属性规约

    对11_1_4.csv成绩表进行主成分分析处理 setwd('D:\\data') list.files() #读取数据 dat=read.csv(file="11_1_4.csv" ...

  8. 关于Tomcat配置相关总结

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. js将伪数组转换为标准数组的多种方法

    在js中,数组是特殊的对象,凡是对象有的性质,数组都有,数组表示有序数据的集合,而对象表示无序数据的集合. 那伪数组是什么呢,当然它也是对象,伪数组一般具有以下特点: 按索引方式存储数据: 具有len ...

  10. java 方法的重载重写

    面向对象有三大特性:封装,继承,多态 多态则需要满足三大条件1要有继承2要有重写3父类引用子类对象 很多人对方法的重载重写有很大疑问,下面我来介绍一下方法的重载重写 方法重载就是方法名称重复,加载参数 ...