JSZX Winter Camp Day 3 爆零记

emmmm蒟蒻的我爆零啦!!T1码了个dijikstra然后T了,正解为Floyd。T2蒟蒻并不会,唯一会的只有暴力。。T3写了个Trie然后MLE了,然而正解是

哈希。T4是蒟蒻唯一一道会的,然而却忘了开long long。手动GG。。

<T1>

题意:在一个有向图中,求从指定起点到指定终点的最小值,最小值定义为路径上的边权和减去路径上点权的最小值。

超时代码:

#include<cstdio>
#include<algorithm>
#define maxn 300
#define inf 2e9
using namespace std;
int vis[maxn],head[maxn],tot,n,m,w[maxn];
struct DIS{
    int juli,minn;
}dis[maxn];
int read(){
    int w=0,f=1;char c=getchar();
    while(c<‘0‘||c>‘9‘) if(c==‘-‘) f=-1,c=getchar();
    while(c>=‘0‘&&c<=‘9‘) w=w*10+c-48,c=getchar();;
    return w*f;
}
struct Edge{
    int to,next,v;
}e[200050];
void add(int x,int y,int v){
    e[++tot]=(Edge){y,head[x],v};head[x]=tot;
}
void dijk(int s){
    int i,j;
    for(i=1;i<=n;i++) if(w[i]==-1) vis[i]=true;
//    printf("w:%d vis:%d\n",w[2],vis[2]);
    for( i=head[s];i;i=e[i].next){
        if(!vis[e[i].to]) dis[e[i].to].juli=e[i].v-min(w[e[i].to],w[s]),dis[e[i].to].minn=min(w[e[i].to],w[s]);
    }
    for(i=1;i<=n;i++){
        int mi=inf,k;
        for(j=1;j<=n;j++){
            if(!vis[j]&&dis[j].juli<mi) mi=dis[j].juli,k=j;
        }
//        printf("k:%d   vis[2]:%d\n",k,vis[2]);
        vis[k]=true;
        for(j=head[k];j;j=e[j].next){
            if(!vis[e[j].to]&&(mi+e[j].v-min(w[e[j].to],dis[e[j].to].minn)+dis[e[j].to].minn)<dis[e[j].to].juli)
            dis[e[j].to].juli=mi+e[j].v-min(w[e[j].to],dis[e[j].to].minn)+dis[e[j].to].minn,dis[e[j].to].minn=min(dis[e[j].to].minn,w[e[j].to]);
        }

    }
}
int main(){
    freopen("T1_.in","r",stdin);
    freopen("T1_.out","w",stdout);
int i,x,y,v,q,s,t;
    n=read();m=read();
    for(i=1;i<=n;i++){
        w[i]=read();
    }
    for(i=1;i<=m;i++){
        x=read();y=read();v=read();
        add(x,y,v);add(y,x,v);
    }
    q=read();
    while(q--){
        s=read();t=read();
        if(w[s]==-1||w[t]==-1){
            printf("mon panache!\n");continue;
        }
        for(i=1;i<=n;i++) dis[i].juli=inf;
//        printf("1");
        for(i=1;i<=n;i++) vis[i]=false;
        dijk(s);
        if(dis[t].juli==inf) printf("mon panache!\n");
        else printf("%d\n",dis[t]);
//        printf("1");
    }
    return 0;
}

T1

正解(某大神):

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=233+23;
struct zs{int v,id;}a[maxn];
ll dis[maxn][maxn],ans[maxn][maxn];
int id[maxn];
int i,j,k,n,m;

int ra,fh;char rx;
inline int read(){
    rx=getchar(),ra=0,fh=1;
    while(rx<‘0‘)rx==‘-‘&&(fh=-1),rx=getchar();
    while(rx>=‘0‘)ra=ra*10+rx-48,rx=getchar();return ra*fh;
}

inline ll min(ll a,ll b){return a<b?a:b;}
bool operator <(zs a,zs b){return a.v<b.v;}
int main(){
    freopen("T1_.in","r",stdin);
    freopen("T1_.out","w",stdout);
    n=read(),m=read();
    for(i=1;i<=n;i++)a[i].v=read(),a[i].id=i;
    sort(a+1,a+1+n);
    for(i=1;i<=n;i++)id[a[i].id]=i;

    memset(dis,10,sizeof(dis)),memset(ans,10,sizeof(ans));;
    for(i=1;i<=m;i++)j=id[read()],k=id[read()],dis[k][j]=dis[j][k]=min(dis[j][k],read());

    for(k=n;k;k--)if(a[k].v>-1)
        for(i=1;i<=n;i++)for(j=1;j<=n;j++)
            dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]),
            ans[i][j]=min(ans[i][j],dis[i][j]-a[k].v);
    int q=read();
    while(q--){
        i=id[read()],j=id[read()];
        if(ans[i][j]<=1e17)printf("%lld\n",ans[i][j]);else puts("mon panache!");
    }
}

T1

<T2>

题意:求I字形的最大面积,规定I字形,分为三个矩形,第二个矩形一定比另外两个窄。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=205;
const int inf=1002333;
int f[2][3][maxn][maxn];
int sm[maxn][maxn],mx1[maxn][maxn],mx2[maxn][maxn];
int n,m,pre,now,ans,tmpmx;

int ra;char rx;
inline int read(){
    rx=getchar(),ra=0;
    while(rx<‘0‘||rx>‘9‘)rx=getchar();
    while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra;
}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
char rs[233];
int main(){
    freopen("T6_.in","r",stdin);
    freopen("T6_.out","w",stdout);
    register int i,j,k;
    n=read(),m=read();
    for(i=1;i<=n;i++){
        scanf("%s",rs+1);
        for(j=1;j<=m;j++)sm[i][j]=sm[i][j-1]+(rs[j]==‘1‘);
    }
    for(i=1;i<=m;i++)sm[0][i]=i;

    now=1,pre=0;
    for(i=1;i<=2;i++)memset(f[0][i],200,sizeof(f[0][i]));
    for(i=1;i<=n;i++,swap(now,pre)){
        for(j=1;j<m;j++)for(k=j+1;k<=m;k++)
            if(sm[i][k]==sm[i][j-1])
                f[now][0][j][k]=(sm[i-1][k]==sm[i-1][j-1]?f[pre][0][j][k]:0)+k-j+1;
            else f[now][0][j][k]=-inf;

        for(j=1;j<m;j++)for(k=m,tmpmx=-inf;k>j;k--)
            tmpmx=max(tmpmx,f[pre][0][j][k]),
            mx1[j][k]=max(mx1[j-1][k],tmpmx);
        for(j=2;j<m;j++)for(k=j;k<m;k++)
            if(sm[i][k]==sm[i][j-1]){
                f[now][1][j][k]=f[pre][1][j][k]+k-j+1;
                if(sm[i-1][k+1]==sm[i-1][j-2])
                    f[now][1][j][k]=max(f[now][1][j][k],mx1[j-1][k+1]+k-j+1);
            }
            else f[now][1][j][k]=-inf;

        for(j=2;j<m;j++)mx2[j][j]=f[pre][1][j][j];
        for(j=1;j<m;j++)
            for(k=2;k<m-j;k++)
            mx2[k][k+j]=max(mx2[k][k+j-1],max(mx2[k+1][k+j],f[pre][1][k][k+j]));

        for(j=1;j<m;j++)for(k=j+2;k<=m;k++){
            if(sm[i][k]==sm[i][j-1])
                f[now][2][j][k]=max(f[pre][2][j][k],mx2[j+1][k-1])+k-j+1;
            else f[now][2][j][k]=-inf;
            if(f[now][2][j][k]>ans)ans=f[now][2][j][k];
        }
    }
    printf("%d\n",ans);
    return 0;
}

T2

<T3>

题意:求最多有几对字符串相匹配,A与T配,G与C配。

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
const int maxn=1e5+233,modd=2333333;
struct zs{ull v;int pre,rest;}e[maxn];int tot,last[modd];
char s[maxn];
int i,j,k,n,m;

int ra,fh;char rx;
inline int read(){
    rx=getchar(),ra=0,fh=1;
    while(rx<‘0‘)rx==‘-‘&&(fh=-1),rx=getchar();
    while(rx>=‘0‘)ra=ra*10+rx-48,rx=getchar();return ra*fh;
}

inline bool tryget(ull v){
    int x=v%modd,i;
    for(i=last[x];i&&e[i].v!=v;i=e[i].pre);
    return (i&&e[i].rest)?(e[i].rest--,1):0;
}
inline void ins(ull v){
    int x=v%modd,i;
    for(i=last[x];i&&e[i].v!=v;i=e[i].pre);
    if(i)e[i].rest++;else e[++tot].v=v,e[tot].rest=1,e[tot].pre=last[x],last[x]=tot;
}
int mp1[255];
int main(){
    freopen("T8_.in","r",stdin);
    freopen("T8_.out","w",stdout);
    n=read();
    mp1[‘A‘]=0,mp1[‘T‘]=1,mp1[‘C‘]=2,mp1[‘G‘]=3;
    int ans=0;
    for(i=1;i<=n;i++){
        scanf("%s",s+1);
        ull h1=0,h2=0;int len=strlen(s+1),ch;
        for(j=1;j<=len;j++)
            ch=mp1[(int)s[j]],
            h1=h1*2333+ch+1,h2=h2*2333+(ch^1)+1;
        if(tryget(h2))ans++;else ins(h1);
    }printf("%d\n",ans);
}

T 3

<T4>

蒟蒻忘了开long long 啊!!

解法:从任意一点出发找到离他最远的点,那么找到的这个点必然为树的直径的某一端点,顺着这个端点我们就能找到直径的令一个端点,

那么树上所有点到其他点的距离必然是到直径的某个端点的距离,那么分别DFS直径的两个端点,每个点到直径两个端点的距离取个max值即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 100050
using namespace std;
#define int long long
int tot,n,dp[maxn],head[maxn],maxlen,len,fan;
int read(){
    int w=0,f=1;char c=getchar();
    while(c<‘0‘||c>‘9‘) if(c==‘-‘) f=-1,c=getchar();
    while(c>=‘0‘&&c<=‘9‘) w=w*10+c-48,c=getchar();;
    return w*f;
}
struct Edge{
    int to,next,v;
}e[200050];
void add(int x,int y,int v){
    e[++tot]=(Edge){y,head[x],v};head[x]=tot;
}
void dfs(int x,int fa,int len){
    if(len>maxlen) maxlen=len,fan=x;
    for(int i=head[x];i;i=e[i].next){
        if(e[i].to!=fa){
            dfs(e[i].to,x,len+e[i].v);
            dp[e[i].to]=max(dp[e[i].to],len+e[i].v);
        }
    }
}
#undef int
int main(){
    #define int long long
    freopen("T3_.in","r",stdin);
    freopen("T3_.out","w",stdout);
    int i,x,v;
    n=read();
    for(i=1;i<=n;i++){
        x=read();v=read();add(i,x,v);add(x,i,v);
    }
    memset(dp,0,sizeof(dp));
    dfs(1,-1,0);
    dfs(fan,-1,0);
    dfs(fan,-1,0);
//    dfs(fan,-1,0);
//    dfs(fan,-1,0);
//    dfs(fan,-1,0);
//    dfs(fan,-1,0);
//    dfs(fan,-1,0);
//    dfs(fan,-1,0);
    for(i=1;i<=n;i++)
    printf("%lld\n",dp[i]);
    fclose(stdin);fclose(stdout);
    return 0;
}

T4

原文地址:https://www.cnblogs.com/Fish-/p/8394829.html

时间: 2024-10-07 22:39:44

JSZX Winter Camp Day 3 爆零记的相关文章

长沙集训day4(总结)(爆零记)

长沙爆零记QAQ话不多说直接进入正题: t1:淘淘的苹果(一看t2导弹拦截????t3校门外的树???哎呦哇擦,再一看题目,哦........我想多了) 第一题呢:陶陶==淘淘要去摘苹果,他的手不能弯((一脸懵逼)一看数据手贼长....)因为有的苹果太高 所以他要去拿凳子,但他太懒只想那m个凳子(你说这人想吃苹果还怕懒可怕可怕.....),所以说让你选出m个凳子 可以使他拿到最多的苹果. 思路:当时想的是区间DP,想了想,直接用结构体a[i].l和a[i].r存凳子的区间加上他的手的高度0.0

CTSC2016&amp;&amp;APIO2016爆零记

CTSC2016&&APIO2016爆零记 前言:人生第一次写(骗)爆(访)零(问)记(量),心里还是有点小激动呢.不过由于本文作者语文水平低下,如果发现用词不当或只会记流水账,请谅解. CTSC Day0: CCF大发慈悲让我们入住了5星级酒店昆(百)泰酒店. 不过也有一点不兹磁的地方,就是酒店离学校大概要步行半个小时,对于我这种懒人大概是天大的灾难吧(雾).于是这次比赛就强行变成了CTSC&&APIO远足营. 第一次看见70块钱一瓶零下八度不结冰的矿泉水,然而家穷喝不起

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals)爆零记

昨晚一个瓜皮说今晚有cf,听说是晚间场,我瞅了一眼,娃,VK Cup,上分的好机会,看着比赛时间就有点心酸了,0:35,当时一直在纠结要不要打的问题,当时想着应该不难吧,要不打一下吧,要不还是看看题先,如果容易就打,难的话就不打了好的吧!于是就这样愉快的决定了.......cf日常延时10分钟,0:45,要不要去睡觉啊,干脆先睡一觉好了,然后又是忍不住诱惑在等待开始! 比赛一开始,瞅了一眼A,这不是一道水题嘛,直接敲啊,然后1分钟就搞定了,交了就过了,B题直接求边界点就好了,扫了一遍就过了,C题

STOI爆零记~

又是一年stoi,回想起去年stoi爆零的事还历历在目,仿佛就在昨天,去年爆零的感觉好像现在还感受得到.. 其实今年stoi我没有给自己太大pressure,目标就是能进市队就好了..(结果还是考挂并且被初一神虐的渣..) 感觉自己很早就到了山区学校(金中..),没想到来的时候基本各位dalao都到了,不管怎样先orz,rp++. 在金中校门口背了一下模板(spfa,树状数组,高精度...等等),然后惊奇地发现今年竟然有两位龙实的dalao,顿时感觉自己地位难保.. 7:50进去,到机房门口..

GDOI爆零记...

GDOI 2017... 4.28-5.2(4.29-4.30)... DAY 0 爆零稳... 9点-15点的车程... 晕车不想写作业,所以在动车上和PYZ一起颓废... 酒店还算可以,应该比NOIP时好...毕竟这是酒店... 和PYZ同个房间,rp++... 晚餐跑去东华中学...东华中学真心大(似乎一个年级五十多个班...)(不解为什么吃个晚饭要去这么远...) 食堂的菜肯定比JS好... 坐了一天的车,头特别晕... 颓废了一个晚上,十二点多,睡觉... DAY 1 睡了六个小时,被

GDKOI2016 爆零记

滚粗了非常伤心>_< day 0 老师通知能够去试机,于是非常愉快地将近三点半左右的时间到了二中.然后发现老师已经准备关机房了,说我怎么才来.. .喂喂喂不是说三点半到五点的么 晚上本来想背背板子.可是被某BOI鬼畜题给卡了几个小时= =.. .官网又被墙了Github上的数据又不会下载. ..于是整个晚上基本就又废掉啦... 期间和同学们在学校的群上讨论了一下一些"我不会的算法",然后又用了一些"通俗易懂的方式"讲了讲怎么用别的东西干相同的事情. ..

gdoi2017爆零记

前言 这次gdoi,用三个词来形容我:爆零+爆零+爆零.本来还希望能在gdoi搞个小新闻(拿个一等然后进Day3什么的). Day0 这次gdoi是在东莞东华中学,坐个动车下午3点多就到了,然后打个滴滴去酒店(本来想跟着几位神犇去ingress,然而酒店旁边一个Portal都没有),.17:00去吃饭,结果--司机:你们有谁知道去东华中学的路吗(一脸懵逼)?东华中学实在是太**大了,一个中学占了一整条街,还是一侧初中部,一侧小学部+高中部(听说他们一个年级有50+个班,每个班抽一个学生出来都能占

[HNOI2018]爆零记

Day 0 完全不知道做什么. 打了一个splay板子,还没调出来emmmmm 不想做题目,最后做的一题是[HNOI2016]的超(sha)难(bi)题网络. 当我希望省选能出一下树剖时,旁边的大佬跟我说,树剖太简单了,不会出qwqQAQ. 然后下午见到了ylx(redbag)大佬,%%%%%%果然是个巨佬,还长的挺好看的 请巨佬yzk和巨佬ylx吃了顿饭,问题是最后还掉了100,穷了qwq ylx巨佬奶了一口网络流 我奶了字符串,yzk奶了线性基 然而最后好像都没考????(反正我没看出来)

长沙集训day3(总结)(爆零记)

昨天晚上打了打codeforce,睡的比较晚,早上七点三十才起0.0  没有找到今天题的ppt,就先不弄图片了. t1: 题目大概就是一个有许多脚的东西,每个脚都有他的初始位置和他的速度,每一次后面的脚超过前面的脚都会发生一次碰撞, 让你求出都有那个脚超过那个脚了.然后发生超越和被超越的脚组成两个集合A,B.然后随机在A和B中选两个数相乘,求出第K打的 那个数. 一看数据10%的都是n>5000,一看数据这么大怎么搞??? 到了考一半了,他才来说数据印错了,是n>500,哇,这么搞笑吗? 所以