CF1394C Boboniu和线
题解
好妙的一道题。
将每个串都抽象成二维平面上的一个点\((x_i,y_i)\),\(x_i\)为其中普通的个数,\(y_i\)为B的个数。
二分答案\(中\),那么对于一个点\((x_i,y_i)\),能通过不超过\(中间\)次操作到达它的点的范围是一个凸六边形,所以可以用不等式描述这个范围:
\[\begin{aligned}
x_i-mid\le x\le x_i mid\\
y_i-mid\le x\le y_i mid\\
x _ I-y _ I-中间\ le x-y \ le x _ I-y _ I中间\
\ end {对齐}
\]对所有的\(i\),将以上范围求交即可。
有些细节。
代码
#包含cstdio
#包含cstring
#包含cctype
#包含算法
#包含实用程序
使用命名空间标准;
#定义For(Ti,Ta,Tb)For(int Ti=(Ta);ti=(Tb);Ti)
#为(int Ti=(Ta)定义Dec(Ti、Ta、Tb);ti=(Tb);- Ti)
templatetypename T
无效读取(T _ x){ 0
_ x=0;int _ f=1;
char _ ch=getchar();
while(!是数字(_ ch))_ f=(_ ch=='-'-1: _ f),_ ch=getchar();
而(是数字(_ ch))_ x=_ x * 10(_ch^48),_ch=getchar();
_ x *=_ f;
}
templatetypename T,typename.一个参数名
void Read(T _x,Args.其他){ 0
read(_ x);阅读(其他.);
}
typedef长ll长
typedef pairint,int Point
const int N=3e5 5,Len=5e5 5
int n;
点要点
点检查(中间)(
int xmin=-Len,xmax=Len,ymin=-Len,ymax=Len,xymin=-Len,xymax=Len
对于(I,1,n){ 0
xmin=max(xmin,poi[i]).第一次中);
xmax=min(xmax,poi[i]).第一个mid);
ymin=max(ymin,poi[i]).秒中);
ymax=min(ymax,poi[i]).第二个mid);
xymin=max(xymin,poi[i]).第一点。秒中);
xymax=min(xymax,poi[i]).第一点。第二个mid);
}
xmin=max(0,xmin),ymin=max(0,ymin);
if(xminxmax | | yminymax | | xyminxymax)返回{0,{0,0 } };
int xymn=xmin-ymax,xymx=xmax-ymin;
if(xymnxymax||xymxxymin)返回{0,{0,0 } };
xymax=min(xymax,xymx);
xymin=max(xymin,xymn);
int pxmax=min(ymax xymax,xmax),pymax=min(pxmax-xymin,ymax);
返回{1,{pxmax,pymax } }
}
int main(){ 0
read(n);
充电温度[Len];
对于(I,1,n){ 0
scanf("% s ",temp 1);
int len=strlen(temp 1),CNT=0;
对于(j,1,len){ 0
cnt=温度[j]==' N ';
}
poi[i]={cnt,len-CNT };
}
int l=0,r=1e6
点美国国家标准(American National Standards的缩写)
while(lr){ 0
int mid=(l r)1;
如果(检查(中间))。首先)r=中间,ans=检查(中间)。第二;
否则l=mid 1;
}
printf('%d\n ',l);
对于(I,1,ans。首先)放char(' N ');
对于(I,1,ans。第二)放char(' B ');
返回0;
}
作者:阿兰_赵
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/52105.html