https://ac.nowcoder.com/acm/contest/3002ios
A了7題,感受J應該賽中應該是能夠過的,但沒考慮a是MOD倍數,b又是MOD-1倍數的狀況。。。c++
補的題感受均可作,記錄一下思惟(水一篇博客)。。。ui
A.honoka和格點三角形 就分別以1爲底和以2爲底的統計便可。注意別重複,其實也就是n,m多-1的差異。spa
C.umi和弓道debug
將每一個點與起始點線段與x軸,y軸交點都處理起來,對x軸和y軸的交點分別sort一下,須要找到n-k個擋起來,掃一遍取這些長度中最小的就好了。設計
注意別用int,-2e9到2e9就爆了,用double和ll都過了。code
感受挺簡單的,我咋就沒想到分別處理交點呢。blog
貼個代碼ci
#include <bits/stdc++.h> #ifndef ONLINE_JUDGE #define debug(x) cout << #x << ": " << x << endl #else #define debug(x) #endif using namespace std; typedef long long ll; const int MAXN=2e5+7; const int INF=0x3f3f3f3f; const int MOD=1e9+7; int main() { vector<double>x,y; int x0,y0; scanf("%d%d",&x0,&y0); int n,k; scanf("%d%d",&n,&k); for(int i=0;i<n;++i) { ll a,b; scanf("%lld%lld",&a,&b); if(a*x0<0) y.push_back(y0-1.0*(b-y0)/(a-x0)*(x0)); if(b*y0<0) x.push_back(x0-1.0*(a-x0)/(b-y0)*(y0)); } sort(y.begin(),y.end()); sort(x.begin(),x.end()); double ans=4e18; for(int i=0;i<x.size();++i) { int q=i+n-k-1; if(q>=x.size()) break; ans=min(ans,x[q]-x[i]); } for(int i=0;i<y.size();++i) { int q=i+n-k-1; if(q>=y.size()) break; ans=min(ans,y[q]-y[i]); } if(ans==4e18) puts("-1"); else printf("%.8f\n",ans); return 0; }
F.maki和tree 白色的能dfs到的所有歸爲一個聯通快,標記並記錄這個聯通快的結點數量。而後對於全部的黑色結點,加上他能到的全部白色結點的sum,這些是黑色結點爲一端點,白色結點爲另外一個端點的,再加上對每一個白色結點的ans[]*(sum-ans[]),最後除以2便可,至關於一端點在某一個白色結點上,另外一端點在其餘分治的白色結點上,每一個都算了兩次除掉便可。get
好像也能夠樹上dp作,但設計狀態不太在行。也差很少思路統計答案,好吧我在看看dp咋作的。
#include <bits/stdc++.h> #ifndef ONLINE_JUDGE #define debug(x) cout << #x << ": " << x << endl #else #define debug(x) #endif using namespace std; typedef long long ll; const int MAXN=2e5+7; const int INF=0x3f3f3f3f; const int MOD=1e9+7; int cnt; int vis[MAXN]; vector<int>e[MAXN]; char s[MAXN]; int ans[MAXN]; int sum; void dfs(int u,int fa) { vis[u]=cnt; sum++; for(int i=0;i<e[u].size();++i) { int v=e[u][i]; if(v==fa) continue; if(s[v]=='W' ) dfs(v,u); } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; cin>>(s+1); for(int i=0,x,y;i<n-1;++i) { cin>>x>>y; e[x].push_back(y); e[y].push_back(x); } for(int i=1;i<=n;++i) { sum=0; if(!vis[i]&&s[i]=='W') { cnt++; dfs(i,-1); ans[cnt]=sum; } } ll res=0; for(int i=1;i<=n;++i) { if(s[i]=='B') { int u=i; sum=0; for(int j=0;j<e[u].size();++j) { int v=e[u][j]; if(s[v]=='W') sum+=ans[vis[v]]; } ll t=0; for(int j=0;j<e[u].size();++j) { int v=e[u][j]; if(s[v]=='W') t+=ans[vis[v]]*(sum-ans[vis[v]]); } res+=sum+t/2; } } cout<<res<<endl; return 0; }
I.nico和niconiconi 簡單的遞推轉移。。話說我爲何仍是在想別的題的時候突然纔想到dp作這題,剛開始徹底無法下手。
J.u's的影響力 本場最大坑題(對我而言),結論和式子都沒什麼毛病,就是答案的指數和斐波那契數列相關。
x,y的指數是fib的相鄰兩項
a的指數 fn=fn-1+fn-2+1,這個與前面的fib數列不一樣,再構造一個三維矩陣代碼量太大。但觀察知,正好是前面兩個係數相加-1,由於這個遞推公式和fib差很近,直覺告訴我確定有簡單的公式。
但賽後不能證實。。。。。。。
這裏對指數須要用到歐拉降冪的,就你在矩陣快速冪的時候對MOD-1取模,算實際答案對MOD取模便可。
而後坑點就是,考慮a是MOD的倍數,b是MOD-1的倍數,這樣根據咱們的運算就會出來0^0,快速冪裏返回的是1,其實應該是0。就出現了錯誤,差很少Case 89%左右會WA。
因此這裏減小運算,若是a是MOD的倍數直接輸出0便可。而後就過了。。。
太細節了,這個真的想不太到。艾。。。我能夠之後在快速冪特判0的答案。
不過話說我比賽if 沒return 0也沒else 就等於說n=1和n=2的狀況我也會繼續下面的,但實際上是非法的狀態,致使我TLE了。。。。。找不出bug點,太蠢啦。
#include <bits/stdc++.h> #ifndef ONLINE_JUDGE #define debug(x) cout << #x << ": " << x << endl #else #define debug(x) #endif using namespace std; typedef long long ll; const int Mod = 1e9+6; const int MOD = 1e9+7; const int v=2; struct matrix { ll m[v][v]; }Ans, base; inline void init() { memset(Ans.m, 0, sizeof(Ans.m)); for(int i=0; i<v; i++) Ans.m[i][i] = 1; // memset(base.m, 0, sizeof(base.m)); base={1,1,1,0}; } inline matrix mul(matrix a, matrix b) { matrix res={0}; //memset(res.m, 0, sizeof(res.m)); for(int i=0; i<v; i++) { for(int j=0; j<v; j++) { for(int k=0; k<v; k++) { res.m[i][j] += (a.m[i][k] ) * (b.m[k][j] ); res.m[i][j] %= Mod; } } } return res; } inline void Qmat_pow(ll p) { while (p) { if(p & 1) Ans = mul(Ans, base); base = mul(base, base); p >>= 1; } } ll quick(ll x,ll n) //快速冪 x^n { ll res=1; x%=MOD; while(n) { if(n&1) res=(res*x)%MOD; x=(x*x)%MOD; n>>=1; } return res; } ll quickMUL(ll a,ll b) //快速乘法 a*b { a%=MOD; ll res=0; while(b) { if(b&1) res=(res+a)%MOD; a=(a+a)%MOD; b>>=1; } return res%MOD; } int main() { ll n,f1,f2,a,b; scanf("%lld%lld%lld%lld%lld",&n,&f1,&f2,&a,&b); if(n==1) printf("%lld\n",f1%MOD); else if(n==2) printf("%lld\n",f2%MOD); else if(a%MOD==0) printf("0\n"); else { init(); Qmat_pow(n-3); ll x2=(Ans.m[0][0]+Ans.m[0][1])%Mod; ll x1=(Ans.m[1][0]+Ans.m[1][1])%Mod; ll t=(b%Mod)*((x2+x1-1+Mod)%Mod)%Mod; ll ans1=quick(f2,x2)*quick(f1,x1)%MOD*quick(a,t)%MOD; printf("%lld\n",ans1); } return 0; }