首页 > 其他分享 >CF-956(A-D)

CF-956(A-D)

时间:2024-07-08 22:57:43浏览次数:16  
标签:cout int res sum cin CF 956 rep

CF-956(A-D)

期末以来第一场CF (っ °Д °;)っ

Problem - A - Codeforces

1~n的升序排列就满足条件

void solve(){
	int n;cin>>n;
	rep(i,1,n) cout<<i<<" ";
	cout<<endl;
}

Problem - B - Codeforces

两种操作:

+1 +2	+2 +1
+2 +1	+1 +2

在模3的情况下显然都一定不会改变每一行或每一列的和,由此可判断

const int N=505,M=2e5+5;
int a[N][N],b[N][N],sum[N*N+1];
void solve(){
	int n,m;cin>>n>>m;
	char x;
	rep(i,1,n) sum[i]=0;
	rep(j,1,m) sum[1+j*N]=0;
	rep(i,1,n){
		rep(j,1,m){
			cin>>x;
			a[i][j]=(x-'0');
			sum[i]=(sum[i]+a[i][j])%3;
			sum[1+j*N]=(sum[1+j*N]+a[i][j])%3;
		}
	}
	int res=0,f=1;
	rep(i,1,n){
		res=0;
		rep(j,1,m){
			cin>>x;
			b[i][j]=x-'0';
			res=(res+b[i][j])%3;
		}
		if(res!=sum[i]) f=0;
	}
	rep(j,1,m){
		res=0;
		rep(i,1,n){
			res=(res+b[i][j])%3;
		}
		if(res!=sum[1+j*N]){
			f=0;
			break;
		}
	}
	if(f) cout<<"YES";
	else cout<<"NO";
	cout<<endl;
}

Problem - C - Codeforces

要在三个数组中找到三个不重叠的连续区域,每个区域之和都要>=(sum+2)/3。我们可以暴力枚举第一部分的分界点,因为未知三个数组哪个取第一部分,哪个取中间部分,哪个取最后部分,所以要考虑六种情况

void solve(){
	int n;cin>>n;
	vector<int>a(n+1),b(n+1),c(n+1);
	int x;
	rep(i,1,n){
		cin>>x;
		a[i]=a[i-1]+x;
	}
	rep(i,1,n){
		cin>>x;
		b[i]=b[i-1]+x;
	}
	rep(i,1,n){
		cin>>x;
		c[i]=c[i-1]+x;
	}
	int sum=(c[n]+2)/3;
	int j=1;
	rep(i,1,n){
		while(b[j]-b[i]<sum&&j<n) j++;
		if(a[i]>=sum&&c[n]-c[j]>=sum){
			cout<<"1 "<<i<<" "<<i+1<<" "<<j<<" "<<j+1<<" "<<n<<endl;
			return;
		}
	}	
	j=1;	
	rep(i,1,n){
		while(c[j]-c[i]<sum&&j<n) j++;
		if(a[i]>=sum&&b[n]-b[j]>=sum){
			cout<<"1 "<<i<<" "<<j+1<<" "<<n<<" "<<i+1<<" "<<j<<endl;
			return;
		}
	}
	j=1;
	rep(i,1,n){
		while(a[j]-a[i]<sum&&j<n) j++;
		if(b[i]>=sum&&c[n]-c[j]>=sum){
			cout<<i+1<<" "<<j<<" "<<"1 "<<i<<" "<<j+1<<" "<<n<<endl;
			return;
		}
	}
	j=1;
	rep(i,1,n){
		while(c[j]-c[i]<sum&&j<n) j++;
		if(b[i]>=sum&&a[n]-a[j]>=sum){
			cout<<j+1<<" "<<n<<" 1 "<<i<<" "<<i+1<<" "<<j<<endl;
			return;
		}
	}
	j=1;
	rep(i,1,n){
		while(a[j]-a[i]<sum&&j<n) j++;
		if(c[i]>=sum&&b[n]-b[j]>=sum){
			cout<<i+1<<" "<<j<<" "<<j+1<<" "<<n<<" 1 "<<i<<endl;
			return;
		}
	}
	j=1;
	rep(i,1,n){
		while(b[j]-b[i]<sum&&j<n) j++;
		if(c[i]>=sum&&a[n]-a[j]>=sum){
			cout<<j+1<<" "<<n<<" "<<i+1<<" "<<j<<" 1 "<<i<<endl;
			return;
		}
	}
	cout<<"-1"<<endl;
}

Problem - D - Codeforces

思路

因为等距交换,所以可以都进行相邻交换,这样如果两数组操作数相差为偶数并且两数组元素都相同才是合法的

操作

处理操作数:相邻排序的话就是冒泡排序,也就是求冒泡排序的交换次数,而它就等于序列中的逆序对个数,可以用树状数组求得,又序列中会有重复元素,所以可以按权值降序、权值相同的按位置逆序排序,用树状数组点修区查求得

树状数组求逆序对个数还可以直接顺序的点修区查求,对当前数x,对树上x点加1,它对逆序对个数的贡献是[x+1,n]的和,不过这种方法当x的值域很大时需要离散化处理

判断两数组元素是否都相同:排序判断

代码

const int N=2e5+5;
int s[N],n;
struct node{
	int v,p;
}a[N],b[N];
bool cmp(node a,node b){
	if(a.v==b.v) return a.p>b.p;
	else return a.v>b.v;
}
int lowbit(int x){
	return x&-x;
}
void change(int x,int k){
	while(x<=n){
		s[x]+=k;
		x+=lowbit(x);
	}
}
int query(int x){
	int res=0;
	while(x){
		res+=s[x];
		x-=lowbit(x);
	}
	return res;
}
void solve() {
	cin>>n;
	rep(i,1,n){
		cin>>a[i].v;
		a[i].p=i;
		s[i]=0;
	}
	rep(i,1,n){
		cin>>b[i].v;
		b[i].p=i;
	}
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmp);
	rep(i,1,n){
		if(a[i].v!=b[i].v){
			cout<<"NO\n";
			return;
		}
	}
	int cnta=0,cntb=0;
	rep(i,1,n){
		cnta+=query(a[i].p);
		change(a[i].p,1);
	}
	rep(i,1,n) s[i]=0;
	rep(i,1,n){
		cntb+=query(b[i].p);
		change(b[i].p,1);
	}
	if((cnta-cntb)%2==0) cout<<"YES";
	else cout<<"NO";
	cout<<endl;
}

标签:cout,int,res,sum,cin,CF,956,rep
From: https://www.cnblogs.com/mono-4/p/18290848

相关文章

  • CodeForces CF1980C Sofia and the Lost Operations 题解 但是最后TLE 仅供思路参考
    CodeForcesCF1980CSofiaandtheLostOperations题解嗨嗨,又来了啊,蒟蒻再来一篇题解SofiaandtheLostOperations题面翻译索菲亚有一个包含$n$个整数的数组$a[1],a[2],…,a[n]$。有一天她对这个数组感到厌倦,于是决定顺序地对其应用$m$个修改操作。每个修改操作由一......
  • Codeforces Round #956 (Div. 2) C. Have Your Cake and Eat It Too
    CodeforcesRound#956(Div.2)C.HaveYourCakeandEatItToo题目大意:有长度为nnn的数组a......
  • CCF-GESP计算机学会等级考试2024年6月六级C++T2二叉树
    解析:详见代码:#include<bits/stdc++.h>usingnamespacestd;intn;intq;strings;intp[100005];//p[i]表示i的父节点inta[100005];//对第i个节点的操作次数intb[100005];//第i个节点变化的总次数intdfs(intx){if(b[x]>0)returnb[x];//如果已计算,直接返......
  • CCF-GESP计算机学会等级考试2024年6月五级C++T2小杨的幸运数字
    解析:对每个数分解质因数,并统计质因数个数,详见代码:#include<bits/stdc++.h>usingnamespacestd;intn;intmain(){cin>>n;for(inti=1;i<=n;i++){intx;cin>>x;intcnt=0;//质因数个数for(intj=2;j*j......
  • CCF-GESP计算机学会等级考试2024年6月五级C++T1黑白格
    解析: 先把每行做前缀和(方便求区间和),枚举开始列和结束列,按行做双指针求和,找到和大于等于k的最小矩阵,时间复杂度O(N^3)。#include<bits/stdc++.h>usingnamespacestd;intm,n,k;inta[105][105];intans=1e9;intmain(){cin>>n>>m>>k;for(inti=1;i<=n;i++......
  • Codeforces Round #956 (Div. 2) and ByteRace 2024
    CF1983A.ArrayDivisibility很快发现输出\(\mathbf{1\simn}\)符合题意。B.CornerTwist结论题。关键的充要条件是\(a,b\)的每一行/列的和模\(\mathbf{3}\)后相等。证明的话,首先要想到\(\mathbf{2\times2}\)的操作是可以完成所有大小的子矩阵操作的,手模一下可以发......
  • Codeforces Round 956 (Div. 2)
    A.ArrayDivisibilityArrayDivisibility直接输出1到n#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;for(inti=1;i<=n;i++){cout<<i<<(i==n?'\n':'......
  • CodeForces CF1986C Update Queries题解
    来吧,兄弟们,再来篇题解,其实也不是题解,是我自己的思路/心得/体会UpdateQueries题面翻译题目翻译一共$t$组数据,每组数据给定长度为$n$的字符串$s$,长度为$m$的$ind$数组和字符串$c$。你可以任意安排$ind$数组和字符串$c$的顺序,并按照此顺序对字符串$s$进行$m$......
  • **CodeForces CF1928B Equalize题解**
    ok兄弟们,今天本蒟蒻来做一篇小小的题解Equalize题面翻译有一个给定的长度为$n$的数列$a$,现在加上一个排列$b$,即$c_i=a_i+b_i$。现在求对于所有可能的$b$,$c$中出现最多的数的出现次数的最大值。translateby@UniGravity.题目描述Vasyahastwohobbies—addingpe......
  • CF292C Beautiful IP Addresses 题解(两种写法)
    题意一个IP地址是一个32位的2进制整数,分成四组8位的2进制整数(没有前导0)。比如说,0.255.1.123 是一个正确的IP地址,而0.256.1.123 和 0.255.1.01 不是正确的。定义一个合法的回文IP地址为BeautifulIPAddress(回文地址就是去掉“.”后是个回文字符串的地......