真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

CCFCSP認(rèn)證2022年6月歸一化處理、尋寶!大冒險(xiǎn)!、光線追蹤-創(chuàng)新互聯(lián)

這是我第一次參加了這次CSP考試,300分,寫(xiě)了124三題,模擬題到現(xiàn)在都沒(méi)看過(guò)題面沒(méi)看,笑,t4寫(xiě)成模擬加數(shù)據(jù)結(jié)構(gòu),200+行,因?yàn)橐粋€(gè)小錯(cuò)誤調(diào)了1h,錯(cuò)失了大好機(jī)會(huì)??荚嚟h(huán)境的VSC配置的字體太小,甚至連空格都看不清有還是沒(méi)有,當(dāng)時(shí)沒(méi)想到可以重新配置,這可能也是我t4調(diào)了1h的原因。

創(chuàng)新互聯(lián)公司,是成都地區(qū)的互聯(lián)網(wǎng)解決方案提供商,用心服務(wù)為企業(yè)提供網(wǎng)站建設(shè)、成都app軟件開(kāi)發(fā)、小程序設(shè)計(jì)、系統(tǒng)定制設(shè)計(jì)和微信代運(yùn)營(yíng)服務(wù)。經(jīng)過(guò)數(shù)十載的沉淀與積累,沉淀的是技術(shù)和服務(wù),讓客戶少走彎路,踏實(shí)做事,誠(chéng)實(shí)做人,用情服務(wù),致力做一個(gè)負(fù)責(zé)任、受尊敬的企業(yè)。對(duì)客戶負(fù)責(zé),就是對(duì)自己負(fù)責(zé),對(duì)企業(yè)負(fù)責(zé)。

距離下一次CSP考試考試還有20天左右,特此回顧。代碼均為考試時(shí)提交的代碼,補(bǔ)充思路。


T1 歸一化處理 思路

數(shù)據(jù)歸一化處理,根據(jù)給定公式進(jìn)行計(jì)算。

在這里插入圖片描述
在這里插入圖片描述
這里要求了輸出精度,通過(guò)流的格式標(biāo)志值 i o s _ b a s e : : f i x e d ios\_base::fixed ios_base::fixed和 s e t p r e c i s i o n ( ) setprecision() setprecision()設(shè)置輸出小數(shù)點(diǎn)后10位。

cout<< fixed<< setprecision(10)<< (a[i] - av) / sD<< '\n';
代碼
void solve() {int n; cin >>n;

    vectora(n);
    double sum = 0;
    for (int i = 0; i< n; i++) cin >>a[i], sum += a[i];
    double av = sum / n;

    double sD = 0;
    for (int i = 0; i< n; i++) {sD += (a[i] - av) * (a[i] - av);
    }
    sD /= n;
    sD = sqrt(sD);

    for (int i = 0; i< n; i++) {cout<< fixed<< setprecision(10)<< (a[i] - av) / sD<< '\n';
    }
}
T2 尋寶!大冒險(xiǎn)! 思路

在這里插入圖片描述
給定一個(gè)大矩陣 L L L和小矩陣 S S S,均為01矩陣,問(wèn) L L L有多少處和 S S S匹配( L L L有多少個(gè)子矩陣和 S S S相等)。
暴力匹配,時(shí)間為 O ( L 2 S 2 ) O(L^2S^2) O(L2S2),雖然一旦不匹配就可以終止,但樂(lè)觀估計(jì)不優(yōu)于 O ( L 2 ) O(L^2) O(L2).
因此,需要采取一些方法,注意到 n ≤ 1000 n\leq 1000 n≤1000,即‘1’的個(gè)數(shù)不超過(guò)1000,而且
在這里插入圖片描述
因此從大矩陣‘1’的位置開(kāi)始匹配,理論復(fù)雜度為 O ( n × S 2 ) O(n\times S^2) O(n×S2),約為 2.5 e 6 2.5e6 2.5e6,時(shí)間上可以過(guò),但是還有空間的問(wèn)題,無(wú)法開(kāi) 1 e 18 1e18 1e18的 b o o l bool bool數(shù)組,因此用 s e t < p a i r < i n t , i n t > > set> set>僅存儲(chǔ)‘1’的坐標(biāo),匹配時(shí)要調(diào)用 f i n d ( ) find() find()方法找大矩陣中的對(duì)應(yīng)位置,犧牲時(shí)間換空間,因此最終時(shí)間為 O ( n l o g n × S 2 ) O(nlogn\times S^2) O(nlogn×S2),約為 2.5 e 7 2.5e7 2.5e7.

代碼
set>Set;
vector>a, b;

void solve() {int n, L, S;
    cin >>n >>L >>S;

    int x, y;
    for (int i = 1; i<= n; i++) {cin >>x >>y;
        Set.insert({x, y});
    }

    int m;
    for (int i = 0; i<= S; i++) {for (int j = 0; j<= S; j++) {cin >>m;
            if (m) {a.push_back({S - i, j});    // a tree
            }
            else b.push_back({S - i, j});
        }
    }
    int ans = 0;
    for (auto i : Set) {if (i.first + S >L || i.second + S >L) continue;
        bool ok = 1;
        // cout<< "i: "<< i.first<< ' '<< i.second<< '\n';
        for (auto j : a) {// cout<< "j: "<< j.first<< ' '<< j.second<< '\n';
            int tx = i.first + j.first;
            int ty = i.second + j.second;
            // cout<< tx<< ' '<< ty<< '\n';
            if (Set.find({tx, ty}) == Set.end()) {ok = 0;
                break;
            }
        }

        for (auto j : b) {if (!ok) break;
            int tx = i.first + j.first;
            int ty = i.second + j.second;
            // cout<< tx<< ' '<< ty<< '\n';
            if (Set.find({tx, ty}) != Set.end()) {ok = 0;
                break;
            }
        }
        if (ok) ans++;
    }

    cout<< ans<< '\n';
}
T4 光線追蹤 思路

原來(lái)這題是圖形學(xué)的背景,這學(xué)期剛剛在學(xué)CG,確實(shí)CG中很多用數(shù)據(jù)結(jié)構(gòu)優(yōu)化(比如多邊形填充的APT)的算法。
在這里插入圖片描述
限制了光線只能水平或者豎直地射,包括反射后的光線,而反射面的端點(diǎn)坐標(biāo)均為整數(shù),光源也設(shè)置在整點(diǎn)位置,因此可以認(rèn)為光線在網(wǎng)格格線上運(yùn)動(dòng),更進(jìn)一步,可以認(rèn)為反射面只設(shè)定在格點(diǎn)上。
在這里插入圖片描述
光線在反射過(guò)程中存在耗散。
在這里插入圖片描述
1,2定義了反射面的增刪操作,3設(shè)置光源詢問(wèn) t t t時(shí)間后,光線的位置 ( x , y ) (x,y) (x,y),以及剩余光線強(qiáng)度 I I I。
在這里插入圖片描述
這個(gè) 3 e 5 3e5 3e5的保證意味著可以 O ( n ) O(n) O(n)地將反射面的性質(zhì)(耗散率,放置方向)存儲(chǔ)(或者移除)到一定區(qū)間的格點(diǎn)中,用格點(diǎn)代表反射面,格點(diǎn)數(shù)就是 ∑ ∣ x 1 ? x 2 ∣ \sum|x_1-x_2| ∑∣x1??x2?∣.
在這里插入圖片描述
網(wǎng)格大小為 1 e 9 2 1e9^2 1e92,因此必須不能 O ( t ) O(t) O(t)模擬光線的運(yùn)動(dòng)。光線的運(yùn)動(dòng)狀態(tài)通過(guò)當(dāng)前位置 ( x , y ) (x,y) (x,y)和方向 d d d,如果 d d d不變,可以 O ( 1 ) O(1) O(1)確定 t t t時(shí)間后的位置,而 d d d變化由反射引起,反射是由于經(jīng)過(guò)了反射面,即具有反射性質(zhì)的格點(diǎn)(下稱為格點(diǎn))。

  1. 如何快速找到該點(diǎn)? s e t set set上二分,將反射點(diǎn)存儲(chǔ)于 s e t set set中,從當(dāng)前點(diǎn) ( x , y ) (x,y) (x,y)出發(fā)找第一個(gè)反射點(diǎn)。
  2. 通過(guò) m a p < l l , s e t < l l > > map> map>嵌套STL存儲(chǔ),分別存儲(chǔ)X,Y方向每條線上的反射點(diǎn),其實(shí)一開(kāi)始,我用了 s e t < i n t > s e t X [ 2 ? N ] setsetX[2 * N] setsetX[2?N],提交后RE了,因?yàn)樽鴺?biāo)可能為負(fù)數(shù),而下標(biāo)不能為負(fù),然后第一次想到了這種用法,將數(shù)組下標(biāo)范圍擴(kuò)大至負(fù)數(shù)域,而且是動(dòng)態(tài)地開(kāi)辟空間,不用為內(nèi)存限制而煩惱!

結(jié)合代碼講講:
定義了結(jié)構(gòu)體 m i r r o r mirror mirror,解決題目規(guī)定的對(duì)反射面整體的增加和刪除操作,對(duì)應(yīng)結(jié)構(gòu)體方法 i n i t init init和 c l r clr clr,而 r e s e t reset reset是將反射性質(zhì)賦予區(qū)域中的格點(diǎn),就是將該點(diǎn)存儲(chǔ)于 m a p < l l , s e t < l l > > map> map>, c l r clr clr中實(shí)現(xiàn)了移除,下面這句是進(jìn)行空間的回收,動(dòng)態(tài)性!其實(shí)這里可以將 i n i t init init和 r e s e t reset reset合在一起寫(xiě)。

if (setX[x].size() == 0) setX.erase(x);

w o r k work work函數(shù)模擬光線的運(yùn)動(dòng),是遞歸函數(shù),輸入?yún)?shù) x , y x,y x,y是當(dāng)前坐標(biāo), d d d是方向, I I I是強(qiáng)度, t t t是詢問(wèn) t t t時(shí)刻后的位置。

void work(ll x, ll y, int d, double I, ll t) {

這個(gè)函數(shù)我按照運(yùn)動(dòng)方向分為了4個(gè)部分寫(xiě),因?yàn)槊總€(gè)方向上 s e t set set調(diào)用的二分方法不同, u p p e r _ b o u n d upper\_bound upper_bound或者 l o w e r _ b o u n d lower\_bound lower_bound,而且邊界情況也不好統(tǒng)一表達(dá),只能 i f e l s e ifelse ifelse分類討論了。
具體看一種情況,光線沿著 x x x軸增加:
此時(shí) y y y不變,首先判斷該格線上是否有反射點(diǎn),沒(méi)有訪問(wèn)會(huì)RE:

if (setY.find(y) == setY.end()) {

若沒(méi)有,則一直前進(jìn);否則,則調(diào)用 s e t set set自帶的二分方法:

auto it = setY[y].upper_bound(x);   // 找到第一個(gè)大于x的數(shù)

若沒(méi)有找到這樣的反射點(diǎn),則一直前進(jìn);否則可能發(fā)生發(fā)射,還要檢查到達(dá)該點(diǎn)的用時(shí),時(shí)間充足發(fā)生反射,寫(xiě)到這里大家肯定發(fā)現(xiàn)這是道具有大模擬性質(zhì)的t4了。
發(fā)生反射,由于光線原來(lái)方向沿 x x x增加,只可能變?yōu)檠? y y y方向增加或者減少,這個(gè)通過(guò)鏡子的放置方向確定,遞歸。

代碼
const int N = 1e5 + 5;
const int maxn = 1e5 + 5;

// setsetX[2 * N];
// setsetY[2 * N];

map>setX;
map>setY;
map, int>mp;

struct  mirror
{void init(int ID, ll a1, ll b1, ll a2, ll b2, double A) {id = ID;
        x1 = a1; y1 = b1; x2 = a2; y2 = b2; a = A;
    }
    void reset() {if (x1 >x2) dx = -1;
        else dx = 1;
        if (y1 >y2) dy = -1;
        else dy = 1;

        ll x = x1 + dx, y = y1 + dy;
        while (x != x2) {setX[x].insert(y);
            setY[y].insert(x);
            mp[{x, y}] = id;    // 將點(diǎn)對(duì)應(yīng)至鏡子
            x += dx; y += dy;
        }
    }
    void clr() {ll x = x1 + dx, y = y1 + dy;
        while (x != x2) {setX[x].erase(y);
            setY[y].erase(x);
            if (setX[x].size() == 0) setX.erase(x);
            if (setY[y].size() == 0) setY.erase(y);
            mp.erase({x, y});
            x += dx; y += dy;
        }
    }
    int id;
    ll x1, y1, x2, y2;
    int dx, dy;
    double a;
} M[maxn];

void work(ll x, ll y, int d, double I, ll t) {// cout<< "work: "<< x<< ' '<< y<< ' '<< d<< ' '<< I<< ' '<< t<< '\n';
    
    if (I< 1.0) {// 已經(jīng)完全耗散
        cout<< "0 0 0\n";
        return;
    }
    // if (x< 0 || y< 0) return;
    if  (d == 0) {// x ->沿著x軸增加
        if (setY.find(y) == setY.end()) {cout<< x + t<< ' '<< y<< ' '<< (int)I<< '\n';
            return;
        }
        auto it = setY[y].upper_bound(x);   // 找到第一個(gè)大于x的數(shù)
        if (it == setY[y].end()) {// 若無(wú)則代表沒(méi)有鏡子
            cout<< x + t<< ' '<< y<< ' '<< (int)I<< '\n';
            return;
        }
        else {ll nx = *it;
            if (t< nx - x) {// 看剩余時(shí)間是否充足
                cout<< x + t<< ' '<< y<< ' '<< (int)I<< '\n';
                return;
            }
            int mir = mp[{nx, y}];  // 進(jìn)行一次反射
            auto Mir = M[mir];
            if (Mir.dx * Mir.dy >0) {// 判斷鏡子方向
                work(nx, y, 1, I * Mir.a, t - (nx - x));
            }
            else {work(nx, y, 3, I * Mir.a, t - (nx - x));
            }
        }
    }
    else if (d == 1) {// y ^
        if (setX.find(x) == setX.end()) {cout<< x<< ' '<< y + t<< ' '<< (int)I<< '\n';
            return;
        }
        auto it = setX[x].upper_bound(y);
        if (it == setX[x].end()) {cout<< x<< ' '<< y + t<< ' '<< (int)I<< '\n';
            return;
        }
        else {ll ny = *it;
            if (t< ny - y) {cout<< x<< ' '<< y + t<< ' '<< (int)I<< '\n';
                return;
            }
            int mir = mp[{x, ny}];
            auto Mir = M[mir];
            if (Mir.dx * Mir.dy >0) {work(x, ny, 0, I * Mir.a, t - (ny - y));
            }
            else {work(x, ny, 2, I * Mir.a, t - (ny - y));
            }
        }
    }
    else if (d == 2) {// x<- 沿著x軸減少
        if (setY.find(y) == setY.end()) {cout<< x - t<< ' '<< y<< ' '<< (int)I<< '\n';
            return;
        }
        auto it = setY[y].lower_bound(x);
        if (it == setY[y].begin()) {// 沒(méi)有小于x的數(shù)
                cout<< x - t<< ' '<< y<< ' '<< (int)I<< '\n';
                return;
        }
        else {it--;   // 第一個(gè)小于x的數(shù)
            ll nx = *it;
            if (t< x - nx) {cout<< x - t<< ' '<< y<< ' '<< (int)I<< '\n';
                return;
            }
            int mir = mp[{nx, y}];
            auto Mir = M[mir];
            if (Mir.dx * Mir.dy >0) {work(nx, y, 3, I * Mir.a, t - (x - nx));
            }
            else {work(nx, y, 1, I * Mir.a, t - (x - nx));
            }
        }
    }
    else if (d == 3) {// y v
        if (setX.find(x) == setX.end()) {cout<< x<< ' '<< y - t<< ' '<< (int)I<< '\n';
            return;
        }
       auto it = setX[x].lower_bound(y);
        if (it == setX[x].begin()) {cout<< x<< ' '<< y - t<< ' '<< (int)I<< '\n';
                return;
        }
        else {it--; 
            ll ny = *it;
            if (t< y - ny) {cout<< x<< ' '<< y - t<< ' '<< (int)I<< '\n';
                return;
            }
            int mir = mp[{x, ny}];
            auto Mir = M[mir];
            if (Mir.dx * Mir.dy >0) {work(x, ny, 2, I * Mir.a, t - (y - ny));
            }
            else {work(x, ny, 0, I * Mir.a, t - (y - ny));
            }
        }
    }
}

void solve() {int m; cin >>m;

    ll op, x1, y1, x2, y2, d, t, k;
    double a, I;
    for (int i = 1; i<= m; i++) {cin >>op;

        if (op == 1) {cin >>x1 >>y1 >>x2 >>y2 >>a;
            M[i].init(i, x1, y1, x2, y2, a);    // 添加反射鏡
            M[i].reset();
        }
        else if (op == 2) {cin >>k;
            M[k].clr();
        }
        else if (op == 3) {cin >>x1 >>y1 >>d >>I >>t;
            if (t == 0) {cout<< x1<< ' '<< y1<< ' '<< (int)I<< '\n';
            }
            work(x1, y1, d, I, t);
        }
    }
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


名稱欄目:CCFCSP認(rèn)證2022年6月歸一化處理、尋寶!大冒險(xiǎn)!、光線追蹤-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://weahome.cn/article/dghsoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部