Codeforces Round #595 (Div. 3)
Posted hgangang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #595 (Div. 3)相关的知识,希望对你有一定的参考价值。
B
题意:表示第i个人会将一天后把书递给a【i】人,如【3,1,2】,第一个人会递给第三个人,第二个人会递给第一个人,第三个人得给第二个人。问每个人第一开始都拿着自己的东西,之后第一次拿回自己的书是什么时候。我们发现会形成一个环,环里的每个成员就确定了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; int n,m,T,a[N]; int p[N], ans[N]; int solve(int x) { int len = 0; int tmp = x; do { tmp = p[tmp]; len++; } while (tmp != x); do { ans[tmp] = len; tmp = p[tmp]; } while (tmp != x); return len; } int main() { int q; cin >> q; while (q--) { int n; cin>>n; for (int i = 1; i <= n; i++) { ans[i] = 0; } for (int i = 1; i <= n; i++) cin>>p[i]; for (int i = 1; i <= n; i++) { if (!ans[i]) { solve(i); } } for (int i = 1; i <= n; i++) { printf("%d%c", ans[i], " "[i==n]); } } return 0; }
C
你需要找到一个数比n大,这个数的要求就是它是由不同的3的幂次组成(每个只能一个);
解析:先将n化作三进制,如129就会变成11210,由于第三位出现2,即两个相同的,那我们可以把一直把2变为1,前面一位++;然后原来的2后面全变为0,就是11210变为100000。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; ll n,m,T,a[N],tmp; ll p[N], ans[N],num[N]; int solve(int x) { tmp=0; for(int i=38;i>=0;i--){ a[i]=n/num[i]; n%=num[i]; } for(int i=38;i>=0;i--){ if(a[i]==2){ tmp=i; break; } } for(int i=0;i<tmp;i++) a[i]=0; for(int i=tmp;i<=38;i++){ if(a[i]>=2){ a[i]=0; a[i+1]++; } } ll ans=0; for(int i=0;i<=38;i++){ if(a[i])ans+=num[i]; } printf("%lld ",ans); } int main() { num[0]=1; for(int i=1;i<=38;i++) num[i]=num[i-1]*3; cin>>T; while(T--){ cin>>n; solve(n); } }
D
给你多个区间,如果有个数字被区间叠加超过k次,你必须撤掉一个线段,你得·取消最少的线段使得没有所有区间没有叠加超过k次。
解析:
首先肯定是先排序,排序完后就开始遍历,我们可以将有叠加的就存进来,当大于k了就删掉一个,那要删掉谁最好,那就是最右边的刚进来的一个,因为他最靠右,影响后面更多区间,所以删他就好。还有就是怎么判断叠加,我们将容器里的第一个区间的右边界和最新的一个区间的左边界进行比较,如果小于,说明现在这个包括后面的区间都不可能有叠加,那就直接把第一个给踢掉,此处用while循环直到有叠加了。由于有重复元素,我们用multiset来存储
#include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define mp make_pair #define pb push_back using namespace std; #define pii pair<int,int> const int maxx = 2e5+6; multiset<pii>s; vector<int>ans; int n,k; struct node{ int l,r,id; }p[maxx]; bool cmp(node a,node b){ if(a.l==b.l) return a.r<b.r; else return a.l<b.l; } int main(){ while(~scanf("%d %d",&n,&k)){ for(int i=1;i<=n;i++){ scanf("%d%d",&p[i].l,&p[i].r); p[i].id=i; } sort(p+1,p+1+n,cmp); ans.clear(); for(int i=1;i<=n;i++){ while(s.size()&&(*s.begin()).first<p[i].l) s.erase(s.begin()); s.insert(make_pair(p[i].r,p[i].id)); while(s.size()>k){ auto it=s.end();it--;ans.pb((*it).second);s.erase(it); } } int sz=ans.size(); printf("%d ",sz); for (int i=0;i<sz;i++){ if(i)printf(" %d",ans[i]); else printf("%d",ans[i]); } printf(" "); } return 0; }
E
简单dp
#include<bits/stdc++.h> #define LL long long #define lson rt<<1 #define rson rt<<1|1 using namespace std; const int maxx = 2e5+6; LL a[maxx]; LL b[maxx]; LL n,c; LL dp[maxx][3]; int main(){ while(~scanf("%lld%lld",&n,&c)){ for (int i=2;i<=n;i++){ scanf("%lld",&a[i]); } for (int i=2;i<=n;i++){ scanf("%lld",&b[i]); } dp[1][1]=0; dp[1][2]=c; for (int i=2;i<=n;i++){ dp[i][1]=min(dp[i-1][1]+a[i],dp[i-1][2]+a[i]); dp[i][2]=min(dp[i-1][2]+b[i],dp[i-1][1]+b[i]+c); } for (int i=1;i<=n;i++){ if (i-1)printf(" %lld",min(dp[i][1],dp[i][2])); else printf("0"); } printf(" "); } }
F
给你一棵树
以上是关于Codeforces Round #595 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #595 (Div. 3) 题解
Codeforces Round #595 (Div. 3)
Codeforces Round #595 (Div. 3)
Codeforces Round #595 (Div. 3)B2 简单的dfs