不要问我为什么昨天考的今天才贴解题报告。。

第一题:

  给定3个字符串,求它们的最长公共子序列。

解:

  考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来。。。灵机一动想出来一个方法:先记下前两个的最长公共子序列(可能有多个),然后再一一与第三个字符串比较,找出三者的最长公共子序列。然后就GG了。想不通,思路应该是对的啊。所以又留了一道题来想。

  然后三维的状态转移很好写。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define maxn 125
using namespace std;
char a[maxn],b[maxn],c[maxn];
int n,f[maxn][maxn][maxn];
int main()
{
freopen("subq.in","r",stdin);
freopen("subq.out","w",stdout);
cin>>n;
scanf("%s%s%s",a+,b+,c+);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
for (int k=;k<=n;k++)
{
f[i][j][k]=max(f[i-][j][k],max(f[i][j-][k],f[i][j][k-]));
if (a[i]==b[j]&&b[j]==c[k])
f[i][j][k]=f[i-][j-][k-]+;
}
cout<<f[n][n][n];
return ;
}

不要后悔。。。


第二题:

  定义两个素数是连续的当且仅当这两个素数之间不存在其他的素数(如 7,11 ,(23,29)。给定N,K,在不超过N的正整数中求能够分解为K个连续的素数的和的最大的那个是多少。

解:

  先开始连题都读错了,想着完了我肯定不会,这是唯一分解定理啊,数论没看过啊。然后再定睛几看,额,只是一个和而已好吗。下次要先把题读清楚。

  然后就是先求出10^6以内的素数,然后 前缀和+二分答案。哦,因为一个二分模板的问题,哎。贴一个二分模板:

int l= , r=n+;
while(l<r) // the minimum line above P(x0,y0)
{
int m = (l+r)>>;
if(check(m)) r = m;//在下面;
else l = m + ;
}
return l-;

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000005
#define ll long long
using namespace std;
int t,n[],k[],ma,su[maxn],idx;
ll he[maxn];
bool zhi[maxn];
void get_zhi(int x)
{
memset(zhi,true,sizeof(zhi));
for (int i=;i*i<=x;i++)
if (zhi[i]){
for(int j=i*i;j<=x;j+=i)
if (zhi[j]){
zhi[j]=false;
}
}
zhi[]=false;
for (int i=;i<=x;i++)
if (zhi[i]) {
//su[++idx]=i;
++idx;
he[idx]=(ll)he[idx-]+i;
}
}
void work(int x,int y)
{
int l=y,r=idx;//l
ll ans=-;
while (l<=r){
int mid=(l+r)>>;
ll an=he[mid]-he[max(,mid-y)];
if (an<=x){l=mid+;ans=an;}
else r=mid-;
}
printf("%I64d\n",ans);
/*if (he[l]-he[l-y]>x) {
l--;ans=he[l]-he[l-y];
}
//if (l+1>y&&he[l]-he[l-y]>x)
else if (ans!=-1&&he[l]-he[l-y]>x&&l-1<=y) ans=-1;
if (l-y<0) ans=-1;*/
//l+=1;
/*for (int i=l;i>=y;i--)//****
{
if (i>idx) continue;
if (he[i]-he[i-y]<=1) {//****
printf("-1\n");
return ;
}
else if (he[i]-he[i-y]<=x) {
printf("%I64d\n",he[i]-he[i-y]);
return ;
}
}
printf("-1\n");*/
}
int main()
{
freopen("dun.in","r",stdin);
freopen("dun.out","w",stdout);
cin>>t;
for (int i=;i<=t;i++)
{
scanf("%d%d",&n[i],&k[i]);
if (n[i]>ma) ma=n[i];
}
get_zhi(ma);
for (int i=;i<=t;i++)
work(n[i],k[i]);
return ;
}

第三题

  有一个村庄在闹饥荒,善良而土豪的YGH决定给他们发放救济粮,该村庄有 n 户人家,每两户人家之间只有一条路可以互相到达,即这些人家之间形成一棵树。现在 YGH 会以这样的形式给他们发放粮食,选择两户人家,然后对这两个户人家路径上的所有人家都发放一袋种类为 w 的救济粮。在完成一系列发放任务后,YGH 想知道每一户人家收到的粮食中数量最多的是哪一种。

解:

  40%:暴力。注意dfs的返回如果没有加判断,那么idx一直往下减就会下标超界。。然后就不知道哪里的值会被改了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1005
using namespace std;
int n,q,road[maxn],idx;
int tot,he[maxn],ne[maxn*],to[maxn*];
bool vis[maxn],can=false;
struct pp{
int sum;
int w[maxn],num[maxn];
};
pp house[maxn];
void add(int a,int b)
{
tot++;to[tot]=b;ne[tot]=he[a];he[a]=tot;
}
void update(int x,int y,int ad)
{
road[++idx]=x;
vis[x]=true;
if (x==y){
while (idx)
{
int s=road[idx];
bool yes=false;
for (int i=;i<=house[s].sum;i++)
if (house[s].w[i]==ad){
house[s].num[i]++;
yes=true;
break;
}
if(!yes){
house[s].sum++;
house[s].w[house[s].sum]=ad;
house[s].num[house[s].sum]++;
}
idx--;
}
can=true;
return ;
}
for (int i=he[x];i;i=ne[i])
if (!vis[to[i]]){
vis[to[i]]=true;
update(to[i],y,ad);
if (can) return ;//回溯不加判断会下标超界
vis[to[i]]=false;
idx--;
}
}
int main()
{
freopen("rice.in","r",stdin);
freopen("rice.out","w",stdout);
cin>>n>>q;
for (int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for (int i=;i<=q;i++)
{
int x,y,z;idx=;can=false;
memset(road,,sizeof(road));
memset(vis,,sizeof(vis));
scanf("%d%d%d",&x,&y,&z);
update(x,y,z);
}
for (int i=;i<=n;i++)
{
int mx=,cur=;
for (int j=;j<=house[i].sum;j++)
{
if (house[i].num[j]>mx)
mx=house[i].num[j];
}
for (int j=;j<=house[i].sum;j++)
if (house[i].num[j]==mx) {
if (house[i].w[j]<cur) cur=house[i].w[j];
}
if (cur==) cout<<""<<endl;
else printf("%d\n",cur);
}
return ;
}
//30 min

  100%:树剖。先挖坑。

【61测试】【dp】【二分】【前缀和】【树剖】的更多相关文章

  1. BZOJ 4712 洪水 (线段树+树剖动态维护DP)

    题目大意:略 题目传送门 数据结构好题,但据说直接上动态DP会容易处理不少,然而蒟蒻不会.一氧化碳大爷说还有一个$log$的做法,然而我只会$log^{2}$的.. 考虑静态时如何处理,设$f[x]$ ...

  2. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  3. 【BZOJ5210】最大连通子块和 树剖线段树+动态DP

    [BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...

  4. [CTSC2008]网络管理(整体二分+树剖+树状数组)

    一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...

  5. [bzoj4712]洪水 线段树+树链剖分维护动态dp+二分

    Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬 ...

  6. 51nod1307(暴力树剖/二分&dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  7. 洛谷P4719 动态DP —— 动态DP(树剖+矩乘)

    题目:https://www.luogu.org/problemnew/show/P4719 感觉这篇博客写得挺好:https://blog.csdn.net/litble/article/detai ...

  8. 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)

    传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...

  9. bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...

随机推荐

  1. opencv的学习笔记2

    继续昨晚的学习总结,昨晚看到轨迹条的创建就没有看下去了,今天继续: 1.轨迹条的创建: 轨迹条往往会和一个回调函数配合使用,当轨迹条发生改变,就调用这个轨迹条的回调函数 int createTrack ...

  2. for循环使用详解(c语言版)

    说明:c语言的很多语法部分都和JAVA,AS等相同 特别是for的用法. c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况 ...

  3. servlet1

    1.jsp其实就是servlet 2.一个java类实现servlet接口,然后在浏览器端访问即可

  4. Spark分析笔记

    前言 第一章 Spark简介 本章将对Spark做一个介绍,以及它的一些基本概念 Spark是什么? Spark生态系统BDAS Spark架构 Spark分布式与单机多核架构的异同 Spark的企业 ...

  5. 使用C# yield关键字来提高性能和可读性

    对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量.我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子. 为了让你对yield有一些快速概览 ...

  6. 【Unity3D游戏开发】之利用语法糖添加自定义拓展方法(下) (十八)

    首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕不已,呵呵. 1.  ...

  7. 【Android】设置 LinearLayout 的样式

    前言 LinearLayout是最常用的控件之一,主要是用来进行排版布局,本人介绍如何给LinearLayout 增加边框样式,在增加样式之前的效果如下: 可以看得出来,每个LinearLayout几 ...

  8. hibernate中设置BigDeCimal的精度

    @Column(precision = 12, scale = 2) 在MySQL数据库中的精度为:

  9. js处理iframe中子页面与父页面里面对象的取得的解决方案

    [1]子页面取得父页面的dom对象   parent.window.$('#id').val("");   [2]父页面取得子页面的对象   $(window.frames[&qu ...

  10. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...