Codeforces Round #547 (Div. 3)
Posted MXang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #547 (Div. 3)相关的知识,希望对你有一定的参考价值。
我老人家走了四公里吃个汉堡还没吃成。垃圾肯德基。垃圾春分半价桶。
蜜雪冰城百香果加冰+烤串真是爽死了。原来二十多块钱可以吃的这么爽。
A:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll n,m; 5 int main(){ 6 ios::sync_with_stdio(false); 7 cin>>n>>m; 8 if(m%n)cout<<-1; 9 else{ 10 ll tmp = m/n; 11 int c1=0,c2=0; 12 while (tmp%2==0){ 13 c1++;tmp/=2; 14 } 15 while (tmp%3==0){ 16 c2++;tmp/=3; 17 } 18 if(tmp!=1){ 19 cout<<-1; 20 } else{ 21 cout<<c1+c2<<endl; 22 } 23 } 24 }
B:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 2e5+5; 5 int n,a[N<<1]; 6 int main(){ 7 ios::sync_with_stdio(false); 8 cin>>n; 9 for(int i=1;i<=n;i++){ 10 cin>>a[i]; 11 a[n+i]=a[i]; 12 } 13 int ans = 0,tmp = 0; 14 for(int i=1;i<=2*n;i++){ 15 if(a[i]==1){ 16 tmp++; 17 } else{ 18 ans = max(ans,tmp); 19 tmp = 0; 20 } 21 } 22 ans = max(ans,tmp); 23 cout<<ans<<endl; 24 }
C:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 2e5+5; 5 int n,q[N],ans[N]; 6 set<int> s; 7 int main(){ 8 ios::sync_with_stdio(false); 9 cin>>n; 10 for(int i=1;i<n;i++){ 11 cin>>q[i]; 12 } 13 int mx = 0; 14 for(int i=1;i<n;i++){ 15 ans[i+1]=ans[i]+q[i]; 16 mx = max(mx,ans[i]); 17 } 18 mx = max(mx,ans[n]); 19 for(int i=1;i<=n;i++){ 20 ans[i]+=(n-mx); 21 if(ans[i]>n||ans[i]<1){ 22 cout<<-1<<endl; 23 exit(0); 24 } 25 s.insert(ans[i]); 26 } 27 if(s.size()!=n) cout<<-1; 28 else{ 29 for(int i=1;i<=n;i++){ 30 cout<<ans[i]<<‘ ‘; 31 } 32 } 33 }
D:
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define mk(a,b) make_pair(a,b) 4 using namespace std; 5 typedef long long ll; 6 const int N = 15e4+5; 7 int n; 8 string a,b; 9 int v1[N],v2[N]; 10 set<int> s[27]; 11 vector<pii>ans; 12 int main(){ 13 ios::sync_with_stdio(false); 14 cin>>n>>a>>b;a="*"+a;b="*"+b; 15 for(int i=1;i<=n;i++){ 16 if(b[i]==‘?‘)s[26].insert(i); 17 else s[b[i]-‘a‘].insert(i); 18 } 19 for(int i=1;i<=n;i++){ 20 if(a[i]==‘?‘)continue; 21 if(!s[a[i]-‘a‘].empty()) { 22 int id = *s[a[i] - ‘a‘].begin(); 23 ans.push_back(mk(i, id)); 24 s[a[i] - ‘a‘].erase(id); 25 v1[i] = 1; 26 v2[id] = 1; 27 } else{ 28 if(s[26].empty())continue; 29 int id = *s[26].begin(); 30 ans.push_back(mk(i, id)); 31 s[26].erase(id); 32 v1[i] = 1; 33 v2[id] = 1; 34 } 35 } 36 int id = 0; 37 for(int i=1;i<=n;i++){ 38 if(a[i]!=‘?‘)continue; 39 while (s[id].empty()){ 40 id++; 41 if(id>26)break; 42 } 43 int x = *s[id].begin(); 44 ans.push_back(mk(i,x)); 45 s[id].erase(x); 46 } 47 cout<<ans.size()<<endl; 48 for(auto t:ans){ 49 cout<<t.first<<‘ ‘<<t.second<<endl; 50 } 51 52 }
E:直接暴力吧。看到同学有写二分的。。。二分个锤子啊。。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 2e5+5; 5 ll h, n; 6 ll a[N],pre[N]; 7 int main(){ 8 ios::sync_with_stdio(false); 9 cin>>h>>n; 10 ll tmp = h; 11 ll mn = 1e18; 12 for(int i=1;i<=n;i++){ 13 cin>>a[i]; 14 tmp+=a[i]; 15 if(tmp<=0){ 16 cout<<i; 17 exit(0); 18 } 19 pre[i]=pre[i-1]+a[i]; 20 mn = min(mn,pre[i]); 21 } 22 if(pre[n]>=0){ 23 cout<<-1; 24 } else{ 25 ll tmp = h+mn; 26 ll ans = abs(tmp/pre[n]*n); 27 h-=abs(ans/n*pre[n]); 28 while (1) { 29 for (int i = 1; i <= n; i++) { 30 if (h <= 0) { 31 cout << ans; 32 exit(0); 33 } 34 h += a[i]; 35 ans++; 36 } 37 } 38 } 39 }
那么到这里已经过去四十多分钟了,接下来是专治傻逼题。
F2:被治了好几分钟然后挂机睡觉了。
直接暴力枚举所有区间和。完了。
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define mk(a,b) make_pair(a,b) 4 using namespace std; 5 typedef long long ll; 6 map<int,vector<pii>>mp; 7 vector<pii>t,v,ans; 8 bool cmp(pii a,pii b){ 9 return a.second<b.second; 10 } 11 int n,a[1551]; 12 int main(){ 13 ios::sync_with_stdio(false); 14 cin>>n; 15 for(int i=1;i<=n;i++){ 16 cin>>a[i]; 17 a[i]+=a[i-1]; 18 } 19 for(int i=1;i<=n;i++){ 20 for(int j=i;j<=n;j++){ 21 mp[a[j]-a[i-1]].push_back(mk(i,j)); 22 } 23 } 24 for(auto x:mp){ 25 t=x.second; 26 v.clear(); 27 sort(t.begin(),t.end(),cmp); 28 int tmp = 1; 29 int r=t[0].second; 30 v.push_back(t[0]); 31 for(int i=1;i<t.size();i++){ 32 if(t[i].first<=r)continue; 33 r=t[i].second;tmp++; 34 v.push_back(t[i]); 35 } 36 if(tmp>ans.size()){ 37 ans=v; 38 } 39 } 40 cout<<ans.size()<<endl; 41 for(auto tmp:ans){ 42 cout<<tmp.first<<‘ ‘<<tmp.second<<endl; 43 } 44 }
G:我感觉我写的假算法。。和别人的代码,和题解好像都不一样???
首先注意到一个性质,答案其实就是第k+1大的节点度数。
然后我们就搜一遍顺便染个色。
我在搜的过程中 直接把 父节点 能染的颜色起始下标赋给了子节点。。结果1A了。。。不太懂为啥是对的,明天问问学长。。。
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define mk(a,b) make_pair(a,b) 4 using namespace std; 5 const int N = 2e5+5; 6 struct Node{ 7 int id,deg; 8 }a[N]; 9 bool cmp(Node a,Node b){ return a.deg>b.deg;} 10 map<pii,int>mp; 11 int n,k,deg[N],ans[N],col[N]; 12 vector<int> g[N]; 13 void dfs(int v,int fa,int p){ 14 for(auto u:g[v]){ 15 if(u==fa)continue; 16 ans[mp[mk(max(u,v),min(u,v))]]=col[v]++; 17 col[u]=col[v]; 18 col[u]%=p;col[v]%=p; 19 dfs(u,v,p); 20 } 21 } 22 int main(){ 23 ios::sync_with_stdio(false); 24 cin>>n>>k; 25 int u,v; 26 for(int i=1;i<n;i++){ 27 cin>>u>>v; 28 deg[u]++;deg[v]++; 29 g[u].push_back(v); 30 g[v].push_back(u); 31 mp[mk(max(u,v),min(u,v))]=i; 32 } 33 for(int i=1;i<=n;i++)a[i]={i,deg[i]},col[i]=0; 34 sort(a+1,a+1+n,cmp); 35 int tmp = a[k+1].deg; 36 dfs(a[k+1].id,a[k+1].id,tmp); 37 cout<<tmp<<endl; 38 for(int i=1;i<n;i++){ 39 cout<<ans[i]+1<<‘ ‘; 40 } 41 }
以上是关于Codeforces Round #547 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #547 (Div. 3) F 贪心 + 离散化
Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation
Codeforces Round #436 E. Fire(背包dp+输出路径)