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":" ");
- }
- }
- }
- }
2018ICPC青岛现场赛 重现训练的更多相关文章
- 2015年上海现场赛重现 (A几何, K暴力搜索)
A: 题目链接 :https://vjudge.net/contest/250823#problem/A 参考 : https://www.cnblogs.com/helenawang/p/54654 ...
- 2018 ACM-ICPC青岛现场赛 B题 Kawa Exam 题解 ZOJ 4059
题意:BaoBao正在进行在线考试(都是选择题),每个题都有唯一的一个正确答案,但是考试系统有m个bug(就是有m个限制),每个bug表示为第u个问题和第v个问题你必须选择相同的选项,题目问你,如果你 ...
- 2018ACM/ICPC 青岛现场赛 E题 Plants vs. Zombies
题意: 你的房子在0点,1,2,3,...,n(n<=1e5)点每个点都有一颗高度为0的花,浇一次水花会长a[i]. 你有一个机器人刚开始在你家,最多走m步,每一步只能往前走或者往后走,每走到一 ...
- 2018 ACM-ICPC 亚洲区域赛青岛现场赛 —— Problem F. Tournament
题面:http://acm.zju.edu.cn/contest-materials/qd2018/qd2018_problems.pdf 题意: n个骑士决斗K轮 要求是每个骑士只能跟另外一个骑士决 ...
- 计蒜客 39280.Travel-二分+最短路dijkstra-二分过程中保存结果,因为二分完最后的不一定是结果 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest M.) 2019ICPC西安邀请赛现场赛重现赛
Travel There are nn planets in the MOT galaxy, and each planet has a unique number from 1 \sim n1∼n. ...
- 计蒜客 39279.Swap-打表找规律 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest L.) 2019ICPC西安邀请赛现场赛重现赛
Swap There is a sequence of numbers of length nn, and each number in the sequence is different. Ther ...
- 计蒜客 39272.Tree-树链剖分(点权)+带修改区间异或和 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest E.) 2019ICPC西安邀请赛现场赛重现赛
Tree Ming and Hong are playing a simple game called nim game. They have nn piles of stones numbered ...
- 计蒜客 39270.Angel's Journey-简单的计算几何 ((The 2019 ACM-ICPC China Shannxi Provincial Programming Contest C.) 2019ICPC西安邀请赛现场赛重现赛
Angel's Journey “Miyane!” This day Hana asks Miyako for help again. Hana plays the part of angel on ...
- 计蒜客 39268.Tasks-签到 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest A.) 2019ICPC西安邀请赛现场赛重现赛
Tasks It's too late now, but you still have too much work to do. There are nn tasks on your list. Th ...
随机推荐
- ext遍历表单中所有输入项,并全部设置为只读
baseInfoForm.getForm().getFields().each(function (field) { // 设置只读 field.setReadOnly(true); })
- 【转载】关于generate用法的总结【Verilog】
原文链接: [原创]关于generate用法的总结[Verilog] - nanoty - 博客园http://www.cnblogs.com/nanoty/archive/2012/11/13/27 ...
- 【记录】文件加密软件 Gilisoft File Lock Pro v11.0 中文注册版
---恢复内容开始--- GiliSoft File Lock Pro 是一款优秀的加密工具,用它可以隐藏或加密文件.文件夹.磁盘分区,而且被加密的文件不会因为被加密(忘记密码)而丢失,可算是很安全的 ...
- python离线安装包
一.用download命令离线下载包 *.whl , 这个方法好像python3.7以上才能用 那么我的requirement.txt内容就是: django==1.8.11 simplejson= ...
- 【Linux基础】查看硬件信息-硬盘
一.基础知识 1.磁盘分区 磁盘的分区主要分为基本分区(primary partion)和扩充分区(extension partion)两种,基本分区和扩充分区的数目之和不能大于四个.且基本分区可以 ...
- 【Python 12】汇率兑换5.0(Lambda函数)
1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4. ...
- .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...
- http协议进阶(五)连接管理
几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是全球计算机网络设备都在使用的一种分组交换网络分层协议集. 它的特点是只要连接建立,客户端与服务器之间的报文交换就永远不会丢失.受损或失序. ...
- python3 random模块
import random '''随机获取从0-1之间的小数'''print(random.random())print(format(random.random(), ".2f" ...
- 《通过C#学Proto.Actor模型》之 HelloWorld
在微服务中,数据最终一致性的一个解决方案是通过有状态的Actor模型来达到,那什么是Actor模型呢? Actor是并行的计算模型,包含状态,行为,并且包含一个邮箱,来异步处理消息. 关于Actor的 ...