日常练习1

T1

—————————————————————————————————————————————

这道题我是用树形dpA的 $f[i][j]$ 表示包含点i在内的他的子树 内一共有j(j=0或1)个不合法点

x表示当前点 now表示他的某一个儿子

 $f[x][1]=min(f[x][1]+f[now][0],f[x][0]+f[now][1],f[x][1]+f[now][1]+e[i].w)$

 $f[x][0]=min(f[x][0]+f[now][1],f[x][0]+f[now][0]);$

然后就瞎搞一下就可以A了 注意初始化 不合法点x的$f[x][0]=inf$ 这样才能保证准确性

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using std::min;
const int M=1e5+7;
const LL inf=1e18;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,k,vis[M];
LL f[M][2];
int first[M],cnt;
struct node{int to,next,w;}e[2*M];
void ins(int a,int b,int w){e[++cnt]=(node){b,first[a],w}; first[a]=cnt;}
void insert(int a,int b,int w){ins(a,b,w); ins(b,a,w);}
void dfs(int x){
    vis[x]=1;
    for(int i=first[x];i;i=e[i].next){
        int now=e[i].to;
        if(vis[now]) continue;
        dfs(now);
        f[x][1]=min(f[x][0]+f[now][1],f[x][1]+min(f[now][0],f[now][1]+e[i].w));
        f[x][0]=f[x][0]+min(f[now][1]+e[i].w,f[now][0]);
    }
}
int main(){
    int x,y,w;
    n=read(); k=read();
    for(int i=1;i<=k;i++) x=read(),f[x][0]=inf;
    for(int i=1;i<n;i++) x=read(),y=read(),w=read(),insert(x,y,w);
    dfs(1);
    printf("%lld\n",min(f[1][0],f[1][1]));
    return 0;
}

当然也有并查集的写法 就是按边从大到小排序然后如果这条边连接的两个并查集的话

就删掉这条变 删掉边的总和就是答案了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using std::min;
const int M=1e5+7;
const LL inf=1e18;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
LL ans;
int cnt,n,k,f[M],h[M];
int find(int x){while(f[x]!=x) x=f[x]=f[f[x]]; return x;}
struct node{int from,to,w;}e[2*M];
bool cmp(node a,node b){return a.w>b.w;}
int main(){
    int x,y,w;
    n=read(); k=read();
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=k;i++) x=read(),h[x]=1;
    for(int i=1;i<n;i++) x=read(),y=read(),w=read(),e[++cnt]=(node){x,y,w};
    std::sort(e+1,e+1+n,cmp);
    for(int i=n;i;i--){
        int p=find(e[i].from),q=find(e[i].to);
        if(h[p]&&h[q]) ans+=e[i].w;
        else f[q]=p,h[p]+=q;
    }printf("%lld\n",ans);
    return 0;
}

T2

————————————————————————————————————————

这道题我写的是O(n)的hash判相等 枚举长度判断相等就吼了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
const int M=2e5+7,P=9875321;
unsigned long long h1[M],h2[M],w[M];
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
char c[26],s1[M],s2[M];
int cnt,ans,wh[26];
bool f=false;
int main(){
    scanf("%s",c);
    for(int i=0;i<26;i++) wh[c[i]-‘a‘]=i;
    scanf("%s",s1+1); cnt=strlen(s1+1);
    for(int i=1;i<=cnt;i++) s2[i]=c[s1[i]-‘a‘];
    w[0]=1; for(int i=1;i<=cnt;i++) w[i]=w[i-1]*P;
    for(int i=1;i<=cnt;i++) h1[i]=h1[i-1]*P+s1[i];
    for(int i=1;i<=cnt;i++) h2[i]=h2[i-1]*P+s2[i];
    for(int d=cnt/2;d;d--){
        if(h1[d]==h2[cnt]-h2[cnt-d]*w[d]){f=true; ans=d; break;}
    }
    if(!f){
        printf("%s",(s1+1));
        for(int i=1;i<=cnt;i++) printf("%c",‘a‘+wh[s1[i]-‘a‘]);
    }
    else{
        for(int i=1;i<=cnt-ans;i++) printf("%c",s1[i]);
        for(int i=1;i<=cnt-ans;i++) printf("%c",‘a‘+wh[s1[i]-‘a‘]);
        printf("\n");
    }
    return 0;
}

——————————————————————————————————

这道题就是类似插头dp的东西 要分一堆类 枚举一个2x2的矩形四条条边的选与不选

一共16(2^4) 种情况 然后就看一下怎么转移 $f[i][j][k]$表示前i行选了j个联通块 当前行中间是否有横杠

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
const int M=2e3+9,mod=1e8+7;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,m;
LL f[M][M][2];
int main(){
    n=read(); m=read();
    f[1][1][0]=1; f[1][2][1]=1;
    for(int i=2;i<=n;i++){
//        int(*now)[2]=f[i-1];
        LL(&last)[M][2]=f[i-1];
        for(int k=1;k<=m;k++){
            f[i][k][0]=(last[k][0]+2*last[k][1]+last[k-1][0]+last[k-1][1])%mod;
            f[i][k][1]=(last[k-1][0]*2+last[k][1]+2*last[k-1][1]+last[k-2][0]+last[k-2][1])%mod;
        }
    }printf("%lld\n",(f[n][m][0]+f[n][m][1])%mod);
    return 0;
}

时间: 2024-10-05 15:02:56

日常练习1的相关文章

caffe日常坑系列之:undefined reference to symbol &#39;_ZN2cv6String10deallocateEv&#39;

在使用caffe库编译C++时出现的 解决如下: /usr/bin/ld: /tmp/ccA5JGRP.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'//usr/local/lib/libopencv_core.so.3.2: error adding symbols: DSO missing from command line解决:sudo apt-get autoremove libopencv-dev caffe

MHA 日常维护命令集

MHA 日常维护命令集 1.查看ssh登陆是否成功 masterha_check_ssh --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf 2.查看复制是否建立好 masterha_check_repl --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf 3.启动mha noh

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","

SQL 基础之用户角色日常操作(十六)

在数据库管理中一定本着一个原则就是权限最小化的原则,如果有需要在赋予相应的权限 数据库管理员日常对于用户的管理任务如下: – 创建新用户 – 删除用户 – 删除表 – 备份表 1.创建用户yuri,并设置密码为password. create user  yuri identified by password; 2.用户创建之后, DBA 会赋予用户一些系统权限 以应用程序开发者为例, 一般具有下列系统权限: - create session -create table -create sequ

Oracle 数据库日常巡检

Oracle 数据库日常巡检 阅读目录 1. 检查数据库基本状况 2. 检查Oracle相关资源的使用情况 3. 检查Oracle数据库备份结果 4. 检查Oracle数据库性能 5. 检查数据库cpu.I/O.内存性能 6. 检查数据库安全性 7. 其他检查 回到顶部 1. 检查数据库基本状况 包含:检查Oracle实例状态,检查Oracle服务进程,检查Oracle监听进程,共三个部分. 1.1. 检查Oracle实例状态 select instance_name,host_name,sta

python日常-list

什么事list: list 觉得算是python日常编程中用的最多的python自带的数据结构了.但是python重的list跟其他语言中的并不相同. 少年..不知道你听说过python中的append方法比insert方法的效率高非常多呢?什么,你不知道?请容老衲慢慢道来. 其他编程语言中list也叫链表,大抵就是除了最后一个元素外,所有元素的中都有一个指针,这个指针只想下一个元素节点的引用. 如果你想添加元素的话 把最后一个元素里的指针指向你想要app元素即可,插入呢?嘿嘿 这个时候你只要把

Maven日常 —— 你应该知道的一二三

以前在日常工作中,使用Maven只是机械的执行Maven clean.Maven install,对其中的原理与过程并无了解,近期阅读了<Maven实战>,对Maven有了更深入的理解. 本篇就针对读书后的理解,对Maven的日常使用相关的知识进行总结与归纳. 如果想要了解更多内容参考:<Maven实战> 1 什么是Maven? 如果没有Maven,你可能不得不经历下面的过程: 1 如果使用了spring,去spring的官网下载jar包:如果使用hibernate,去hibern

第八篇 EBS实现企业日常业务运管模型的解决方案设计思路

常业务运管模型企业有大有小,各行各业,千差万别,但,其日常业务运管也有相通之处,以典型的制造企业为例,其日常业务运管模型如下图所示: (1)企业日常业务运管模型在市场经济条件下,一个生产型企业往往会从供应市场上购买原材料(生产资料供应市场,人力资源市场等),经过一系列加工制造过程生产出客户需要的产品或服务,然后通过物流运输等形式交付给客户,实现价值创造.在能够持续盈利的情况下可以实现扩大再生产,持续发展壮大.从创业期过渡到发展期.继而过渡到壮大期.继而过渡到稳定期,随着市场盈利空间的变化还可能谋

.NET高级群日常一篇

.NET高级群日常(开头聊php,他们可是.NET的顶尖战力之一)太阳神:单从网页的角度来说,两者是类似的老猫子:只要你够牛逼 什么语言都不是问题太阳神:PHP的优势在于轻量,劣势在于应用处理能力不足宇内流云:用owin,.net一样的轻量!太阳神:包括PHP很难写出复杂的处理逻辑,还有执行模型决定了CPU密集型的程序很难写太阳神:PHP的执行模型是IO密集型的宇内流云:PHP不是语言强!也不是平台强!强大在动态网页方面积累了太多的年份,有大量的可以重复利用的源码资源,甚至现存的开源的成品网站!

KVM虚拟机的安装和日常管理

公司为了节约成本,需要把一部分业务迁到虚拟化平台上,今天把虚拟机装了出来,记一下笔记 1.物理机的系统安装(硬盘为300G+300G): centos6.5 64位,不安装桌面环境,默认运行级别为3 分区: /boot 128M swap 8G / 20G /data1  第一块硬盘剩余空间 /data2  第二块硬盘全部空间 采用最小化安装+以下软件包: BaseSystem -- Base Development-- Development tools 要配置好dns 确定系统时间与北京时间