洛谷P1268 树的重量

  • 我觉得难点在于把每个叶子节点想象成分出来的叉
  • 然后如果c是a--b这条边上分出来的,可以通过Dab,Dca,Dcb算出分叉边的长度,
  • 长度=(Dac+Dbc-Dab)/2
  • 怎么看c到底是哪两条边分叉出来的呢?
  • 取最小的(洛谷后面的题解可以看懂)
  • 代码:(只有一个测试数据感觉都不知道自己写的到底对不对
     #include <bits/stdc++.h>
    #define inf 1e9 using namespace std;
    int n; //n<=30
    int d[][]; inline int f(int a,int b,int c){ //c是ab分叉,算叉出去那一段长度
    return (d[a][c]+d[b][c]-d[a][b])/;
    } int main(){
    //freopen("owo.in","r",stdin);
    while(scanf("%d",&n)==&&n){
    memset(d,,sizeof(d));
    for (int i=; i<n; i++) for (int j=i+; j<=n; j++) { scanf("%d",&d[i][j]); d[j][i]=d[i][j]; }
    int ans=d[][];
    for (int i=; i<=n; i++) { //把每个点作为分叉加进来
    int ta=inf;
    for (int j=; j<=i; j++) for (int k=; k<=i; k++) if(k!=i&&j!=i&&j!=k) ta=min(ta, f(j,k,i) );
    ans+=ta;
    }
    printf("%d\n",ans);
    }
    return ;
    }

    ( ͡° ͜ʖ ͡°)

洛谷P2375 [NOI2014]动物园

  • 题意:构造一个num数组一一对于字符串SSS的前iii个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,

将这种字符串的数量记作num[i]

  • 算两个数组:
  • 第一个:jump[i]它第一个不重叠的公共前后缀的位置(类似于next[i],但是不允许前后缀有重叠)
  • 第二个:ta[i]对于下标i,它全部的公共前后缀的个数
  • 这两个数组都可以通过next[i]求得,然后num[i]就等于 ta[ jump[i] ] 辣。
  • 代码:
     #include <bits/stdc++.h>
    #define nmax 1000010
    #define mod 1000000007 using namespace std;
    typedef long long ll;
    char b[nmax];
    int num[nmax],ne[nmax],ta[nmax],jump[nmax];
    int l;
    ll ans; void init(){
    ans=;
    memset(num,,sizeof(num));
    memset(ne,,sizeof(ne));
    memset(ta,,sizeof(ta));
    memset(jump,,sizeof(jump));
    } void build(){
    for (int i=; i<=l; i++) {
    int j=ne[i-];
    while( b[j+]!=b[i] && j ) j=ne[j];
    if(b[j+]==b[i]) ne[i]=j+;
    }
    } void b2(){ //它第一个不重叠的公共前后缀的位置
    for (int i=; i<=l; i++) {
    int p=jump[i-];
    if( b[p+] == b[i] && (p+)<=(i/) ) jump[i]=p+;
    else {
    while ( p && ( (p+)>(i/) || b[p+]!=b[i] ) ) p=ne[p];
    if(b[p+]==b[i]) jump[i]=p+;
    }
    }
    } void solve(){
    int tmp;
    for (int i=; i<=l; i++) {
    int j=ne[i],pd=i/;
    if(j) ta[i]=ta[j]+;
    if( jump[i] ) tmp=ta[jump[i]]+; else tmp=;
    ans*=(tmp+);
    ans%=mod;
    }
    } int main(){
    int t;
    cin>>t;
    while(t--){
    init();
    scanf("%s",b+);
    l=strlen(b+);
    build();
    b2();
    solve();
    printf("%lld\n",ans);
    }
    return ;
    }

    ^3^

CF Round #581 (Div. 2)

  • 这道题。。。它给的p1,....,pn里面假设连续三个点 pk,p(k+1),p(k+2) 容易知道如果pk到p(k+2)的最短路是2的话p(k+1)是可以删去的
  • 于是愉快的扫一遍每次这样看三个。
  • 然后就wa6了
  • wa的原因:这里如果pk已经被删去了,是要影响到p(k+1)的。
  • 比如p1,p2,p3,p4,如果p2被删,p4,p2的最短路是2,会删3,但是如果p1p4的最短路是2.。。就删错了
  • 正确姿势:假设前面已经得到一连串p1~pk,现在最后得到的pk,然后往后面走,走到pj,如果p(j+1)和pk的距离和j+1-k相等的话,就可以把pj删了
  • 代码:
     #include <bits/stdc++.h>
    #define inf 1e6
    #define mmax 5000010 using namespace std;
    int n,m,ans=,idx=;
    int e[][];
    int p[mmax],del[mmax]={};
    char in[]; void floyd(){
    for(int k=;k<=n;k++) for(int i=;i<=n;i++) for(int j=;j<=n;j++)
    if(e[i][j]>e[i][k]+e[k][j] ) e[i][j]=e[i][k]+e[k][j];
    } int main(){
    cin>>n;
    for (int i=; i<=n; i++) {
    scanf("%s",in+);
    for (int j=; j<=n; j++) if(in[j]=='') e[i][j]=; else e[i][j]=inf;
    }
    floyd();
    for (int i=; i<=n; i++) e[i][i]=;
    cin>>m;
    scanf("%d%d",&p[],&p[]);
    if(m==){
    printf("2\n");
    printf("%d %d\n",p[],p[]);
    }else{
    for (int i=; i<m; i++) {
    scanf("%d",&p[i]);
    if( e[ p[idx] ][ p[i] ]>=i-idx ) {
    ans++;
    del[i-]=;
    }else idx=i-;
    } printf("%d\n",m-ans);
    for (int i=; i<m; i++) if(!del[i]) printf("%d ",p[i]);
    cout<<endl;
    }
    return ;
    }

    嘤雄不朽+1s

UVALive - 3902

  • vjudge上的地址     https://vjudge.net/problem/UVALive-3902

  • 容易想到的贪心,就是对于每个叶子节点,把服务器的复制放在尽量离他远的地方。
  • 但是就算是用了上面一种贪心策略还是会有很多种放置♂方式
  • 然后又贪心,从深度♂比较大的客户端开始考虑
  • 代码:
     #include <bits/stdc++.h>
    #define nmax 1100 using namespace std;
    int cas,k,n,ina,inb,s;
    vector <int> g[nmax];
    int vis[nmax]={},fa[nmax]={};
    struct node{
    int d,u;
    bool operator < (const node a){ return a.d<d; }
    }x[nmax]; void dfs1(int u){ //以s为根拉树,然后处理出每个点的父亲
    for (int i=; i<g[u].size(); i++) {
    int v=g[u][i];
    if(fa[v]==) { fa[v]=u; x[v].d=x[u].d+; dfs1(v); }
    }
    } void dfs(int f,int u,int dep){ //给某个服务器服务到的点标1
    vis[u]=;
    if(dep==k) return;
    for (int i=; i<g[u].size(); i++) if(g[u][i]!=f) dfs(u,g[u][i],dep+);
    } int main(){
    cin>>cas;
    while(cas--){
    memset(vis,,sizeof(vis));
    memset(fa,,sizeof(fa));
    scanf("%d%d%d",&n,&s,&k);
    x[s].d=;
    for (int i=; i<=n; i++) { x[i].u=i; g[i].clear(); }
    for (int i=; i<n; i++) {
    scanf("%d%d",&ina,&inb);
    g[ina].push_back(inb);
    g[inb].push_back(ina);
    }
    fa[s]=s;
    dfs1(s);
    sort(x+,x+n+);
    dfs(s,s,);
    int ans=;
    for (int i=; i<=n; i++) {
    int u=x[i].u;
    if( g[u].size()> || vis[u] ) continue;
    int v=u;
    for (int i=; i<k; i++) v=fa[v];
    dfs(v,v,);
    ans++;
    }
    printf("%d\n",ans);
    }
    return ;
    }

    嘤年早逝

辣些数据结构的思维题(思维题好难一个都不会TAT)的更多相关文章

  1. 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...

  2. PMP全真模拟题真题試題含答案解析 2019年下半年PMP考試适用 PMP中文文对照试题 【香港台灣地區PMP考試也可用】

    PMP全真模拟题真题试题 含答案解析 2019年下半年PMP考试适用 PMP中文文对照试题 [香港台灣地區PMP考試也可用]PMP全真模擬題真題試題 含答案解析 2019年下半年PMP考試适用 PMP ...

  3. 包含min函数的栈 【微软面试100题 第二题】

    题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 参考题目:剑指offer第21题. 题目分析: 1. ...

  4. Web前端错题模糊题记录

    title: Web前端错题模糊题记录 toc: true date: 2018-09-20 10:04:36 categories: Web tags: HTML CSS JavaScript HT ...

  5. Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL

    没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...

  6. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

    Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...

  7. 产品思维&技术思维&工程思维

    产品思维 产品思维的起源是用户(或客户)价值.用户价值是通过技术手段以产品或服务的形态去解决用户的痛点,或带去爽点.毫无疑问,工程师在日常工作中应时刻关注并理清自己的工作与用户(或客户)价值的联系,并 ...

  8. Educational Codeforces Round 12补题 经典题 再次爆零

    发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...

  9. 剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2. 思路和方法 利用辅助栈来存储现有栈的最小值.在入栈和出栈的时候将现有栈和最小 ...

随机推荐

  1. Lambda如何实现条件去重distinct List,如何实现条件分组groupBy List

    条件去重 我们知道, Java8 lambda自带的去重为 distinct 方法, 但是只能过滤整体对象, 不能实现对象里的某个值进行判定去重, 比如: List<Integer> nu ...

  2. 关于广州xx公司对驰骋BPM, 流程引擎表单引擎 常见问题解答

    关于广州xx公司对驰骋BPM, 流程引擎表单引擎 常见问题解答 @驰骋工作流,ccflow周朋 周总早, ccflow 功能很强大,在体验过程中,以下几个问题需沟通下: 先使用.net 再使用java ...

  3. 在centos7.x环境中SQL Server附加数据库

    第一步,准备好windows与Linux之间文件传递的工具,下载并安装 https://winscp.net/eng/download.php 第二步,把本地的数据库文件拷贝一份,放到别的文件夹中,因 ...

  4. linux 基础入门(9) 系统服务 systemctl 与 xinted的运用

    9.系统服务 9.1系统服务 可以把计算机理解为一个地点比如中关村大街系统服务理解为中关村大街的理发店.饭店.商场等等,每一个都是一个系统服务,为客户提供不同内容的服务 服务:常驻在内存中的程序,且可 ...

  5. Linux系统开机显示BusyBox v1.22.1 built-in shell(ash) 解决方法

    BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件.BusyBox 包含了一些简单的工具,例如ls.cat和echo等等,还包含了一些更大.更复杂的工具,例grep.find.mou ...

  6. 使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

    一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的 ...

  7. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  8. nginx 反向代理及 https 证书配置

    nginx 反向代理及 https 证书配置 author: yunqimg(ccxtcxx0) 1. 编译安装nginx 从官网下载 nginx源码, 并编译安装. ./configure --pr ...

  9. H5_0024:对于事先无法确定css大小的情况,可以通过JS动态修改

            $(function(){             function Heights(){                 var WinH = $(window).height(); ...

  10. CentOS8中进行IP和主机名的网络配置的过程图解

    摘要: 很多人不知道如何在字符界面下配置主机名和ip,所以写了这个文章,本人也是新手,希望指出错误与不足.(本文只是在字符界面下教程) 一.输入你的账号密码登录 1)ifconfig 查看你目前的 主 ...