20160813上午训练记录

*五道题眼镜都花了

T1:

【题意】给定一个字符串,删除后缀的ly,er,ing一次

【题解】。。。

T2

【题意】给定1g,2g,3g,5g,10g,20g的砝码若干个,总重量<=10^5,求能称出多少质量

【题解】。。。

T2

【题意】

【题解】

60分n^4暴力dp:

#define mod 1000000007
int n,m,k,map[777][777],f[777][777];
int main(){
    FO(hopscotch);
    n=gi;m=gi;k=gi;FOR1(i,n)FOR1(j,m)map[i][j]=gi;
    f[1][1]=1;
    FOR1(i,n){
        FOR1(j,m){
//            printf("(%d,%d):",i,j);
            FOR0(l,i)FOR0(r,j)if(map[l][r]!=map[i][j]){
//                if(l&&r)printf("(%d,%d) ",l,r);
                f[i][j]=(f[i][j]+f[l][r])%mod;
            }
//            puts("");
        }
    }
//    FOR1(i,n){//
//        FOR1(j,m){
//            printf("%d ",f[i][j]);
//        }puts("");
//    }
    printf("%d",f[n][m]);
    return 0;
}

正解

czyz的机房的格局,是和别处不同的….
孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说,“对呀对呀!……这题有三样写法,你知道么?”
首先很显然二维线段树,动态的开点是可以做的
那么用平衡树维护也是可以得
正解其实是cdq分治,但是我不会cdq分治
 
T4
【题意】
给定一颗都是字母的树,问是否存在一条链等于给定字符串
【题解】
数据范围非常的有趣,考虑一个枚举起点bfs的暴力。分类讨论一下

对于 20% 的数据,N ≤ 1000。 
对于另外 20% 的数据,N ≤ 10^4 ,且树上有且仅有一种字母。
期望复杂度O(n)
对于另外 30% 的数据,N ≤ 10^4 ,且树随机生成。
期望复杂度O(nlogn)
对于另外 30% 的数据,N ≤ 10^4 ,且树上的字母随机生成。
期望复杂度O(n^2/26/2)
然而其实最后这个挺虚的,所以我们看起点和终点的个数,哪个少从哪个开始bfs

然后就过了

struct edge{
    int to,next;
}e[23333];int cnt,last[10005];
char ch[10005],tgt[10005];int f[10005][20],dep[10005];
void link(int a,int b){
    e[++cnt]=(edge){b,last[a]};last[a]=cnt;
    e[++cnt]=(edge){a,last[b]};last[b]=cnt;
}
struct data{
    int a,fa,d;
};
int n,m,_ds,_es,ds[10001],es[10001];
bool bfs(int s){
    queue<data>q;
    q.push((data){s,-1,1});
    while(!q.empty()){
        data c=q.front();q.pop();
        for(int i=last[c.a];i;i=e[i].next){
            if(e[i].to!=c.fa){
//                printf("from %d to %d\n",c.a,e[i].to);
                if(ch[e[i].to]==tgt[c.d+1]){
                    q.push((data){e[i].to,c.a,c.d+1});
//                dep[e[i].to]=dep[c.first]+1;
                    if(c.d+1==m)return true;
                }
            }
        }
    }
    return false;
}
bool diff(char str[]){
    int t=strlen(str+1);
    FOR1(i,t)if(i^1&&str[i]^str[i-1])return true;
    return false;
}

void bfs1(){
}
void luangao(){

}
int main(){
    FO(alphabet);
    int T=gi;
    FOR1(_,T){
        int n=gi;bool flag=false;
        memset(last,0,sizeof(last));cnt=0;
        FOR1(i,n-1){
            int u,v;u=gi;v=gi;
            link(u,v);
        }
//        bfs(1);
        scanf("%s",ch+1);
        scanf("%s",tgt+1);
        n=strlen(ch+1),m=strlen(tgt+1);
        _ds=0;_es=0;
//        if(diff(tgt)){
            FOR1(i,n){
                if(ch[i]==tgt[1])ds[++_ds]=i;
                if(ch[i]==tgt[m])es[++_es]=i;
            }
            if(_ds<=_es){
                FOR1(l,_ds){
    //                cout<<ds[l]<<endl;
                    if(bfs(ds[l])){
                        flag=true;
                        break;
                    }
                }
            }
            else{
                FOR1(i,m/2)swap(tgt[i],tgt[m-i+1]);
                FOR1(i,_es)
//                cout<<ds[l]<<endl;
                if(bfs(es[i])){
                    flag=true;
                    break;
                }
            }
            printf("Case #%d: %s\n",_,flag?"Find":"Impossible");
//            puts("-------------");
//        }else{

//            luangao();
//    .    }
    }
    return 0;
}

那两个空的函数啊。。是本来特判所有字符都一样的数据,不知道怎么没了

T5

【题意】给定一个n*m的非负矩阵,求左上角到右下角路径上值得方差*(n+m-1)最小

【题解】

考虑一个dp,表示(1,1)到(i,j)平均值为k最小的方差,然后挺好的转移的

但是空间不够优秀。

我们考虑要最小化的是这个式子

那么首先可以发现S是平均值的时候最小。

展开他

如果*(n+m-1),可以枚举最后一项,dp前两项

然后就可以求出答案了

为什么可以枚举和呢?因为非法的和的答案不会比恰好是的小

int n,m,a[33][33],f[33][33],ans=0x7fffffff;
int main(){
    FO(route);
    n=gi;m=gi;
    FOR1(i,n)FOR1(j,m)a[i][j]=gi;
    FOR0(sum,(n+m-1)*30+1){
        memset(f,0,sizeof(f));
        FOR1(i,n)FOR1(j,m){
            if(i==1)f[i][j]=f[i][j-1];
            else if(j==1)f[i][j]=f[i-1][j];
            else f[i][j]=min(f[i][j-1],f[i-1][j]);
            int x=a[i][j];
            f[i][j]+=x*x*(n+m-1)-x*sum*2;
        }
        ans=min(ans,f[n][m]+sum*sum);
    }
    cout<<ans;
    return 0;
}
时间: 2024-12-09 20:10:16

20160813上午训练记录的相关文章

20160813下午训练记录

*下午听说讲课很简单,被拉去隔壁做只可口胡 不可写的题了 T1 江苏省选的时候有道题面差不多的题目,邵战狂当时跟我口胡过这题 我们还是先不考虑1 那么我们选取一个元素,当加入第二个的时候,两个的奇偶性不同,加入第三个数时,肯定不满足. 那么我们特判一下1的数目,然后乱搞一下 int n,a[1234]; bool np[33333333]; int tot,pr[8001234]; const int N=30000000; void sieve(){ for(int i=2;i<=N;i++)

斜率优化系列——训练记录

斜率优化训练记录 前言 斜率优化一般用于优化dp的转移,借着训练斜率优化的相关问题来提升一些DP思维.选择老学长留下的专题场来练手,由于该场题数较多,以及个人不太愿意长时间进行单一专题训练,因此开此文来记录断续的训练结果和心得. 记录 题一 由一道简单入门题玩具装箱开头,题意和思路比较简单就不讲了. 代码 #include<bits/stdc++.h> #define dd(x) cout<<#x<<" = "<<x<<&qu

NOI前训练记录

从今年年初开始就没怎么碰oi,学了三个月文化课,然后就是省选到处跑(浪),进了省队后又去北京打(浪)了波(七)铁(天),回家后又生了一星期病,感觉自己noi凉透了... ctsc因为运气的原因有人放弃D3自己才拿到au,apio什么牌都没拿到,自己这么菜的主要原因可能还是没怎么做题吧,五个月不碰oi,已经连dfs都不会了,还有两个月就noi了,再不训练又要为JS丢脸了,自己拿不到au却占了个省队名额,而阿老师邀请赛冠军的水平却没进省队,感觉自己不珍惜这个省队名额真的是说不过去 本文就记录一下本人

Dailight 训练记录

现场赛记录 19 CCPC 湘潭邀请赛  11/Gold 19 ICPC 西安邀请赛 49/Silver 训练规划: hl: 1.深入增强图论,数据结构的能力,包括但不限于树形dp,点分治,多写dp,学习斜率优化,四边形优化 2.保证银牌及以下图论,数据结构,dp的通过率,最好可以在十分钟内出思路 3.养成提交前检查代码的习惯,不出现傻逼错误. 4.学习简单数论(逆元,组合数),尤其是数论结合图论的应用 gbs: 1.加快上机 ->  写完代码过样例 这一过程的速度. 2.减少debug占用机时

二分暑假专题 训练记录 2017-7-29

POJ3258-River Hopscotch 题意: 给你区间[0,L]给你n个石头,然后去除m个石头  最大化 石头间最小的距离 思路: 首先0和L 这两个石头是不可以动的   然后用 s 数组记录 整个区间的石头 然后排序  此时石头的排序就是有序的了  然后二分套模板 接着check函数才是最关键的好的把 从0到 n+1-m   总共就有 n+2-m 个石头了 而由于第0个石头不可以动 , 所以从第一个开始动 同时判断条件是 s[cur] - s[last] < d 而不是 <= #i

dp暑假专题 训练记录

A 回文串的最小划分 题意:给出长度不超过1000的字符串,把它分割成若干个回文字串,求能分成的最少字串数. #include <iostream> #include <cstdio> #include <string.h> #include <string> using namespace std; const int mod = 1e9 + 7; const int maxn = 1000 + 5; const int INF = 0x3f3f3f3f;

训练记录PART1

11/05 bestcoder #93 C 等价于给出很多环,等概率选择N个点,收益为出现过点的环的环长lcm.不同的环只有 \(\sqrt {26}=6\) 个,用\(f_S\)表示点出现在状态为S的那些环里的选取总数,DP一下即可. bestcoder #93 D 考虑meet in the middle.推一下式子,设左侧选的数和为\(A_{left}t\),两两乘积之和为\(B_{left}\),那么满足\(B_{left}+B_{right}+A_{left}*A_{right}>=0

20160819训练记录

T1 给定一个序列 ,在第i时刻位置左边插入一个数i 求最后的序列 [题解]倒着做..插入的位置是左边有空格的位置 用线段树维护一下单点修改 线段树写的优雅一点 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int p,f[4444444],g[4444444],ans[4444444]; int find(int i,int l,int r,int x){ f[

20160818训练记录

T1 "开心题" 每个点如果不是根节点,子树个数等于度数减一.然后随便算一算 T2 数据范围   首先对于两个长度相等的偶数串.把他两两分组 1 2 3 4 5 6 7 8 考虑一个和8相等的(包括交换内部后)的块 先把他调到头部然后调到尾部.然后删除这一块 然后发现这样的可以对每个串求出字典序最小的等价表达..其实随便计算一下就解决了 #include<cstdio> #include<string.h> #include<iostream> #i