首页 > 其他分享 >Codeforces Round #851 (Div. 2) 题解

Codeforces Round #851 (Div. 2) 题解

时间:2023-02-10 02:22:50浏览次数:43  
标签:ch int 题解 ll Codeforces Div include

Codeforces Round #851 (Div. 2) 题解

A. One and Two

取 \(\log_2\),变成加号,前缀和枚举 \(s[i]=\dfrac{s[n]}{2}\)。

B. Sum of Two Numbers

对于每一位,如果是偶数则平均分,如果是奇数则分给当前数字和小的数多 \(1\)。

C. Matching Numbers

随便推个构造即可,给个参考。

void solve(){
	int n;
	cin>>n;
	if(n%2==0){
		cout<<"NO"<<endl;
		return;
	}
	cout<<"YES"<<endl;
	n*=2;
	cout<<"1 "<<n<<endl;
	for(int i=2,tmp=n-2;i<=(n+2)/4;i++,tmp-=2)
		cout<<i<<" "<<tmp<<endl;
	for(int i=(n+2)/4+1,tmp=n-1;i<=n/2;i++,tmp-=2)
		cout<<i<<" "<<tmp<<endl;
	return;
}

D. Moving Dots

考虑所求对于一个状态,必然是两个点“双向奔赴”的时候才有贡献。枚举这相邻的两个点 \(x,y\),然后发现 \([x-len,y+len-1]\) 这一范围内其他数取不了。使用 lower_bound 随便求就好了。

时间复杂度 \(O(n^2\log n)\)。

E. Sum Over Zero

转移为前缀和,写出 \(dp\) 状态为:

\[f_i=\max(f_{i-1},\max_{j<i,s_j\leq s_i} f_{j-1}+(i-j)) \]

考虑把 \(f_{j-1}-j\) 试做一个整体,那么相当于维护这玩意最小值。

树状数组即可。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define ll long long
#define MP make_pair
inline ll read(){
	ll re=0;char ch=getchar();
	while(ch>'9'||ch<'0') ch=getchar();
	while(ch>='0'&&ch<='9') re=10*re+ch-'0',ch=getchar();
	return re;
}
int n;
namespace sugt{
int mx[200005];
void build(){
	for(int i=1;i<=n;i++) mx[i]=-1e9;
}
int lowbit(int x){
	return x&(-x);
}
void ins(int x,int y){
	while(x<=n){
		mx[x]=max(mx[x],y);
		x+=lowbit(x);
	}
	return;
}
int query(int x){
	int res=-1e9;
	while(x){
		res=max(res,mx[x]);
		x-=lowbit(x);
	}
	return res;
}
}
ll s[200005],t[200005];
int f[200005];
map<ll,int> M;int tot=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		s[i]+=s[i-1];
		t[i]=s[i];
	}
	sort(t,t+n+1);
	for(int i=0;i<=n;i++)
		if(!M[t[i]]) M[t[i]]=++tot;
	for(int i=0;i<=n;i++)
		s[i]=M[s[i]];
	sugt::build();
	sugt::ins(s[0],0);
	for(int i=1;i<=n;i++){
		f[i]=max(f[i-1],sugt::query(s[i])+i);
		sugt::ins(s[i],f[i-1]-i);
	}
	cout<<f[n];
	return 0;
}

F. XOR, Tree, and Queries

引理: 假设 \(w(u,v)\) 为 \(u,v\) 路径上所有边权异或,则 \(w(u,v)=w(1,u)\ \text{xor}\ w(1,v)\)。

本题相当于给 \(w(1,u)\) 赋权。\(w(1,u)\) 有贡献当且仅当 \(d(u)\) 为奇数。

对于每个 \((u,v,w)\) 连边,每个连通块选代表点,代表点确定整个块确定。

拆位枚举即可。

标签:ch,int,题解,ll,Codeforces,Div,include
From: https://www.cnblogs.com/KawaiiOU/p/17107630.html

相关文章

  • Codeforces Round #717 (Div. 2)
    D:连续区间内lcm=积也就是gcd=1所以可以分解质因子对每个数先找到它后面离他最近的有相同质因子的数的位置用桶更新然后考虑怎么快速弄出整个区间因为划分是固......
  • 问题解决:由于找不到msvcr110.dll,无法继续执行代码
    报错解决下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=30679......
  • Educational Codeforces Round 118 (Rated for Div. 2)(D,E)
    EducationalCodeforcesRound118(RatedforDiv.2)(D,E)DD这个题大意给我们一个长度为\(n\)的序列,然后我们需要知道有多少个满足一下条件的子序列对于这一个序列,长度......
  • CF1389E Calendar Ambiguity 题解
    可能更好的阅读体验题面传送门toluogu题目大意假设一年有\(m\)月,每个月有\(d\)天,每周有\(w\)天。保证一年的第一天一定是周一。求\((x,y)\),满足\(x<y\)并且......
  • 【题解】CF850F Rainbow Balls
    整体方向很常规,但是最后的处理比较仙,记一下。思路期望dp.首先意识到最终会变成同一种颜色,并且不同颜色的期望步数不同。考虑到\(n\leq2.5\times10^3\),考虑钦定最......
  • 【题解】CF1093G Multidimensional Queries
    记一下这种有趣的trick.思路线段树。绝对值按照惯例是可以拆的,并且可以拆出一正一负两个数。考虑到维数很小,可以考虑状压表示拆除绝对值之后每一维值的正负。并且因......
  • SAOI 题解汇总
    题解汇总A.Chery的魔法药水与lrc的韭菜所有部分分代码及标程均在这里。这个题目是我们前面的月考卷子改编后的idea,去年就出了,今年翻出来经过加强得到了这道入门题......
  • keepalived的状态不断切换的问题解决
    转载自:https://blog.csdn.net/weixin_43515220/article/details/104959814================= 笔者在搭建nginx+keepalived架构的过程中,发现存在keepalived的vip不断迁......
  • vue封装的组件发布到npm,超详细及问题解决
    1.创建一个新的vue项目vuecreatebase-page创建一个新的项目,npmrunserve之后删掉多余的代码2.将自己的组件代码移入项目中增加一个新的packages文件夹(组件文件......
  • 【代码源 Div1 - 106】#456. 选数(抽屉原理) POJ2356
    problemsolution原本以为是01背包,但只能求出是否有解,没法求解对原数组求取模后的前缀和sum,则对于sum数组中的每个数,均位于[0,n-1],共n种取值,而sum[0~n]有n+1个......