如果直接暴力建圖跑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)^)^ $
大神題,我不會
大臉太巨了
1skyh傾情壓行注釋std//注意 因為出題人過於弱智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 }
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...