今天做的最错误的决定就是在食堂写代码,看别人过521(泪目)
我是用单调栈写的,正反求一次最近的0的距离,0特判
#include<bits/stdc++.h>
using namespace std;
#define init ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
const int N=2e5+5;
int a[N],b[N];
int n;
int stk[N];
int tt;
int main(){
init
cin>>n;
memset(b,0x3f,sizeof b);
for(int i=1;i<=n;i++){
cin>>a[i];
if(!a[i]) b[i]=0;
}
for(int i=1;i<=n;i++){
while(tt&&a[stk[tt]]) tt--;
if(tt) b[i]=min(b[i],abs(i-stk[tt]));
if(!a[i]) stk[++tt]=i;
}
tt=0;
for(int i=n;i>=1;i--){
while(tt&&a[stk[tt]]) tt--;
if(tt) b[i]=min(b[i],abs(i-stk[tt]));
if(!a[i]) stk[++tt]=i;
}
for(int i=1;i<=n;i++){
cout<<b[i];
if(i!=n) cout<<" ";
}
}
解方程嘛。。。
#include<bits/stdc++.h>
using namespace std;
#define init ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
const int N=2e5+5;
double eps=1e-6;
int main(){
init
int t;cin>>t;
while(t--){
int d;cin>>d;
if(d==0){
printf("Y 0.0000000000 0.0000000000\n");
}else if(d<4){
printf("N\n");
}else{
double td=(double)sqrt(d*1.0*d/4-d);
double a=td+d*1.0/2;
double b=d*1.0-a;
if(a<0||b<0||abs(a*b-d)>=eps){
a=d*1.0/2-td;
b=d*1.0-a;
}else{
printf("Y %.10f %.10f\n",a,b);
continue;
}
if(a<0||b<0||abs(a*b-d)>=eps){
printf("N\n");
}else{
printf("Y %.10f %.10f\n",a,b);
}
}
}
}