【61测试】【dp】【二分】【前缀和】【树剖】
不要问我为什么昨天考的今天才贴解题报告。。
第一题:
给定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】【二分】【前缀和】【树剖】的更多相关文章
- BZOJ 4712 洪水 (线段树+树剖动态维护DP)
题目大意:略 题目传送门 数据结构好题,但据说直接上动态DP会容易处理不少,然而蒟蒻不会.一氧化碳大爷说还有一个$log$的做法,然而我只会$log^{2}$的.. 考虑静态时如何处理,设$f[x]$ ...
- 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...
- 【BZOJ5210】最大连通子块和 树剖线段树+动态DP
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...
- [CTSC2008]网络管理(整体二分+树剖+树状数组)
一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...
- [bzoj4712]洪水 线段树+树链剖分维护动态dp+二分
Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬 ...
- 51nod1307(暴力树剖/二分&dfs/并查集)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...
- 洛谷P4719 动态DP —— 动态DP(树剖+矩乘)
题目:https://www.luogu.org/problemnew/show/P4719 感觉这篇博客写得挺好:https://blog.csdn.net/litble/article/detai ...
- 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)
传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...
- bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...
随机推荐
- BJFU 1057
描述 斐波那契额数列,我们都知道.现在qingyezhu想求斐波那契的某项值对2的某次方的结果.你可以帮一下他吗?他好可怜哦!计算了N的N次方次都错了,也挨了ben大哥的N的N次方次的训了.我想你是个 ...
- 获取访问者ip的方法
package com.mi.util; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.S ...
- [python]使用virtualenv处理python版本问题
1. 更新virutalenv $ sudo easy_install --upgrade virtualenv 2. 新建virtualenv实例, 确保在your home directory ...
- 【数论】二进制GCD
二进制GCD GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...
- Live writer
使用起来还是蛮方便的,安装速度很快,配置也不麻烦.
- 设置程序集(dll)引用路径,整洁美观
static class Program { //设置引用程序集路径 static Program() { AppDomain.CurrentDomain.SetData("PRIVATE_ ...
- zigbee学习之路(六):Time3(查询方式)
一.前言 通过上次的学习,相信大家对cc2530单片机的定时器的使用有了一定的了解,今天我们来介绍定时器3的使用,为什么介绍定时器3呢,因为它和定时器4功能是差不多的,所以学会定时器3,就基本掌握了c ...
- Cable TV Network-POJ1966图的连通度
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4404 Accepted: 2047 Desc ...
- noi 8780 拦截导弹
题目链接: http://noi.openjudge.cn/ch0206/8780/ LDS http://paste.ubuntu.com/23402528/
- php数组插入数据库这个功能该怎么实现
原文网址:https://segmentfault.com/q/1010000004048449 比如一个数组$a=array("a"=>"1",&quo ...