前言

好不容易遇到一次简单的div2,竟然才A了三题,可恶的第4题,死活调不出来QAQ。

比赛地址

A

题意:给你TTT组数据,每组数据nnn个整数(nnn是偶数),分别为a1,a2,...,ana_{1},a_2,...,a_na1​,a2​,...,an​,每个数字的绝对值都小于等于100100100且不为000。

现在让你求一个长度为nnn的bbb数组,满足每个数字是整数、绝对值都小于等于100100100且不为000。

题解:很简单啊,对于每个相邻的数字这样处理就行了:a[1]∗a[2]+(−a[1])∗a[2]=0a[1]*a[2]+(-a[1])*a[2]=0a[1]∗a[2]+(−a[1])∗a[2]=0,所以b[1]=a[2],b[2]=−a[1]b[1]=a[2],b[2]=-a[1]b[1]=a[2],b[2]=−a[1],其余类似处理即可。

时间复杂度:O(n)O(n)O(n)。

非常SB的我还想了几分钟

#include<cstdio>
#include<cstring>
using  namespace  std;
int  n,a[110];
int  main()
{int  T;scanf("%d",&T);for(int  i=1;i<=T;i++){scanf("%d",&n);for(int  i=1;i<=n;i++)scanf("%d",&a[i]);for(int  i=1;i<=n;i+=2){int  y=i+1;printf("%d %d ",-a[y],a[i]);}printf("\n");}return  0;
}

B

题意:T组数据,每组数据有个n,mn,mn,m,表示nmnmnm的矩阵(满足每组数据的n,mn,mn,m加起来小于等于250000250000250000),然后序号为111~nmnmnm的点在这个矩阵中,然后其会给你每一行从左到右的点的编号,和每一列从上到下的点的编号,但是行与行、列与列之间的相对位置不一定是对的,现在要求你还原这个矩阵。

题解:非常的简单,只要找到包含每一行第一个数字的列,就能得到行的相对位置,直接输出即可,时间复杂度可以到:O(nm)O(nm)O(nm),但是为了偷懒,我用排序快速的打出了O(nmlog⁡nm)O(nm\log{nm})O(nmlognm)的打法,虽然慢,但是打的快。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define  N  510
#define  NN  260000
using  namespace  std;
struct  node
{int  a[N];
}a[N];
int  id[NN];bool  v[NN];
inline  bool  cmp(node  x,node  y){return  id[x.a[1]]<id[y.a[1]];}
int  n,m;
int  main()
{int  T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int  i=1;i<=n;i++){for(int  j=1;j<=m;j++)scanf("%d",&a[i].a[j]);v[a[i].a[1]]=1;}for(int  i=1;i<=m;i++){int  x=0;for(int  j=1;j<=n;j++){scanf("%d",&x);if(v[x]==1)id[x]=j;}}sort(a+1,a+n+1,cmp);for(int  i=1;i<=n;i++){for(int  j=1;j<=m;j++)printf("%d ",a[i].a[j]);printf("\n");}for(int  i=1;i<=n;i++)v[a[i].a[1]]=0;}return  0;
}

C

题意:现在有666个正整数的aaa数组,还有nnn个正整数的bbb数组(对于任意的1≤i≤n,1≤j≤61≤i≤n,1≤j≤61≤i≤n,1≤j≤6,满足bi>ajb_{i}>a_{j}bi​>aj​),然后要求现在构造一个ccc数组,对于cic_{i}ci​,其等于bi−ajb_{i}-a{j}bi​−aj(jjj是自己定的),然后ccc数组的权值为最大的数字减去最小的数字,求最小的权值。

题解:我们不妨考虑暴力枚举lll虽然是1e9的级别,然后看看其对应的rrr最小能是多少,这个应该怎么维护呢?也就是说[l,r][l,r][l,r]中必须能包含一个ccc数组。

我们不妨用一个数字把每一个bi−ajb_{i}-a_{j}bi​−aj​保存起来,总共6n6n6n个数字,从小到大排序,然后对于l++l++l++,我们只要把所有bi−aj<lb_{i}-a_{j}<lbi​−aj​<l删掉,然后找到另外一个最小的bi−ak≥lb_{i}-a_{k}≥lbi​−ak​≥l加入进去即可,然后rrr取maxmaxmax。

但是lll移动1e91e91e9次的问题还有解决,我们发现,lll只有移动到6n6n6n个数字才是有用的,于是优化一下,lll就只用跳6n6n6n次了,而每个数字最多被删除一次,也是6n6n6n次,所以就是O(nlogn)O(nlogn)O(nlogn)。(实际上用基排可以到O(n)O(n)O(n))

#include<cstdio>
#include<cstring>
#include<algorithm>
#define  N  110000
#define  NN  610000
using  namespace  std;
inline  int  mymax(int  x,int  y){return  x>y?x:y;}
inline  int  mymin(int  x,int  y){return  x<y?x:y;}
int  a[10],b[N],n;
struct  node
{int  x/*数字*/,y/*对应的哪个b[y]*/,next/*下一个b[y]-a[k]*/;
}dp[NN];int  las[N],len;
inline  bool  cmp(node  x,node  y){return  x.x<y.x;}
inline  bool  cmp2(int  x,int  y){return  x>y;}
int  main()
{memset(las,0,sizeof(las));for(int  i=1;i<=6;i++)scanf("%d",&a[i]);sort(a+1,a+7,cmp2);//其实没有必要scanf("%d",&n);int  l,r=1;for(int  i=1;i<=n;i++){scanf("%d",&b[i]);r=mymax(r,b[i]-a[1]);for(int  j=1;j<=6;j++){len++;dp[len].x=b[i]-a[j];dp[len].y=i;}}sort(dp+1,dp+len+1,cmp);for(int  i=len;i>=1;i--)//处理next{dp[i].next=las[dp[i].y];las[dp[i].y]=i;}l=dp[1].x;int  ans=1000000000;for(int  i=1;i<=len;){ans=mymin(r-l,ans);while(i<=len  &&  dp[i].x==l)//不断的删除数字{if(!dp[i].next)//已经没有数字了{printf("%d\n",ans);return  0;}r=mymax(dp[dp[i].next].x,r);i++;}l=dp[i].x;}printf("%d\n",ans);return  0;
}

D

题意:一个人要卖111~nnn价格的物品(每个物品各一个),每个时间点有两种操作:

  1. 其放上一个物品,价格不知道。
  2. 一个人来买走最小价格的物品。

现在给你2n2n2n个时间点的操作,+++表示放上物品,−-− xxx表示一个人来买走了xxx价格的物品,现在要求你构造出一个满足要求的放物品序列,没有输出NONONO。

题解:设a[i]a[i]a[i]为第iii次买走是什么物品,id[i]id[i]id[i]满足∀j∈[id[i],i−1],a[j]<a[i]∀j∈[id[i],i-1],a[j]<a[i]∀j∈[id[i],i−1],a[j]<a[i],且要求id[i]id[i]id[i]是最小的,而对于每个+++号,其隶属于后面第一个−-−号,很明显,a[i]a[i]a[i]只要放在隶属于[id[i],i][id[i],i][id[i],i]中的任意一个+++号,而且不难发现,a[i]a[i]a[i]放在[1,id[i]−1][1,id[i]-1][1,id[i]−1]的位置会导致id[i]−1id[i]-1id[i]−1错误,所以a[i]a[i]a[i]只能且任意放在隶属于[id[i],i][id[i],i][id[i],i]中的任意一个+++号。

当然,不难发现,对于每个数字,在前面已经放完之后,尽量的往前方就行了,用并查集维护。(往后放可能会导致后面的数字放不了)

时间复杂度:O(nlogn)O(nlogn)O(nlogn)

#include<cstdio>
#include<cstring>
#define  N  110000
#define  NN  210000
using  namespace  std;
int  fa[N];
int  findfa(int  x)
{if(fa[x]!=x)fa[x]=findfa(fa[x]);return  fa[x];
}
int  ll[N],rr[N],a[N];
int  id[N],n;
int  sta[N],top;
inline  int  erfen(int  x)
{int  l=1,r=top,ans=x,mid;while(l<=r){mid=(l+r)/2;if(a[sta[mid]]<a[x])r=mid-1,ans=sta[mid-1]+1;else  l=mid+1;}return  ans;
}
int  lis[N];
int  main()
{//  freopen("std.in","r",stdin);
//  freopen("std.out","w",stdout);scanf("%d",&n);int  ed=2*n;int  l1=0,l2=0,pre=1;for(int  i=1;i<=ed;i++){char  st[10];scanf("%s",st+1);if(st[1]=='-'){l1++;scanf("%d",&a[l1]);ll[l1]=pre;rr[l1]=l2;pre=l2+1;fa[l1]=l1;}else  l2++;}fa[n+1]=n+1;id[1]=1;sta[top=1]=1;for(int  i=2;i<=n;i++){id[i]=erfen(i);while(top  &&  a[sta[top]]<a[i])top--;sta[++top]=i;}for(int  i=1;i<=n;i++){int  x=findfa(ll[id[i]]);if(x>rr[i]){printf("NO\n");return  0;}else{lis[x]=a[i];fa[x]=x+1;}}printf("YES\n");for(int  i=1;i<=n;i++)printf("%d ",lis[i]);printf("\n");return  0;
}

事实上,二分部分可以跟单调栈的弹出合并到一起,并查急可以优化到O(nα(n))O(nα(n))O(nα(n))。

所以可以到达O(nα(n))O(nα(n))O(nα(n))。

当然,还有严格O(n)O(n)O(n)的做法,不难发现,我们的瓶颈在于往后放可能会导致后面的数字放不了,但是我们发现,如果a[j]<a[j](i<j)a[j]<a[j](i<j)a[j]<a[j](i<j),那么a[i]a[i]a[i]能放到的地方a[j]a[j]a[j]也能放到,所以a[i]a[i]a[i]往后放,而不是往前放的话,并不会影响a[j]a[j]a[j]放置,如果a[j]>a[i]a[j]>a[i]a[j]>a[i],a[i]a[i]a[i]压根就放不到a[j]a[j]a[j]能放的位置,a[j]a[j]a[j]不就随便放了吗?

然后用单调栈随便维护一下就可以了。

时间复杂度:O(n)O(n)O(n)

#include<cstdio>
#include<cstring>
#define  N  110000
#define  NN  210000
using  namespace  std;
inline  int  mymin(int  x,int  y){return  x<y?x:y;}
inline  int  mymax(int  x,int  y){return  x>y?x:y;}
int  sta[NN],top;
int  n,lis[N];
int  main()
{scanf("%d",&n);int  ed=2*n,l1=0;for(int  i=1;i<=ed;i++){char  st[10];scanf("%s",st);if(st[0]=='+')l1++,sta[++top]=-l1;else{int  x=0;scanf("%d",&x);bool  bk=0;while(top){if(sta[top]>0  &&  sta[top]<x)top--;else  if(sta[top]<0){lis[-sta[top]]=x;top--;bk=1;break;}else  break;}if(!bk){printf("NO\n");return  0;}sta[++top]=x;}}printf("YES\n");for(int  i=1;i<=n;i++)printf("%d ",lis[i]);printf("\n");return  0;
}

E

题意:有一个魔法,在ttt秒施法时瞬间打掉怪物aaa点血量,然后在t+1,t+2,...,t+ct+1,t+2,...,t+ct+1,t+2,...,t+c的时间点回复bbb点血量,施法有ddd秒cdcdcd,相当于ttt秒施法后,t+dt+dt+d才能再次施法。

回血效果可以叠加,如果一个时间点有多个血量变化,同时计算,然后问你最多可以打掉多少血的怪物,无限的话输出−1-1−1。

有TTT组数据,每组给定魔法a,b,c,da,b,c,da,b,c,d。

做法:不难发现,a>bca>bca>bc的话,就是−1-1−1,反之,不能打败无限血的怪物,那么很明显,ttt时刻放完魔法后,t+dt+dt+d时刻立马放很明显更加优秀。(你总不可能等他多回一点血再打吧。)

所以放魔法的时间就是:1,1+d,1+2d,1+3d...1,1+d,1+2d,1+3d...1,1+d,1+2d,1+3d...,那么什么时候达到最大值呢?

考虑回本时间,回本时间就是指111时刻放完魔法后,在哪个时刻第一次的攻击血量会被其回血血量会上来,不难发现,会本时间就是:(b−1)/a+2(b-1)/a+2(b−1)/a+2,设为timtimtim。

先证明≥tim≥tim≥tim再放魔法的话肯定不是最大值:
对于k≥timk≥timk≥tim放完魔法,此时111时刻的攻击已经被完全的消除了(甚至可能回得更多),那么不妨构造新的方案,在111时刻不攻击,1+d1+d1+d时刻为真正的111时刻,此时最大的攻击血量一定不小于原来的方案。

再证明<tim<tim<tim放魔法一定会更大:
类似的证明方法,在k<timk<timk<tim的位置实施魔法,不妨证明其比1,1+d,...,k−d1,1+d,...,k-d1,1+d,...,k−d的方案更加优秀,类似的证明,构造新方案,111不放魔法,1+d1+d1+d为名正言顺的111时刻,那么新方案的血量等于1,1+d,...,k−d1,1+d,...,k-d1,1+d,...,k−d的方案,但是原方案比新方案多了个111,且其并未回本,所以原方案>>>新方案===1,1+d,...,k−d1,1+d,...,k-d1,1+d,...,k−d的方案。

然后推推式子就行了。

单次复杂度:O(1)O(1)O(1)

#include<cstdio>
#include<cstring>
using  namespace  std;
typedef  long  long  LL;
int  main()
{int  T;scanf("%d",&T);while(T--){LL  a,b,c,d;scanf("%lld%lld%lld%lld",&a,&b,&c,&d);if(a>b*c)printf("-1\n");else{LL  tim=(a-1)/b+1;//回本时间-1LL  kao=(tim-1)/d+1;LL  ans=kao*a-(d*b)*kao*(kao-1)/2;printf("%lld\n",ans);}}return  0;
}

CF Round #679 div2赛后总结相关推荐

  1. cf round #421 div2 D. Mister B and PR Shifts

    链接:http://codeforces.com/contest/820/problem/D 分析:|p[i]-i|每次只会变化1,先不考虑端点情况,就只有p[i]==i的时候变化,每次k+1的时候, ...

  2. CF Round#436 div2

    额,这次的题目其实挺智障的.所以通过这次比赛,我也发现了自己是一个智障.... 不说太多,说多是泪... A. Fair Game 题意:给你一个数组,看你能否把它均分为两个所有元素均相同的子数组. ...

  3. CF #673 div2 赛后总结

    文章目录 前言 A B C D E F 前言 完成成就:在学校熬夜熬到1点 第一次CF打比赛就炸成这个样子 A 题目翻译: 一个长度为 n n n的数组,每次选择 i , j ( 1 ≤ i , j ...

  4. codeforces round 421 div2 补题 CF 820 A-E

    A Mister B and Book Reading  O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef lon ...

  5. codeforces round 418 div2 补题 CF 814 A-E

    A An abandoned sentiment from past 水题 #include<bits/stdc++.h>using namespace std;int a[300],b[ ...

  6. codeforces round 422 div2 补题 CF 822 A-F

    A I'm bored with life 水题 #include<bits/stdc++.h> using namespace std; typedef long long int LL ...

  7. codeforces round 420 div2 补题 CF 821 A-E

    A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...

  8. 【codeforces】【比赛题解】#915 Educational CF Round 36

    虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题--悲伤. 这次的Education ...

  9. CF #277.5 div2

    2014-11-20 22:41:06 总结:这场cf总共6题,比赛艹了四题,成功帮助绿名小号回蓝-.-',赛后补完. A:问排序的交换方案,并输出,这种模拟题在cf不少见,就是比谁更暴力! 1 /* ...

最新文章

  1. 2022-2028年中国快捷酒店行业市场全景评估及前瞻分析报告
  2. TCP首部和TCP的特性—Vecloud微云
  3. php 预处理原理,PHP的PDO对象预处理的2种实现方法,实现原理详解
  4. select * 映射错误_高性能IO模型分析-浅析Select、Poll、Epoll机制(三)
  5. Android @id和@+id区别
  6. 如何在Mac上安装win10正版系统
  7. deploy.php
  8. [渝粤教育] 武汉交通职业学院 现代物流管理概论 参考 资料
  9. DBCP连接池配置常用参数说明
  10. 根据经纬度计算范围_高中地理必修一二三思维导图+计算公式全汇总!能用3年...
  11. java爬虫post 404_POST 后台404错误
  12. iBatis for net 框架使用
  13. vba 根据分辨率 调整窗口显示比例_2020 如何选择适合自己的显示器?小白选购电脑显示器必看,附各类型显示器高性价比选购指南分析...
  14. VSCode打开终端的快捷键
  15. 以太坊源码(03):POA委员会选举机制
  16. 讨论PV原语、解答PV疑惑
  17. 802.11ax速览
  18. Springboot配置suffix指定mvc视图的后缀
  19. 在电脑上构建自我意识
  20. SQL语句----CASE WHEN 的用法简介

热门文章

  1. 重启:第六届中国开源年会 (COSCon'21) 1+N
  2. 多所高校官宣:寒假提前,延长假期!开启学生第一批返乡工作!
  3. 数据可视化豆瓣电影 TOP250
  4. java flexpaper_解决FlexPaper分页分段加载问题
  5. linux IIO子系统使用说明
  6. 利用火狐浏览器抓取京东Cookie教程
  7. 2018年度中国存储市场影响力排行榜”榜单揭晓
  8. WPS Office 保存时间太长
  9. 地理国情监测多源数据组织、整合与处理技术培训班 圆满结束
  10. SAP 基本计量单位与采购订单单位不一致的问题处理