Codeforces Round #684 (Div. 2)
A - Buy the String
要么全變成1要么全變成0要么一個都不改變,三種情況取最小。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; int main() {IO;int T=1;cin>>T;while(T--){int n;cin>>n;int a,b,c;cin>>a>>b>>c;string s;cin>>s;int res1=0;for(int i=0;i<n;i++){if(s[i]=='0') res1+=a;else res1+=b;}int res2=0;for(int i=0;i<n;i++){if(s[i]=='0') res2+=b+c;else res2+=b;}int res3=0;for(int i=0;i<n;i++){if(s[i]=='0') res3+=a;else res3+=a+c;}cout<<min(res1,min(res2,res3))<<'\n';}return 0; }B - Sum of Medians
數學題,取后面幾個中位數即可
任意考慮一個不降序列a1a2a3…ana_1 \ a_2 \ a_3\dots a_na1??a2??a3?…an?,按照題目意思中位數為a?1+n2?a_{\lfloor \frac{1+n}{2}\rfloor}a?21+n???,我們那么中位數后面的數的個數為n??1+n2?n-\lfloor \frac{1+n}{2}\rfloorn??21+n??意味著如果你選擇一個數作為中位數那么一定要有n??1+n2?n-\lfloor \frac{1+n}{2}\rfloorn??21+n??不小于它的數。
那么本題只需要每次選擇第n??1+n2?+1n-\lfloor \frac{1+n}{2}\rfloor+1n??21+n??+1大的數作為每個數組的中位數即可。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=1000010; int n,k; ll a[N]; int main() {IO;int T=1;cin>>T;while(T--){cin>>n>>k;for(int i=1;i<=n*k;i++) {a[i]=0;cin>>a[i];}sort(a+1,a+1+n*k);int m=(n+1)/2;int cnt=n-m;ll res=0;for(int i=n*k,j=1;i>=1,j<=k;j++,i-=cnt+1)res+=a[i-cnt];cout<<res<<'\n';}return 0; }C1 - Binary Table (Easy Version)
[1111]→[1000]→[1100]→[1110]→[0000]\begin{bmatrix}1 &1\\ 1&1\end{bmatrix}\to \begin{bmatrix}1 &0\\ 0&0\end{bmatrix}\to \begin{bmatrix}1 &1\\ 0&0\end{bmatrix} \to \begin{bmatrix}1 &1\\ 1&0\end{bmatrix} \to \begin{bmatrix}0 &0\\ 0&0\end{bmatrix}[11?11?]→[10?00?]→[10?10?]→[11?10?]→[00?00?]
每次考慮變換4個格子,每4個格子最多變換4次,我們會把4個數全部變成0,如果行列都是偶數,那么保證mn次操作內絕對能夠全變成0
由于行列奇偶行可能導致出現某些元素重復變換導致nm次過不了(這也是更難的版本
C2 - Binary Table (Hard Version)
對于行列數是奇數可能導致nm操作不能搞的情況:其實我們只要首先把一行全部變成0(行數是奇數)或者一列全部變成0(列數是奇數),我們就能把操作次數控制在n2+1+m2+1+(m?1)×(n?1)\frac{n}{2}+1+\frac{m}{2}+1+(m-1)×(n-1)2n?+1+2m?+1+(m?1)×(n?1)次以內
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=110; int n,m; char tmp[N][N]; int g[N][N]; pii a[4]; bool st[4]; vector<pii> ans; void work(pii a[]) {memset(st,0,sizeof st);int cnt=0;for(int i=0;i<4;i++){int x=a[i].first,y=a[i].second;cnt+=g[x][y];}if(cnt==1){int now=0;for(int i=0;i<4;i++) {int x=a[i].first,y=a[i].second;if(now<2&&!g[x][y]){st[i]=1;ans.push_back({x,y});g[x][y]=1;now++;}}for(int i=0;i<4;i++) {int x=a[i].first,y=a[i].second;if(!st[i]&&g[x][y]){ans.push_back({x,y});g[x][y]=0;break;}}work(a);}else if(cnt==2){for(int i=0;i<4;i++) {int x=a[i].first,y=a[i].second;if(!g[x][y]){st[i]=1;ans.push_back({x,y});g[x][y]=1;}}for(int i=0;i<4;i++) {int x=a[i].first,y=a[i].second;if(!st[i]&&g[x][y]){ans.push_back({x,y});g[x][y]=0;break;}}work(a);}else if(cnt==3){for(int i=0;i<4;i++) {int x=a[i].first,y=a[i].second;if(g[x][y]){ans.push_back({x,y});g[x][y]=0;}}}else if(cnt==4){for(int i=0;i<3;i++) {int x=a[i].first,y=a[i].second;if(g[x][y]){ans.push_back({x,y});g[x][y]=0;}}work(a);}else return; } void print() {for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cout<<g[i][j]<<' ';cout<<endl;} } int main() {IO;int T=1;cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++) cin>>tmp[i]+1;for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) g[i][j]=tmp[i][j]-'0';if(n%2==0&&m%2==0){for(int i=1;i<=n;i+=2)for(int j=1;j<=m;j+=2){a[0]={i,j},a[1]={i+1,j},a[2]={i,j+1},a[3]={i+1,j+1};work(a);}}else if(n%2==0&&m%2!=0){for(int i=1;i<=n;i+=2){if(g[i][1]==0&&g[i+1][1]==0) continue;else if(g[i][1]==1&&g[i+1][1]==0){ans.push_back({i,1}); g[i][1]=1-g[i][1];ans.push_back({i,2}); g[i][2]=1-g[i][2];ans.push_back({i+1,2}); g[i+1][2]=1-g[i+1][2];}else if(g[i][1]==0&&g[i+1][1]==1){ans.push_back({i+1,1}); g[i+1][1]=1-g[i+1][1];ans.push_back({i,2}); g[i][2]=1-g[i][2];ans.push_back({i+1,2}); g[i+1][2]=1-g[i+1][2];}else {ans.push_back({i,1}); g[i][1]=1-g[i][1];ans.push_back({i+1,1}); g[i+1][1]=1-g[i+1][1];ans.push_back({i+1,2}); g[i+1][2]=1-g[i+1][2];}}for(int i=1;i<=n;i+=2)for(int j=2;j<=m;j+=2){a[0]={i,j},a[1]={i+1,j},a[2]={i,j+1},a[3]={i+1,j+1};work(a);}}else if(n%2!=0&&m%2==0){for(int j=1;j<=m;j+=2){if(g[1][j]==0&&g[1][j+1]==0) continue;else if(g[1][j]==1&&g[1][j+1]==0){ans.push_back({1,j});g[1][j]=1-g[1][j];ans.push_back({2,j});g[2][j]=1-g[2][j];ans.push_back({2,j+1});g[2][j+1]=1-g[2][j+1];}else if(g[1][j]==0&&g[1][j+1]==1){ans.push_back({1,j+1});g[1][j+1]=1-g[1][j+1];ans.push_back({2,j});g[2][j]=1-g[2][j];ans.push_back({2,j+1});g[2][j+1]=1-g[2][j+1];}else {ans.push_back({1,j});g[1][j]=1-g[1][j];ans.push_back({1,j+1});g[1][j+1]=1-g[1][j+1];ans.push_back({2,j});g[2][j]=1-g[2][j];}}for(int i=2;i<=n;i+=2)for(int j=1;j<=m;j+=2){a[0]={i,j},a[1]={i+1,j},a[2]={i,j+1},a[3]={i+1,j+1};work(a);}//print();}else{for(int i=1;i<=n;i+=2){int x=i+1;if(x>n) x-=2;if(g[i][1]==0&&g[x][1]==0) continue;else if(g[i][1]==1&&g[x][1]==0){ans.push_back({i,1}); g[i][1]=1-g[i][1];ans.push_back({i,2}); g[i][2]=1-g[i][2];ans.push_back({x,2}); g[x][2]=1-g[x][2];}else if(g[i][1]==0&&g[x][1]==1){ans.push_back({x,1}); g[x][1]=1-g[x][1];ans.push_back({i,2}); g[i][2]=1-g[i][2];ans.push_back({x,2}); g[x][2]=1-g[x][2];}else {ans.push_back({x,1}); g[x][1]=1-g[x][1];ans.push_back({i,1}); g[i][1]=1-g[i][1];ans.push_back({x,2}); g[x][2]=1-g[x][2];}}for(int j=2;j<=m;j+=2){int y=j+1;if(y>m) y-=2;if(g[1][j]==0&&g[1][y]==0) continue;else if(g[1][j]==1&&g[1][y]==0){ans.push_back({1,j});g[1][j]=1-g[1][j];ans.push_back({2,j});g[2][j]=1-g[2][j];ans.push_back({2,y});g[2][y]=1-g[2][y];}else if(g[1][j]==0&&g[1][y]==1){ans.push_back({1,y});g[1][y]=1-g[1][y];ans.push_back({2,j});g[2][j]=1-g[2][j];ans.push_back({2,y});g[2][y]=1-g[2][y];}else {ans.push_back({1,j});g[1][j]=1-g[1][j];ans.push_back({2,j});g[2][j]=1-g[2][j];ans.push_back({1,y});g[1][y]=1-g[1][y];}}//print();for(int i=2;i<=n;i+=2)for(int j=2;j<=m;j+=2){a[0]={i,j},a[1]={i+1,j},a[2]={i,j+1},a[3]={i+1,j+1};work(a);}}cout<<ans.size()/3<<'\n';int cnt=0;for(auto t:ans){cnt++;cout<<t.first<<' '<<t.second<<' ';if(cnt%3==0) cout<<'\n';}ans.clear();}return 0; }這模擬就離譜好吧~~
寫了4題太晚了(希望不被fst,就沒有在往后看
E. Greedy Shopping
今天補了一下E. Greedy Shopping
要加油哦~
總結
以上是生活随笔為你收集整理的Codeforces Round #684 (Div. 2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABC182——F - Valid pa
- 下一篇: codeforces1440 E. Gr