HHKB Programming Contest 2020 总结
生活随笔
收集整理的這篇文章主要介紹了
HHKB Programming Contest 2020 总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
A - Keyboard
簽到題1
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; int main() {IO;int T=1;//cin>>T;while(T--){char x,y;cin>>x>>y;if(x=='Y') cout<<char(y-32)<<'\n';else cout<<y<<'\n';}return 0;}B - Futon
對于每個.我們只考慮向右和向下能不能放置即可,這樣計數不會重復。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=110; char g[N][N]; int n,m; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++) cin>>g[i]+1;int res=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(g[i][j]=='#') continue;if(i<n&&g[i+1][j]=='.') res++;if(j<m&&g[i][j+1]=='.') res++;}cout<<res<<'\n';}return 0;}C - Neq Min
維護一個cnt[]和當前答案res,來一個數就添加一個數,答案掃描cnt[]數組即可。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int a[N],n; int cnt[N]; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int res=0;for(int i=1;i<=n;i++){cnt[a[i]]++;while(cnt[res]) res++;cout<<res<<'\n';}}return 0; }D - Squares
大佬題解
方法非常巧妙投影,舉體解釋可以參考上述題解。
如果兩個正方形在二維平面內相交,那么將兩個正方形投影到x軸上會出現兩條線段,這兩條線段一定相交,同理投影到y軸也一定相交。
由上述性質不難看出我們只需要計算兩條線段相交或者不相交的方案數,這個是非常容易的可以參考上述題解的方法。
那么最后答案一定是:X軸不相交的方案數(Y軸隨意)+++ X軸相交但是Y不相交的方案數
或者是:總方案數?-?X軸相交且Y軸相交的方案數
D題非常數學,當時這個投影的方法還是非常巧妙的,學習了
E - Lamps
剛開始TLE了,做了個預處理就A了
會做F題不會D的菜雞
不難想到要單獨考慮每一個.點最答案的貢獻
不妨設.的數量是cnt
如果g[i][j]=='.'那么考慮什么情況下對答案有貢獻?如果能夠點亮該點的點數量是w那么最終這個點對答案的貢獻即是(2w?1)2cnt?w(2^w-1)2^{cnt-w}(2w?1)2cnt?w,只要能點亮該點的一個點點亮即可,不能控制該點的隨意。
然后預處理每個點能由多少個點點亮即可。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=2010; const ll mod=1e9+7; char g[N][N]; int n,m; ll base[N*N]; int w[N][N]; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++) cin>>g[i]+1;int cnt=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) cnt+=(int)g[i][j]=='.';base[0]=1;for(int i=1;i<=cnt;i++) base[i]=base[i-1]*2%mod;// 預處理數組for(int i=1;i<=n;i++){int j=1;while(j<=m){while(g[i][j]=='#') j++;int now=1,k=1;while(j+k<=m&&g[i][j+k]=='.') now++,k++;for(int p=j;p<j+k;p++) w[i][p]+=now;j=j+k;}}for(int i=1;i<=m;i++){int j=1;while(j<=n){while(g[j][i]=='#') j++;int now=1,k=1;while(j+k<=n&&g[j+k][i]=='.') now++,k++;for(int p=j;p<j+k;p++) w[p][i]+=now;j=j+k;}}// 計算答案ll res=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(g[i][j]=='#') continue;int now=w[i][j]-1;res=(res+(base[now]-1)*base[cnt-now]%mod)%mod;}}cout<<(ll)(res+mod)%mod<<'\n';}return 0; }F可能會補~~~
要加喲哦
總結
以上是生活随笔為你收集整理的HHKB Programming Contest 2020 总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机不能连接wifi怎么办 手机不能连接
- 下一篇: 2018CCPC吉林赛区(重现赛)补题部