模擬測試20191004

2022-02-03 12:57:01 字數 1777 閱讀 4429

如果直接暴力建圖跑bfs時空複雜度都是$o(n^)$的,考慮怎麼優化bfs的過程

我們發現主要瓶頸在於有許多點被掃到了多次

考慮用乙個set存剩下的點,

由於每個點能走到的點在相同奇偶性下是連續的,我們把奇數和偶數分開來存

每次用乙個點擴充套件時找到他能走的區間,把這些點從set裡刪掉就好了

注意區間範圍

複雜度$o(nlogn)$

我至今都對於自己考試時能想出來這個容斥而驚訝

我們顯然的發現a和b的順序對答案沒有影響

考慮把兩個陣列排序

通過手模(打表)我們發現每個點能控制的是乙個l形

但是l形不好統計,由於l可以分成兩個矩形,考慮乙個矩形怎麼統計答案

設$s$,表示當前的$min(a,b)$,$f[i]$表示當前至少有i行不滿足的方案數

則有$ f[i]=c_^\times (s^\times ((s+1)^-s^))^ $

$ans=\sum_^(-1)^\times f[i] $

那麼乙個l形也就很顯然了

有$  f[i]=c_^\times (s^\times ((s+1)^-s^))^\times (s^\times (s+1)^)^ $

大神題,我不會

大臉太巨了

1

//注意 因為出題人過於弱智2//

本題中odd為偶數,even為奇數

3 #include4

using

namespace

std;

5const

int n=1030;6

intn,mod;

7int qpow(int x,int k,int ans=1)13

return

ans;14}

15//

dp為答案

16//

f為題解中dp陣列

17int

dp[n][n],f[n][n],g[n][n],vis[n],inv[n],cnt[n],odd[n],pos[n];

18int

main()

30 ++cnt[mx=pr-pl>>1]; odd[mx]+=pr-pl&1

;31 pos[i]=pl+mx; vis[pl+mx]=true;32

}33int sum=n;

34for(int i=1;i<=n;++i)

52if(cnt[i]-odd[i])57}

58for(int u=l;u<=p;++u) (dp[l+j-1][pos[u]]+=oddw)%=mod,(dp[l+j-1][pos[u]+1]+=oddw)%=mod;//

累加答案

59for(int u=p+1;u<=r;++u) (dp[l+j-1][pos[u]]+=evenw)%=mod;//

這裡存在疑問 似乎將偶數區間預設加給了前面的pos60}

61for(int j=l;j<=p;++j)69}

70for(int v=l;v<=r;++v) for(int u=r+1;u<=n;++u) dp[u][v]=g[u][v],g[u][v]=0;71

}72}73 sum-=cnt[i];//

考慮下一層 剩餘人數減少74}

75for(int i=1;i<=n;i++,puts("")) for(int j=1;j<=n;j++) printf("

%d "

,dp[i][j]);

76return0;

77 }

skyh傾情壓行注釋std

20191004機房測試 ZGY的早餐

zgy 每天早上要從宿舍走路到機房,順便從學校小賣部購買早飯,當然機智的 zgy 一定會走最短路 學校的路可以看成一無向聯通張圖,圖上有 n 個點,m 條邊,每乙個點都有乙個唯一的編號 1 n 每一條邊有乙個邊權,表示兩個點之間的距離,zgy 的宿舍在 s 點,機房在 t點,而小賣部在 h 點 現在...

20191004機房測試 C 錦標賽

有乙個比賽已經有 n 個人參加,並且互相之間已經進行了比賽 每乙個人都有乙個得分用於最後排名 你作為第 n 1 個參賽者,需要與之前的每乙個人打一場比賽,初始得分為 0 對於每場比賽,有兩個人參加,不會存在平局,勝者得分增加 1,敗者得分不變 最後按照得分從高到低來排名,假設有人與你最終得分相同 那...

csp模擬 模擬測試16

fdasds include using namespace std define cle a memset a,0,sizeof a inline int read const int mod 1e9 7,maxn 1e3 100 int n,m,ans 0 int f maxn maxn int...