首页 > 其他分享 >Codeforces Round #772 (Div. 2)

Codeforces Round #772 (Div. 2)

时间:2022-08-25 06:55:07浏览次数:103  
标签:return 772 int void cin Codeforces color ans Div

Codeforces Round #772 (Div. 2)

VP

A B C
3min 12min 52min
+4

排名:rk3893
基准分:\(\color{ForestGreen}{1362}\)

从天选到天崩

A

\(\color{Gray}{800}\)

CF1635A Min Or Sum

简要分析可知,其实答案就是对于所有数取或运算和(具体懒得管)

时间复杂度:\(O(n)\)

int n,x;
void work(){
  int ans=0;cin>>n;
  L(i,1,n) cin>>x,ans|=x;
  cout<<ans<<'\n';
}

B

\(\color{Gray}{800}\)

CF1635B Avoid Local Maximums

就是个贪心,如果能左右两个一起解决就一起干。

构造起来不难。

int n,c;
const int N=2e5+100,INF=1e9;
int a[N];bool f[N];
void work(){
  cin>>n;L(i,1,n) cin>>a[i];
  me(f,0);vector <int>p;c=0;
  L(i,2,n-1) if(a[i]>a[i-1]&&a[i]>a[i+1]) 
    p.push_back(i),f[i]=1;
  for(int i=0;i<p.size();i++){
    if(p[i]==p[i+1]-2){
      a[p[i]+1]=max(a[p[i]],a[p[i+1]]);
      i++;c++;
    }else a[p[i]-1]=a[p[i]],c++;
  }cout<<c<<'\n';
  L(i,1,n) cout<<a[i]<<" \n"[i==n];
}

C

\(\color{ForestGreen}{1200}\)

CF1635C Differential Sorting

先想几个特殊情况:

  • 如果 \(a_n,a_{n-1}\) 之间不满足,则必然无解。
  • 如果 \(a_n<0\),则原序列必须单减,否则无解。

至于证明,可以看官方题解
又懒得证

时间复杂度:\(O(n)\)

#define F(i) (i).first
#define S(i) (i).second
#define pb push_back
int n;
const int N=2e5+100,INF=1e9;
int a[N],sum[N];bool f[N];
vector<pair<pi,int>>ans;
void work(){
  cin>>n;L(i,1,n) cin>>a[i];a[n+1]=INF;
  if(a[n]<a[n-1]) return cout<<-1<<'\n',void();
  L(i,1,n) f[i]=0;
  ans.clear();int flag=0;
  int k=0;
  L(i,1,n-1) if(a[i]>a[i+1]) f[i]=1,flag++;
  if(a[n]<0){
    bool t=0;L(i,1,n-1)
      if(a[i]>a[i+1]){t=1;break;}
    return cout<<(t?-1:0)<<'\n',void();
  }if(!flag) return cout<<0<<'\n',void();
  L(i,1,n-2) ans.pb({{i,n-1},n});
  cout<<(int)ans.size()<<'\n';
  for(auto i:ans)
    cout<<F(F(i))<<' '<<S(F(i))<<' '<<S(i)<<'\n';
}

四次法师,代码巨丑。

D

\(\color{Blue}{1800}\)

CF1635D Infinite Set

在二进制下考虑问题。

对于数 \(x\),\(x \times 2 + 1\) 相当于 \(x<<1|1\),\(x \times 4\) 相当于 \(x<<2\)。

尝试推导每个数的贡献值。
设 \(f_i\) 表示用上述方法推得能产生的 \(i\) 位数的个数。
很容易想到转移 \(f_i = \begin{cases}1&i\leqslant1\\f_{i-1}+f_{i-2}&x>1\end{cases}\)

其实就是斐波那契数列。
直接统计显然是 \(O(n)\),这个部分可以用前缀和优化到 \(O(1)\)。

之后考虑可能出现的重复计算贡献的情况。
其实出现重复就是某个数会在另一个数在递推时产生。
对于这种情况,我们每循环一个数就丢进 std::set() 中,之后的数如果在拆分时的“子集”在 std::set() 中出现,跳过即可。

时间复杂度:\(O(n \log_2 A \log_2 n + p)\)

int n,p,ans;
const int N=2e5+100,mod=1e9+7;
int f[N],a[N];set<int>s;
bool check(int x){
  bool f=1;
  while(x>0){
    if(s.count(x)){f=0;break;}
    if(x&1) x>>=1;
    else if(x%4==0) x>>=2;
    else break;
  }return f;
}void work(){
  cin>>n>>p;f[0]=1;
  L(i,1,p) 
    f[i]=(f[i-1]+(i>1?f[i-2]:0))%mod;
  L(i,1,p)
    (f[i]+=f[i-1])%=mod;
  L(i,1,n) cin>>a[i];
  sort(a+1,a+1+n);
  L(i,1,n) if(check(a[i])){
    s.insert(a[i]);
    int g=__lg(a[i])+1;
    if(g<=p) (ans+=f[p-g])%=mod;
  }cout<<ans;
}

E

\(\color{Orange}{2200}\)

CF1635E Cars

转化下题意,相当于每个限制是两车方向必须相反,且存在位置相对关系。
可以先连边,跑二分图染色,判断是否有解。

如果有解按照每辆车的朝向和已知信息建新图跑拓扑排序,分配每辆车的位置。
注意拓扑排序之后要判断车的位置是否合法,如果重叠也是无解。

时间复杂度:\(O(n+m)\)

#define L(i,j,k) for(int i=(j);i<=(k);i++)
int n,m;bool tp;
const int N=5e5+100,mod=1e9+7;
int cl[N],o[N],u[N],v[N],ans[N],in[N];
vector<int>g[N];queue<int>q;
void dfs(int u,int c){
  cl[u]=c;
  for(int v:g[u]){
    if(cl[v]==cl[u]){tp=1;return ;}
    if(!cl[v]) dfs(v,-c);
  }
}void top(){
  int tot=0;
  while(!q.empty()){
    int u=q.front();q.pop();ans[u]=++tot;
    for(int v:g[u]) if(!(--in[v])) q.push(v);
  }
}void work(){
  cin>>n>>m;
  L(i,1,m){
    cin>>o[i]>>u[i]>>v[i];
    g[u[i]].pb(v[i]);g[v[i]].pb(u[i]);
  }L(i,1,n) if(!cl[i]) dfs(i,1);
  if(tp) return cout<<"NO",0;
  L(i,1,n) g[i].clear();
  L(i,1,m)
    if((o[i]==2&&cl[u[i]]==-1)||(o[i]==1&&cl[u[i]]==1)) 
      g[u[i]].pb(v[i]),in[v[i]]++;
    else g[v[i]].pb(u[i]),in[u[i]]++;
  L(i,1,n) if(!in[i]) q.push(i);
  top();map<int,int>mp;L(i,1,n) mp[ans[i]]++;
  L(i,1,n) if(mp[ans[i]]>1) return cout<<"NO",0;
  cout<<"YES"<<'\n';
  L(i,1,n) cout<<(cl[i]==1?'L':'R')<<' '<<ans[i]<<'\n';
}

标签:return,772,int,void,cin,Codeforces,color,ans,Div
From: https://www.cnblogs.com/AIskeleton/p/16622966.html

相关文章

  • Codeforces Round #815 (Div. 2)
    https://codeforces.ml/contest/1720A:思维fst了。。分数,分子分母改变多少次,变一样题意:给a/b,c/d两个分数,问分子父母各乘多少次可以得到相同的数思路很简单,将所有数......
  • Codeforces Round #710 (Div. 3) D. Epic Transformation(优先队列)
    https://codeforces.com/contest/1506/problem/D鉴定完毕,这题卡映射数量到优先队列的那一步操作给你一个由整数组成的长度为n的数组a。您可以对阵列应用由几个步骤组成......
  • Codeforces Round #773 (Div. 2)
    CodeforcesRound#773(Div.2)VPABC24min31min48min+2+1A\(\color{Gray}{800}\)CF1642AHardWay观察题目样例外加手摸可知,只有满足三角形......
  • Codeforces Round #815 (Div. 2) E. Misha and Paintings
    人生中第一个AC的codeforces题,大概太难了,光是看答案就看了整整一下午,最后还是在b站上搜到讲解视频才明白的。俺们阿B真的是太厉害啦这道题首先容易看出当矩阵中数字个数......
  • Codeforces Round #783 (Div. 2) E (证明+构造)
    一般这种题我们都是先推导下界再来构造那我们假设我们当前放置了k位半皇后我们只考虑横竖被吃掉并且贪心的(类似于八皇后的选择)横竖都不重叠我们把他固定在左上角的kk......
  • Codeforces Round #292 (Div. 2) C. Drazil and Factorial(思维)
    https://codeforces.com/contest/515题目大意:给我们一个长度为n的数字a定义F(a)=a里面每一位数的阶层总乘积让我们求最大的x,需要满足F(x)=f(a)并且x中没有0和1input4......
  • Codeforces Round #638 (Div. 2) B. Phoenix and Beauty(构造/思维)
    https://codeforces.com/contest/1348/problem/B如果一个数组的所有长度为k的子数组的和相同,那么这个数组就是美丽的。数组的子数组是任何连续元素的序列。Phoenix目前......
  • *Codeforces Round #363 (Div. 1) A. Vacations(状态机)
    https://codeforces.com/contest/698/problem/AVasya有n天假期!Vasya知道关于这n天中每一天的以下信息:那家健身房是否开门,以及那天是否在互联网中进行了比赛。第i天有四个......
  • CodeForces-1715D 2+ doors
    2+doors贪心位与位之间互不一向,因此考虑每个位进行考虑就行因为是或的关系,先考虑\(0\)的情况,如果出现\(0\),则两个数字的该位必然是\(0\)如果是\(1\)的情况,就考......
  • CodeForces-1715C Monoblock
    Monoblockdp先想想如何计算初始值\(dp[x]\)表示以第\(x\)个位置为\(r\),他的所有贡献状态转移:如果\(a_x=a_{x-1}\):\(dp[x]=dp[x-1]+1\),代表只增加了\(l......