Logo dfdf_zhaozekai的博客

博客

xinyun

2024-03-30 14:35:18 By dfdf_zhaozekai
#include<bits/stdc++.h>
#define int long long

using namespace std;

const double eps=5e-4;
const int INF=1e4,mod=1e9+7;

int cur;
static int rdm=1e6;

int real_rand(){
    rdm=rdm*rdm+rand();
    rdm%=mod;
    return rdm;
}//??????? 
bool fail(double prob){
    return (real_rand()%INF)>=prob*INF;
}//?????????? 

int limited_rand(int minx,int maxn){
    return real_rand()%(maxn-minx+1)+minx;
}//????????? 
double double_rand(double minx,double maxn){
    return (double)limited_rand(minx*INF,maxn*INF)/(double)INF;
}//??????????
void adjust(double &gen,double noise_val){
    if (noise_val>gen) gen=(0.25*gen+0.75*noise_val);
} 


const double nbl_r_min=10,nbl_r_max=30;//?????? 
const double nbl_den_min=0.4,nbl_den_max=0.6;//?????? 
struct nbl_dot{
    double x,y;//??
    double r;//????
    double den;//??
    nbl_dot(){
        r=double_rand(nbl_r_min,nbl_r_max);//?????
        x=-2.0*r-10.0;y=cur;//?????
        den=double_rand(nbl_den_min,nbl_den_max);//?????
    }
    double dis(){
        return sqrt(pow(x,2)+pow(y-cur,2));
    }//???????? 
    double den_val(){
        return (1.0-dis()/r)*den;
    }//????
};
bool nbl_touched(nbl_dot x1,nbl_dot y1){
    return sqrt(pow(x1.x-y1.x,2)+pow(x1.y-y1.y,2))<=0.8*(x1.r+y1.r);
}
vector<nbl_dot> nbl;
void nbl_add(){
    struct nbl_dot tmp=nbl_dot();
    if (!nbl.empty()&&abs(tmp.x-nbl[nbl.size()-1].x)<=10.0){
        if (fail(4e-3)) return;
    }//???????? 
    else if (fail(5e-4)) return;//?????
    nbl.push_back(tmp);

    int tmp_cnt1=0,tmp_cnt2=0;
    double tmp_sum1=0.0,tmp_sum2=0.0;
    for(int i=0;i<nbl.size()-1;i++){
        if (nbl_touched(nbl[i],nbl[nbl.size()-1])){
            tmp_cnt1++;
            tmp_sum1+=nbl[i].y;
        }
        else{
            tmp_cnt2++;
            tmp_sum2+=2*nbl[nbl.size()-1].y-nbl[i].y;
        }
    }
    if (tmp_cnt1){
        nbl[nbl.size()-1].y+=0.5*tmp_sum1;
        nbl[nbl.size()-1].y/=0.5*(double)tmp_cnt1+1.0;//???????? 
    }
    else{
        nbl[nbl.size()-1].y+=tmp_sum2;
        nbl[nbl.size()-1].y/=(double)tmp_cnt2+1.0; //??????
    }
}//?????
void nbl_adj_den(double &den){
    for(int i=0;i<nbl.size();i++) adjust(den,nbl[i].den_val());
}//???? 
void nbl_release(){
    while(!nbl.empty()&&nbl[0].x>nbl[0].r) nbl.erase(nbl.begin());
}//?? 



const double pln_r_min=10.0,pln_r_max=70.0;//??????
const double pln_den=0.8;
struct pln_dot{
    double x,y;//??
    double r;//??
    pln_dot(){
        r=double_rand(pln_r_min,pln_r_max);//?????
        x=-2.0*r-10.0;y=cur;//?????
    }
    int id(){
        if (r<=20) return 1;
        else if (r<=40) return 2;
        else return 3;
    }//???? 
    double dis(){
        return sqrt(pow(x,2)+pow(y-cur,2));
    }//???????? 
    double den_val(){
        if (dis()<=0.8*r) return 0.9;//???? 
        if (id()==1) return 0.0;//???? 
        else if (id()==2){
            if (dis()>=1.1*r&&dis()<=1.6*r) return 0.6;
            return 0.0;
        }//???? 
        else{
            if (dis()>=1.2*r&&dis()<=1.35*r||dis()>=1.75*r&&dis()<=1.8*r) return 0.66;
            else if (dis()>=1.35*r&&dis()<=1.75*r) return 0.3;
            else return 0.0;
        }//???? 
        //??? 
    }//???? 
    double sz(){
        if (id()==1) return r;
        else if (id()==2) return 1.6*r;
        else return 1.8*r;
    }//???? 
};//?? 
bool pln_touched(pln_dot x1,pln_dot y1){
    return sqrt(pow(x1.x-y1.x,2)+pow(x1.y-y1.y,2))<=x1.sz()+y1.sz();
}
vector<pln_dot> pln;
void pln_check();
void pln_add(){
    if (fail(1e-3)||fail(5e-2)) return;//?????
    if (fail(pow(0.5,pln.size()))) return;//???????? 
    pln.push_back(pln_dot());
    pln_check();
}//????
void pln_adj_den(double &den){
    for(int i=0;i<pln.size();i++) adjust(den,pln[i].den_val());
}//????
void pln_check(){
    if (pln[pln.size()-1].id()==3){
        if (fail(0.25)) pln[pln.size()-1].r=double_rand(20.0,40.0);
    }
    if (pln[pln.size()-1].id()==2){
        if (fail(0.5)) pln[pln.size()-1].r=double_rand(10.0,20.0);
    }//?????? 

    for(int i=0;i<pln.size()-1;i++){
        if (pln_touched(pln[i],pln[pln.size()-1])){
            pln.erase(pln.begin()+pln.size()-1);return;
        }
    }//???? 
}
void pln_release(){
    while(!pln.empty()&&pln[0].x>pln[0].sz()) pln.erase(pln.begin());
}//??



void up(){
    for(int i=0;i<nbl.size();i++) nbl[i].x+=2.0;
    for(int i=0;i<pln.size();i++) pln[i].x+=2.0;
}//???? 
void print(double &den){
    putchar(fail(den)?' ':'.');
    for(int i=1;i<=100000;i++);
    if(cur==235){
        putchar('\n');
        cur=0;
        up();
    }
    else ++cur;
    den=0.01;
}//????????? 

void add(){
    nbl_add();pln_add();
}
void adj_den(double &den){
    nbl_adj_den(den);pln_adj_den(den);
}
void release(){
    nbl_release();pln_release();
}
signed main(){
    srand(time(0));
    for(;;release()){
        double den=0.01;
        add();
        adj_den(den);
        print(den);
    }
    return 0;
}

评论

dfdj_zhangjinfeng
keybd_event('W',0,0,0); keybd_event('W',0,KEYEVENTF_KEYUP,0);