个人背景:

上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了

也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学的id评测过判代码雷同扣100分后while(true) rp--;本次是一个凄惨.....

我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了

我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了

我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了

 

我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了

 

我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了

 

我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了我太弱了

 

-------------------------------------------------------------------------

题目:

http://scarlet.is-programmer.com/user_files/Scarlet/File/COOL's%20Life.pdf

--------------------------------------------------

过程:

第一题在去书城的公交车上就开始想,对于需要快速找到行x,y坐标都大的点,分别找x和y然后取交集怎么样?貌似还是n^2

唉,范围20*20的方格,可以每个宿舍保存在哪里的妹子啊,那样n*400

然后,调试时出现迷之问题,用了vector二维数组,好像是溢出或是什么问题,造数据的循环卡在刚结束,怎么搞都不好

【2016-08-12在win下测试,把频繁的debug输出该少些,n=90000也出结果了,但很慢,洛谷仍re】

 至少会了double取模 呵呵呵

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
typedef long double ld;
const int N=100005,rp=2333333;

int n,cnt=0;
double rxa,rxc,rya,ryc,rza,rzc;
double ans=0;
vector<int> map[21][21];    //num
//int map2[21][21][N];
struct people{
    double x,y;
    int i,j;
    people(){x=0;y=0;i=0;j=0;}
    //int num;
}p[N];

double dmod(double x,int m){
    int t=x;
    int j=t/m;
    return x-j*m;
}
void init(){
    double x=0,y=0,z=0;
    for(int i=1;i<=n;i++){
        x=dmod((y*rxa+rxc),rp);
        y=dmod((z*rya+ryc),rp);
        z=dmod((x*rza+rzc),rp);
        p[i].x=dmod(x,20)+dmod(y,10)/10+dmod(z,10)/100; p[i].i=p[i].x;
        
        x=dmod((y*rxa+rxc),rp);
        y=dmod((z*rya+ryc),rp);
        z=dmod((x*rza+rzc),rp);
        p[i].y=dmod(x,20)+dmod(y,10)/10+dmod(z,10)/100; p[i].j=p[i].y;
        
        //if(i>89000||i%1000==0) printf("%d i %d j %d\n",i,p[i].i,p[i].j);
        map[p[i].i][p[i].j].push_back(i);
        //printf("%d %lf %lf\n",i,p[i].x,p[i].y);printf("hello");
    }        
    return;
}

inline double cal(people &a,people &b){
    return fabs(a.x-b.x)+fabs(a.y-b.y);
}

void solve(){
    for(int i=1;i<=n;i++){
        people &now=p[i];//if(i>89000||i%1000==0) printf(" i %d\n",i);
        for(int x=now.i+1;x<20;x++)
            for(int y=now.j+1;y<20;y++)
               for(int z=0;z<map[x][y].size();z++){
                    ans+=cal(now,p[map[x][y][z]]); cnt++;
                }
    }
}

int main(){//system("pause");
    cin>>n;
    cin>>rxa>>rxc>>rya>>ryc>>rza>>rzc;
    init();
    

    
    //cout<<"p";
    solve();
    if(cnt==0) printf("0.00000");
    printf("%.5f",ans/cnt);
    
    //cout<<"\n\n";
    //for(int i=1;i<=n;i++) printf("p  %d  %lf %lf %d %d\n",i,p[i].x,p[i].y,p[i].i,p[i].j);
}
View Code

相关文章: