2019 ICPC南昌邀请赛比赛过程及题解

解题过程



中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了。然后lfw读完M题(shl的电脑终于打开了,然后输入密码,密码错误。。。自闭),说AC 自动机板题,然后找板子,,,突然发现自己读错题目。后来不知道怎么A的。shl copy了一遍密码终于登上账号。然后lfw一个人用单调栈A掉了I题;byf 秒了H题;

shl和byf读j题,读完吧题意告诉lfw,lfw说水题,然后树链剖分加线段树离线就过了。同时byf在想K题,然后推出式子,利用前缀和就过了(听说好多对TLE了,应该没用前缀和维护);然后还有一个多小时,,,shl和byf看D题,lfw看C题,然后shl和byf没啥想法,lfw调C调了一万年,最后也没过。。。这场每一题都是一下就过了,罚时较少。(这场shl全场OB,没碰键盘,状态极差...)


题解



先放代码,题解后面更新。

A. PERFECT NUMBER PROBLEM

#include<bits/stdc++.h>
using namespace std;
int main()
{
    printf("6\n");
    printf("28\n");
    printf("496\n");
    printf("8128\n");
    printf("33550336\n");
    return 0;
}

B. Greedy HOUHO

Unsolved.

C. Angry FFF Party

Unsolved.

D. Match Stick Game

Unsolved.

E. Card Game

Unsolved.

F. Information Transmitting

Unsolved.

G. tsy‘s number

Unsolved.

H. Coloring Game

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int quick_pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int32_t main()
{
    int n;
    scanf("%lld",&n);
    if(n==1) {printf("1\n");return 0;}
    printf("%lld\n",2*2*quick_pow(3,n-2)%mod);
    return 0;
}

I. Max answer

#include<bits/stdc++.h>
#define maxl 500010
using namespace std;

int n,top,lg;
long long ans=0;
long long s[maxl];
long long a[maxl],sum[maxl],dol[maxl],dor[maxl];
long long mini[20][maxl],mx[20][maxl];
map <long long,int> mp;
map <long long,int> :: iterator it;

inline void prework()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
    top=0;int l=0,r=0;
    while(l<=n && r<=n)
    {
        while(a[l]<=0 && l<=n)
            l++;
        if(a[l]>0)
        {
            r=l;
            while(a[r+1]>0)
                r++;
            top=0;s[0]=l-1;
            for(int i=l;i<=r;i++)
            {
                while(top>0 && a[i]<a[s[top]])
                {
                    dor[s[top]]=i;
                    top--;
                }
                s[++top]=i;dol[i]=s[top-1];
            }
            while(top>0)
                dor[s[top]]=r+1,top--;
            for(int i=l;i<=r;i++)
                ans=max(ans,(sum[dor[i]-1]-sum[dol[i]])*a[i]);
        }
        else r=l;
        l=r+1;
    }
}

inline void mainwork()
{
    int lg=log2(n),t;
    for(int i=0;i<=n;i++)
        mx[0][i]=mini[0][i]=sum[i];
    for(int i=1;i<=lg;i++)
        for(int j=0;j<=n;j++)
        {
            mx[i][j]=max(mx[i-1][j],mx[i-1][j+(1<<(i-1))]);
            mini[i][j]=min(mini[i-1][j],mini[i-1][j+(1<<(i-1))]);
        }
    long long mxx,mii;
    for(int i=1;i<=n;i++)
    if(a[i]<0)
    {
        t=log2(i-0+1);
        mxx=max(mx[t][0],mx[t][i-(1<<t)+1]);
        t=log2(n-i+1);
        mii=min(mini[t][i],mini[t][n-(1<<t)+1]);
        ans=max((mii-mxx)*a[i],ans);
    }
}

inline void print()
{
    printf("%lld",ans);
}

int main()
{
    prework();
    mainwork();
    print();
    return 0;
}

J. Distance on the tree

#include<bits/stdc++.h>
#define maxl 200010
#define inf 2000000001
using namespace std;

int n,nn,q,cnt=0,nodecnt=0,num=0;
int a[maxl],dep[maxl],tot[maxl],son[maxl],top[maxl],fa[maxl],ehead[maxl];
int idx[maxl],dy[maxl],ans[maxl];
struct ed
{
    int to,nxt;
}e[maxl<<1];
struct node
{
    int l,r,sum;
}tree[maxl<<2];
struct qu
{
    int u,v,w,id;
}que[maxl],edg[maxl<<1];
char ch[maxl];

inline void adde(int u,int v)
{
    e[++cnt].to=v;e[cnt].nxt=ehead[u];ehead[u]=cnt;
}

void dfs1(int u,int f)
{
    int v;
    dep[u]=dep[f]+1;fa[u]=f;tot[u]=1;
    for(int i=ehead[u];i;i=e[i].nxt)
    {
        v=e[i].to;
        if(v==f) continue;
        dfs1(v,u);
        tot[u]+=tot[v];
        if(tot[v]>tot[son[u]])
            son[u]=v;
    }
}

void dfs2(int u,int topf)
{
    int v;
    idx[u]=++nodecnt;dy[nodecnt]=u;
    top[u]=topf;
    if(!son[u]) return;
    dfs2(son[u],topf);
    for(int i=ehead[u];i;i=e[i].nxt)
    {
        v=e[i].to;
        if(idx[v]) continue;
        dfs2(v,v);
    }
}

void build(int k,int l,int r)
{
    tree[k].l=l;tree[k].r=r;
    if(l==r)
    {
        tree[k].sum=0;
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}

inline bool cmp(const qu &x,const qu &y)
{
    return x.w<y.w;
}

inline void prework()
{
    scanf("%d%d",&n,&q);
    int u,v,w;num=n;
    nn=n;
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        num++;edg[i]=qu{u,v,w,num};
        adde(u,num);adde(num,v);
        adde(v,num);adde(num,u);
    }
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d%d",&que[i].u,&que[i].v,&que[i].w);
        que[i].id=i;;
    }
    sort(edg+1,edg+1+n-1,cmp);
    sort(que+1,que+1+q,cmp);
    n=num;
    dfs1(1,0);
    dfs2(1,1);
    build(1,1,n);
}

void add(int k,int l)
{
    if(tree[k].l==tree[k].r)
    {
        tree[k].sum++;
        return;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(l<=mid)
        add(k<<1,l);
    else
        add(k<<1|1,l);
    tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}

int getsum(int k,int l,int r)
{
    if(tree[k].l==l && tree[k].r==r)
        return tree[k].sum;
    int mid=(tree[k].l+tree[k].r)>>1;
    if(l>mid)
        return getsum(k<<1|1,l,r);
    else
    if(r<=mid)
        return getsum(k<<1,l,r);
    else
        return getsum(k<<1,l,mid)+getsum(k<<1|1,mid+1,r);
}

inline int gettreesum(int x,int y)
{
    int ans=0;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        ans+=getsum(1,idx[top[x]],idx[x]);
        x=fa[top[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    ans+=getsum(1,idx[x],idx[y]);
    return ans;
    //printf("%d\n",ans);
}

inline void mainwork()
{
    //int x,y;
    /*scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%s",ch);
        scanf("%d%d",&x,&y);
        if(ch[0]==‘C‘)
        {
            a[x]=y;
            add(1,idx[x]);
        }
        else if(ch[1]==‘S‘)
            gettreesum(x,y);
        else
            gettreemax(x,y);
    }*/
    int edind=0;
    for(int i=1;i<=q;i++)
    {
        while(edind<nn-1 && edg[edind+1].w<=que[i].w)
            ++edind,add(1,idx[edg[edind].id]);
        ans[que[i].id]=gettreesum(que[i].u,que[i].v);
    }
}

inline void print()
{
    for(int i=1;i<=q;i++)
        printf("%d\n",ans[i]);
}

int main()
{
    prework();
    mainwork();
    print();
    return 0;
}

K. MORE XOR

#include<bits/stdc++.h>
using namespace std;
const int size=1e5+5;
#define int long long
int sum[4][size];
int arr[size];
int32_t main()
{
    int t;
    scanf("%lld",&t);
    int n;
    while(t--)
    {
        scanf("%lld",&n);
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&arr[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=3;j++)
            {
                sum[j][i]=sum[j][i-1];
            }
            sum[i%4][i]=sum[i%4][i]^arr[i];
        }
        int q;
        scanf("%lld",&q);
        int l,r;
        while(q--)
        {
            scanf("%lld%lld",&l,&r);
            int len=r-l+1;
            if(len%4==0) printf("0\n");
            else if(len%4==1)
            {
                int b=l%4;
                printf("%lld\n",sum[b][l-1]^sum[b][r]);
            }
            else if(len%4==2)
            {
                int b=l%4,c=(l+1)%4;
                printf("%lld\n",sum[b][l-1]^sum[b][r]^sum[c][l-1]^sum[c][r]);
            }
            else if(len%4==3)
            {
                int c=(l+1)%4;
                printf("%lld\n",sum[c][l-1]^sum[c][r]);
            }
        }
    }
    return 0;
}

L. qiqi‘tree

Unsolved.

M. Subsequence

#include<bits/stdc++.h>
#define maxl 100010

int slen,tlen,n;
int nxt[maxl][27];
int nxtind[27];
char s[maxl],t[maxl];

inline void prework()
{
    scanf("%s",s+1);
    slen=strlen(s+1);
    for(int i=0;i<26;i++)
        nxtind[i]=maxl-1;
    for(int i=slen;i>=1;i--)
    {
        for(int j=0;j<26;j++)
            nxt[i][j]=nxtind[j];
        nxtind[s[i]-‘a‘]=i;
    }
    for(int j=0;j<26;j++)
        nxt[0][j]=nxtind[j];
}

inline bool check()
{
    tlen=strlen(t+1);
    int u=0;
    for(int i=1;i<=tlen;i++)
    {
        u=nxt[u][t[i]-‘a‘];
        if(u==0 || u>slen)
            return false;
    }
    return true;
}

inline void mainwork()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",t+1);
        if(check())
            puts("YES");
        else
            puts("NO");
    }
}

int main()
{
    prework();
    mainwork();
    return 0;
}

shl聚菜。%lfw.%byf.

原文地址:https://www.cnblogs.com/songorz/p/10743353.html

时间: 2024-10-13 22:13:35

2019 ICPC南昌邀请赛比赛过程及题解的相关文章

icpc南昌邀请赛 比赛总结

上周末,我参加了icpc南昌区域赛邀请赛,这也是我的第一次外出参赛. 星期五晚上,在6个小时的火车和1个小时的公交后,我们终于抵达了江西师范大学,这次的比赛场地.江西师范大学周围的设施很齐全,各种烧烤,大型商场,地铁应有尽有,去酒店办好入住手续,放下东西后,我们便去吃饭,听说南昌的小龙虾很不错,我们就选择了一家烧烤店吃起了烧烤.还是很高兴的,就是因为吃太多了晚上睡不着有点休息不好. 第二天早上,大家都起到很晚,我9点钟醒时还没有人醒,等到10:30我们一起去签到,收获了自己的第一件参赛衣服,同时

2019 ICPC 南昌网络赛

2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 // 史上排名最高一次,开场不到两小时队友各A一题加水题共四题,排名瞬间升至三四十名 // 然后后三小时就自闭了,一题都没有突破...最后排名211 hhhh ? ? B. Fire-Fighting Hero 题意 队友做的,待补. ? AC代码 #include<cstdio> #includ

2019 浙大校赛解题过程及题解

解题过程  开场lfw看J,被孪生素数误导,没有看出水题的本质,byf及时提醒后,lfw忘记N=1的情况要特判.之后byf写E,忘记开long long,wa+1.Shl看出A题思路,告诉lfw开始写A,lfw忘记先排序,WA+1.byf看出B题做法,lfw写java过掉,shl与lfw讨论G,lfw开始写G,byf看出C可以hash暴力,lfwG忘记清空一个值,导致特殊情况会加两次,wa+1,byf使用mp作hash,带logn常数TLE,随后转成long long的hash值,使用unord

2019 ICPC 南昌 Winner

题目链接:https://nanti.jisuanke.com/t/40259 题意:n个人在三种模式下举行party,每种模式下会有不同的能力值,主持人可以任意指定两个人,并能任意指定模式让该二人PK,能力值低的退场,最后一个人便是胜者 题目要求任意询问一个人,判断其是否有可能是胜者. 分析:我们可以在三种模式下分别排序,得到一个排名,然后建边,输家指向赢家,将三种模式下建的边加在一起建一个图,从每个模式下排名第一的人开始dfs(排名第一的人是一定有机会赢的,而能赢排名第一的人也一定有机会赢,

2019 icpc西安邀请赛 点分治

https://nanti.jisuanke.com/t/39277 求$\sum{异或和为0的路径,被其他路径包含的次数}$ 如果只是求异或和为0的路径数量,其实是裸点分治,但是加上要求之后,就会复杂一些 进行分类讨论,再特殊处理根节点就行 由于信息可以合并,我使用子树合并,跑的很快 #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/hash_policy.h

2019 ICPC 南昌网络赛 - Subsequence (子串判断,预处理,超时)

?? ?? ?? 题意:一个字符串s,t个字符串p,判断p是不是s的子序列 预处理出对于字符串s,每个位置i之后第一个字母x的位置,匹配子序列的时候就相当于在母串上往后跳,如果跳到母串末尾,子序列还没有结束,匹配失败. 然而!超时了QAQ,只能过八组样例,网上也只能找到过九组的,,,希望有哪位大神路过指点一下了 int tag[33],nxt[MAXN][30]; char s[MAXN],p[MAXN]; void init() { int n=strlen(s); for(int j=0;j

2019 ICPC 南昌网络赛 - Max answer (区间和,区间最值)

?? ???? 题意:价值 = 区间和 × 区间最小值,求数组的子区间的最大价值 (1)区间和---->前缀和 (2)O(n^2) 枚举区间 ---> O( n ) 枚举元素,根据当前元素查询相应区间和 对每个元素,维护他作为最小值的左右端点,枚举数组中的元素,该元素大于0为例,查找( i , r [ i ] )的前缀和最大值,( l [ i ] - 1 , i - 1 )的前缀和最小值,注意这里 l [ i ] -1 可能会小于1 ,ST表应从0开始维护 丧心病狂的压行QWQ ll a[MA

ICPC训练平台&amp;比赛

file in https://pan.baidu.com/s/1B0a4CZ6HFev0iwDdtDwBcA 训练平台 CodeForces https://codeforces.com 大量优质题目,无论是题目还是数据都挺好的.较少情况下题目出现问题. 可以看所有人的代码.可学习不同的做法和代码编写方式,有利于提高个人编程水平. 有些比赛过程中或赛后,可以造数据hack别人代码,有助于提高看别人代码并查错的能力(现场赛团队模式). 可以看到规模小的数据. 题目英文.国内外很多高手参加. gy

[比赛总结]青岛理工大学邀请赛比赛总结

2016年11月26日,通过ACM协会的会内选拔和组队,我第一次参加了真正的ACM性质的比赛. 到达青理工,首先收获的一点是——青岛理工大学校园环境真的比自己学校的环境差很多,猛然发现自己学校还是很漂亮的.然后9点钟我们参加了经验交流会,发现机房里的电脑真是...除了没法用,其他都好.11点我们随队吃了午餐.由于这次饭不花钱,所以吃的格外的香,但因估计下午的比赛,又没有吃太多,遗憾遗憾. 下午12:30比赛开始,我们队里三个人起初分工比较明确,不到1个小时一名队员做出来两个题,一度冲到了榜单前列