博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #500 (Div.1)
阅读量:4630 次
发布时间:2019-06-09

本文共 6912 字,大约阅读时间需要 23 分钟。

题意:

A

给你2n个数字,你可以任意排列

让你排成n个坐标

然后让一个平行于坐标轴的矩形包含这n个坐标

问矩形大小的最小值

n<=1e5

B

给你n*m的方格,已知任意三个点如果这样就可以生成另一个点(见下图)

生成的点可以用来生成别的店,之前的三个点也还在

现在给你q个点,问你至少加几个点能经过若干次生成后让整个矩形上所有格子都有点

n,m<=2e5,q<=min(n*m,2e5)

C

给你n个地点,如果某个地点比两边严格高那么就可以建一座房子

你可以花1的代价让某个地点高度-1,可以减到负

问建造1,2....n/2(上取整)个房子的最少代价分别为多少

n<=5000

D

给你两个字符串s和t,仅有ab两个字符

每次你可以选字符串s的一个前缀(可以是空,可以是全部,t的也一样),和t的一个前缀,然后交换它们

问最少多少次操作可以把a和b完全区分(也就是得到一个纯a字符串和一个纯b字符串),并且给出方案

保证s和t之中至少有一个串包含至少一个a,至少一个串包含至少一个b

字符串长度1<=|s|,|t|<=2e5

===================================

做法:

A

也就是说,把2n个数字分成两组每组n个

让每组最大-最小,乘起来就是答案

那么排序,要么是前后两组1...n n+1...2n

要么1和n一组,中间选一段

复杂度O(n log n)

 

B

并查集

每行每列都当一个点,每个(x,y)看成第x行到第y列连边

复杂度O(n+m)

 

C

直接dp

dp(i,j,0/1/2)表示到第i个位置,一共建了j个房子的最小代价

0表示这个点是正常的

1表示这个点是房子

2表示这个点因为房子被削低过

 

D

特别感谢@wavator造数据帮我调出这题!

人类智慧题

首先连续的可以缩为一个

考虑两个情况

abababab...

abababab...

我们可以每次换长的ab和短的a

那么例如ababab和ab

那么会这样

ababab

ab

-->

aabab

abb

-->

abab

ab

等于长的那个长度-2

直到长度都为2或者有一个为1有一个位2为止

然后直接做

======================

另一个情况是

ababab...

ba....

这样的情况

那么每次我们交换前面的a和b

那么就例如

ababa

bab

就变成了

ababa

bab

-->

bbaba

aab

-->

baba

ab

等于各删去一位

但是要求第二个是2位以上,如果只有一位就没有效果,这个我们底下会提到

=====================

还有一个情况是一位和另一个长串(2位以上)

那么把长串折半下来

例如abababab-->abab换出来

然后如果是a,我们换出来

也就是abababab a --> aabab abab

如果是b,我们留着

也就是abababab b --> abab ababb

=====================

我们还有一种变化方法,感谢wavator提供这个方面的数据

我们上述方法总会把一个串变化到一位,然后执行操作

如果ab babab的串我们就需要更多步

ab babab --> b abab --> ab ab -->b ab --> a b

一共4步

但是

ab babab --> babb aab ( bab ab ) --> ab b --> b a

一共3步

我们可以在当一个长度为2的时候做补救

如果长度<=4,那么补救没有效果

不然的话,这个补救可以让答案-1

也就是执行上述操作

=====================

综上,这题我写了7K

其实有不少可以简化的

比如上来第一步折半处理就好

不过总归做出来了....

=====================

A

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int a[1000005];int main(){ #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n; scanf("%d",&n); int i; for (i=0;i<2*n;i++) { scanf("%d",&a[i]); } sort(a,a+n+n); long long ans=(long long)(a[n-1]-a[0])*(a[n+n-1]-a[n]); for (i=0;i<=n;i++) { ans=min(ans,(long long)(a[n+n-1]-a[0])*(a[i+n-1]-a[i])); } cout<
<

B

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int fa[1000005];int size[400005];int findroot(int x){ int root; for (root=x;fa[root]!=-1;root=fa[root]) ; int temp; for (;fa[x]!=-1;) { temp=fa[x]; fa[x]=root; x=temp; } return root;}void u(int x,int y){ x=findroot(x); y=findroot(y); if (x==y) return; if (size[x]>size[y]) swap(x,y); fa[x]=y; size[y]+=size[x];}int main(){ #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n,m; scanf("%d%d",&n,&m); int q; scanf("%d",&q); int i; for (i=0;i

C

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int dp[5005][2505][3];int a[5005];const int inf=1999999999;//dp [i][j][0] : normal//dp [i][j][1] : Hill//do [i][j][2] : Being Killedinline int min(int x,int y,int z){ return min(min(x,y),z);}int ans[5005];int main(){ #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n; scanf("%d",&n); int i; for (i=1;i<=n;i++) { scanf("%d",&a[i]); } a[0]=-1; a[n+1]=-1; int j,k; for (i=0;i<=n;i++) { for (j=0;j<=(n+1)/2;j++) { for (k=0;k<3;k++) { dp[i][j][k]=inf; } } ans[i]=inf; } dp[0][0][0]=0; for (i=1;i<=n;i++) { for (j=0;j<=(i+1)/2;j++) { dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1],dp[i-1][j][2]); if (i==1) { dp[i][j][1]=max(0,a[2]-(a[1]-1)); } else { dp[i][j][1]=max(0,a[i+1]-(a[i]-1))+min(max(0,a[i-1]-(a[i]-1))+dp[i-1][j-1][0],max(0,min(a[i-1],a[i-2]-1)-(a[i]-1))+dp[i-1][j-1][2]); } ans[j]=min(ans[j],dp[i][j][1]); dp[i][j][2]=dp[i-1][j][1]; } } for (i=1;i<=(n+1)/2;i++) { printf("%d ",ans[i]); } return 0;}

D

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int get_s[200005];int get_t[200005];vector
> oper;int again_s[200005];int again_t[200005];void calc(char s,char t,int cnt_s,int cnt_t){ int now_s=0,now_t=0; int i; for (;;) { if ((now_s+1>=cnt_s)&&(now_t+1>=cnt_t)) { return; } if (now_s+1==cnt_s) { int k=0; int temp=(cnt_t-now_t)/2; memset(again_s,0,sizeof(again_s)); memset(again_t,0,sizeof(again_t)); for (i=0;i
=5) { if (cnt_s==2) { cnt_s=3; get_s[2]=get_s[1]; get_s[1]=get_s[0]; get_s[0]=0; now_s=1; } oper.push_back(make_pair(get_s[now_s],get_t[now_t]+get_t[now_t+1]+get_t[now_t+2])); get_s[now_s+1]+=get_t[now_t+2]; get_t[now_t+3]+=get_s[now_s]; get_s[now_s]=get_t[now_t+1]; get_s[now_s-1]=get_t[now_t]; now_t+=3; now_s--; } } else if (cnt_t-now_t==2) { if (cnt_s-now_s>=5) { if (cnt_t==2) { cnt_t=3; get_t[2]=get_t[1]; get_t[1]=get_t[0]; get_t[0]=0; now_t=1; } oper.push_back(make_pair(get_s[now_s]+get_s[now_s+1]+get_s[now_s+2],get_t[now_t])); get_t[now_t+1]+=get_s[now_s+2]; get_s[now_s+3]+=get_t[now_t]; get_t[now_t]=get_s[now_s+1]; get_t[now_t-1]=get_s[now_s]; now_s+=3; now_t--; } } oper.push_back(make_pair(get_s[now_s],get_t[now_t])); get_s[now_s+1]+=get_t[now_t]; get_t[now_t+1]+=get_s[now_s]; now_s++; now_t++; } else { if (cnt_s-now_s>cnt_t-now_t) { oper.push_back(make_pair(get_s[now_s]+get_s[now_s+1],get_t[now_t])); get_t[now_t+1]+=get_s[now_s+1]; get_s[now_s+2]+=get_t[now_t]; get_t[now_t]=get_s[now_s]; now_s+=2; } else { if (cnt_t-now_t==2) { oper.push_back(make_pair(0,get_t[now_t])); get_s[now_s]+=get_t[now_t]; now_t++; t='-'; } else { oper.push_back(make_pair(get_s[now_s],get_t[now_t]+get_t[now_t+1])); get_s[now_s+1]+=get_t[now_t+1]; get_t[now_t+2]+=get_s[now_s]; get_s[now_s]=get_t[now_t]; now_t+=2; } } } }}int main(){ #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif ios::sync_with_stdio(false); string s,t; cin>>s>>t; int i; char last_c='-'; int cnt_s=-1; for (i=0;i<(int)s.size();i++) { if (s[i]==last_c) { get_s[cnt_s]++; } else { cnt_s++; get_s[cnt_s]++; last_c=s[i]; } } cnt_s++; last_c='-'; int cnt_t=-1; for (i=0;i<(int)t.size();i++) { if (t[i]==last_c) { get_t[cnt_t]++; } else { cnt_t++; get_t[cnt_t]++; last_c=t[i]; } } cnt_t++; calc(s[0],t[0],cnt_s,cnt_t); printf("%d\n",(int)oper.size()); for (i=0;i<(int)oper.size();i++) { printf("%d %d\n",oper[i].first,oper[i].second); } return 0;}

  

转载于:https://www.cnblogs.com/absi2011/p/9393574.html

你可能感兴趣的文章
jQuery(一)引入
查看>>
一个球从100米高度自由落下,每次落地后反弹回原高度的一半; * 再落下,求在第几次之后反弹高度小于0.1米, * 并计算在这一次落地时共经过多少米?...
查看>>
祝大家圣诞节快乐!
查看>>
html的body内标签之input系列1
查看>>
CSS-hover
查看>>
centOS外部浏览器无法访问tomcat8000端口解决办法
查看>>
html 11 内联(行内)
查看>>
NOIP模拟题 斐波那契数列
查看>>
增删改查
查看>>
【bzoj3261】最大异或和 可持久化Trie树
查看>>
西门子smart200以太网通讯协议
查看>>
ActiveMQ消息存储持久化
查看>>
JAVA SHA1 加密 对应 c# SHA1 加密
查看>>
创建一个没有边框的并添加自定义文字的UISegmentedControl
查看>>
IOS沙盒Files目录说明和常用操作
查看>>
linxu passwd 给linux用户设置密码 命令
查看>>
mongodb的shell命令
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
Android UI体验之全屏沉浸式透明状态栏效果
查看>>
STM32普通定时器(TIM2-7)的时钟源
查看>>