2018ICPC青岛现场赛 重现训练

先贴代码,以及简要题解。

和一个队友下午双排打了一下,队友光速签到,我签的J被嫌弃写得慢以及演员。。。然后我秒出了E了思路然而难以置信这么简单的思路当时才过了十几个,于是发现D、F不是太好做。最后交了13发E才过,中间爆ll、memset超时。。赛后补了F。

只贴我写的三个题。

J: ZOJ 4067

题解:把所有0拿掉后贪心拿完前面的,然后再加上后面的最小值-1。改了三次在基佬紫帮助下才写对。

#include<cstdio>
#include<iostream>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#define mp make_pair
#define pb push_back
#define ll long long
#define lc no[x].ch[0]
#define rc no[x].ch[1]
#define pa no[x].fa
#define db double
#define ls (x<<1)
#define rs (x<<1|1)
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Forr(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+7;
ll a[maxn],tv;
 vector<ll>vec;
int n,m;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		int cnt=0;
		vec.clear();
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
            if(a[i]==0)cnt++;
            else vec.push_back(a[i]);
		}
		m-=cnt;
		if(m<0){cout<<"Impossible\n";continue;}
		if(n-cnt==m){cout<<"Richman"<<"\n";continue;}
		ll ans=0;
		int pp=0;
        for(int i=0;i<(int)vec.size()&&pp<m;i++)
        {
            ans+=vec[i];
            pp++;
        }
        ll minn=1e9+1;
		for(int i=m;i<(int)vec.size();i++)
        {
            minn=min(minn,vec[i]);
        }
        ans+=minn-1;
		cout<<ans<<"\n";
	}
}

 E:ZOJ 4062

题解:二分答案,可以看出这个过程可以谈心,就是尽可能少的走回头路,check时优先满足当前这个格子的高度,然后一路做过去,要特判n-1的情况,因为这样如果n满足了就不需要走过去了。我写的偏复杂了,一开始记录每个点的高度,然后直接爆了ll,完全发现不了,写法太丑陋了,换了种写法继续TLE,,memset真棒。

#include<cstdio>
#include<iostream>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#define mp make_pair
#define pb push_back
#define ll long long
#define lc no[x].ch[0]
#define rc no[x].ch[1]
#define pa no[x].fa
#define db double
#define ls (x<<1)
#define rs (x<<1|1)
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Forr(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=2e5+7;
ll a[maxn],tv;
ll n,m;
ll cnt;
ll pq[maxn];
bool check(ll x)
{
    for(int i=1;i<=n;i++)pq[i]=0;
    ll fq=m;
    fq--;
    pq[1]++;
    for(int i=1;i<=n;i++)
    {
        if(fq<0)return false ;
        ll tmp=(x+a[i]-1)/a[i];
        if((pq[i])>=tmp&&i<n)
        {
            fq--;pq[i+1]++;continue;
        }
        else if((pq[i])>=tmp&&i==n)
        {
            continue;
        }
       // if(x==5)cout<<pq[i]<<"  "<<i<<" "<<fq<<endl;
        pq[i+1]=tmp-pq[i];
        ll vq=tmp-pq[i];
        if(i==n)fq-=(vq)*2;
       else if(i==n-1)
        {
            fq-=(vq*2);
            if(pq[n]>=(x+a[n]-1)/a[n])continue;
            else pq[n]++,fq--;
        }
        else pq[i+1]++,fq-=(vq*2+1);
    }// if(x==5)cout<<fq<<"\n";
    if(fq>=0)return true;
    else return false;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
        }
        ll ans=0ll;
        ll l=1ll,r=1e18;
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            if(check(mid))l=mid+1,ans=mid;
            else r=mid-1; //cout<<l<<" "<<r<<" "<<mid<<" "<<ans<<"\n";
        }
        printf("%lld\n",ans);
	}
}

 F:ZOJ 4063

题解:当时现场赛的队伍说有很多构造题,于是我天真的觉得这应该是个构造题,然后发现自己无从下手,就中期怼E去了,然后晚上发现D不会做,就继续想,瞄了眼题解说打表找规律。然后打了20分钟的表成功打出,于是找规律,发现就是对于当前第i行,是以lowbit(i)*2的长度分段的,以上一行按照这个长度进行中心旋转得到的,然后什么时候不行呢,疯狂枚举发现,当m>=lowbit(n)时不成立。因此就打表预处理然后输出就好了。

打表代码:

#include<cstdio>
#include<iostream>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#define mp make_pair
#define pb push_back
#define ll long long
#define lc no[x].ch[0]
#define rc no[x].ch[1]
#define pa no[x].fa
#define db double
#define ls (x<<1)
#define rs (x<<1|1)
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Forr(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+7;
int a[200][200];
int vis[200][200];
int pan[200];
vector<int >vec[maxn];
int main()
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=20;i++)a[0][i]=i,vis[i][i]=1;
    for(int i=1;i<=20;i++)
    {
        memset(pan,0,sizeof(pan));
        for(int j=1;j<=20;j++)
        {
            if(!a[i][j])
            for(int k=1;k<=20;k++)
            {
                if(!vis[j][k]&&j!=k&&!pan[k])
                {
                    int flag=0,fla=0;
                    for(int pp=1;pp<i;pp++)
                    {
                        if(vis[j][a[pp][j]]&&vis[k][a[pp][k]]&&!vis[a[pp][k]][a[pp][j]])
                        {
                            vis[j][k]=vis[a[pp][k]][a[pp][j]]=vis[k][j]=vis[a[pp][j]][a[pp][k]]=1;
                            a[i][j]=k;a[i][k]=j;a[i][a[pp][k]]=a[pp][j];a[i][a[pp][j]]=a[pp][k];pan[k]=pan[j]=pan[a[pp][j]]=pan[a[pp][k]]=1;
                            flag=1;
                            break;
                        }
                        if(vis[j][a[pp][j]]&&vis[k][a[pp][k]])fla=1;

                    }
                    if(flag)
                    {break;}
                    if(!fla)
                    {
                        a[i][j]=k;a[i][k]=j;pan[k]=pan[j]=1;vis[j][k]=vis[k][j]=1;break;
                    }
                }
            }
        }
    }
    for(int i=0;i<=15;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cout<<a[i][j]<<(j==15?‘\n‘:‘ ‘);
        }
    }
}

  AC代码:

#include<cstdio>
#include<iostream>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#define mp make_pair
#define pb push_back
#define ll long long
#define lc no[x].ch[0]
#define rc no[x].ch[1]
#define pa no[x].fa
#define db double
#define ls x<<1
#define rs x<<1|1
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Forr(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1005;
int a[maxn][maxn];
int lowbit(int x){return x&(-x);}
void cal()
{
    for(int i=1;i<=1001;i++)a[0][i]=i;
    for(int i=1;i<=1001;i++)
    {
        int kk=lowbit(i);int pp=kk*2;
        for(int j=1;j<=1001;j+=pp)
        {
            for(int k=0;k<pp;k++)
            {
                a[i][j+k]=a[i-1][pp+j-k-1];
            }
        }
    }
 /*   for(int i=1;i<=20;i++)
    {
        for(int j=1;j<=20;j++)
        {
            cout<<a[i][j]<<(j==20?"\n":" ");
        }
    }*/
}

int main()
{
    cal();
    int t;
    scanf("%d",&t);
    int n,m;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        if(m>=lowbit(n)){cout<<"Impossible\n";continue;}
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cout<<a[i][j]<<(j==n?"\n":" ");
            }
        }
    }

}

  

原文地址:https://www.cnblogs.com/intwentieth/p/9949385.html

时间: 2024-10-30 10:52:10

2018ICPC青岛现场赛 重现训练的相关文章

2016青岛现场赛的一切

感谢跟我一块任性的队友,没有他们我们就没有这次的成绩~~ 这次比赛之后还是感觉很心塞:我们在比赛的临场发挥不够好,作为思考核心,我的思考速度奇慢,导致热身赛到最后才想出后面2道题的做法,正赛还被榜单牵着走结果在G题耗费了不少时间,且思考太慢导致队友AC了BC后才想到G解法(后面也是一片决策错误,结果到14:00才A出G.以double为cost应该考虑到比较大小的精度问题,至于费用流的模板的时间复杂度不是我们该考虑的),若不是这样或许还能A出D题:这次的题目不像是程序创新竞赛,更像是数据结构模板

[2016CCPC]长春现场赛重现

1002.公式,手算一下就能找到两个式子的关系,迭代一下就行. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 9; 5 int a[maxn], b[maxn]; 6 int n, p, q; 7 8 int gcd(int x, int y) { 9 return y == 0 ? x : gcd(y, x%y); 10 } 11 12 int main() { 13 //freopen(&quo

2015年上海现场赛重现 (A几何, K暴力搜索)

A: 题目链接 :https://vjudge.net/contest/250823#problem/A 参考 : https://www.cnblogs.com/helenawang/p/5465481.html #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const double eps = 1e-8; int cmp(double x){ return x

2018icpc南京现场赛-G Pyramid(打标找规律+逆元)

题意: 求n行三角形中等边三角形个数,图二的三角形也算. n<=1e9 思路: 打表找下规律,打表方法:把所有点扔坐标系里n^3爆搜即可 打出来为 1,5,15,35,70,126,210.. 没感觉,作差 4, 10, 20, 35, 56, 84 还是没感觉,作差 6, 10, 15, 21, 28 发现此时的差递增1?也就是再作差4, 5, 6, 7是等差数列 也就是再作差1, 1, 1为常数 相当于函数$A_n$求四次导为常数!(如果他是个连续函数的话) 于是我们设$\displayst

第39届ACM国际大学生程序设计竞赛 亚洲区域赛(现场赛)西安站

 第39届ACM国际大学生程序设计竞赛 亚洲区域赛(现场赛)西安赛区总结报告 报告人:田思明 队名:ACpioneer 队长:陈志阳,队员:顾振兴,田思明 西安区域赛告下帷幕,我和陈志阳,顾振兴组成的ACpioneer队最终获得了一块宝贵的铜牌.首先要感谢陈志阳和顾振兴两位杰出队友的努力训练和出色表现,我作为一个新人跟着他们学到了很多很多,也十分珍惜和他们在一起的训练,比赛时光,其次要感谢陈志老师,不辞辛劳陪我们5队和6队前往西安参加比赛,还要感谢集训队所有曾经帮过我们的所有队员们,记得cdy

2014ACM/ICPC亚洲区鞍山赛区现场赛——题目重现

2014ACM/ICPC亚洲区鞍山赛区现场赛--题目重现 题目链接 5小时内就搞了5题B.C.D.E,I. H题想到要打表搞了,可惜时间不够,后面打出表试了几下过了- - K题过的人也比较多,感觉是个几何旋转+ploya,但是几何实在不行没什么想法 B:这题就是一个大模拟,直接数组去模拟即可,注意细节就能过 C:类似大白上一题红蓝三角形的, 每个数字找一个互质和一个不互质个数,除掉重复就直接除2,然后总的C(n, 3)减去即可,问题在怎么处理一个数字互质和不互质的,其实只要处理出不互质的即可,这

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

2018南京icpc现场赛心得

第一次参加icpc的比赛,也是第一块奖牌,虽然只是铜,但其实打的已经很好了,稍微差一点就可以摸银了. 之前参加省赛,成为那次比赛我校唯一一个没拿奖的队伍,其实还是一直都有一些心结的,而这段时间和新的队友的组队,虽然新队员的实力比之前的队友抢了很多,但是总感觉配合一直有问题,在比赛前一天的晚上,睡在一个房间里聊了很多话,也算是和队友真正达成了默契吧,所以第二天的现场赛配合的很好. 但是我自己在最近一段时间由于各种原因,其实个人的训练远没有之前那么多了,希望接下来能调整自己的训练,争取能在青岛站给奖

2014 acm鞍山现场赛总结

好像大家都习惯打完比赛写总结,我也来水一发好了.. 记一下流水账,那么多第一次献给了acm,不记一下就白去那么远的地方了.. 首先比赛前网上买了机票跟火车票了.比赛前一天早上6点钟起来收拾东西6点半坐地铁去机场.第一次来机场,太高大上啦,感觉就像大乡里入城差不多,这里的随便一个做前台的英语都完虐我几十条街,领了个机票傻乎乎的过了安检去了机票口,提前来了半个钟,逛了下机场的商店,尼玛全都没写价格,一看就知道各种贵,只好路上拍拍灰机场,吃了点垃圾食品就上机了,上机五分钟前发现还有个候机宝的东西,尼玛