首页 > 其他分享 >Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)

时间:2024-07-20 11:18:52浏览次数:6  
标签:959 int sum Codeforces cin -- solve ans Div

A.给定n*m的矩阵a,构造一个同样大小的矩阵b使得[1,n*m]都出现一次,且b和a在任意位置上都不相等。

特判完无解后循环移位即可。

#include<bits/stdc++.h>
using namespace std;
int a[12][12];
void solve(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	if(n==1&&m==1){
		cout<<-1<<"\n";
		return;
	}
	if(n==1){
		for(int i=1;i<m;i++) cout<<a[1][i+1]<<" ";
		cout<<a[1][1]<<"\n";
		return;
	}
	if(m==1){
		for(int i=1;i<n;i++) cout<<a[i+1][1]<<"\n";
		cout<<a[1][1]<<"\n";
		return;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<m;j++) cout<<a[i][j+1]<<" ";
		cout<<a[i][1]<<"\n";
	}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		//TODO
		solve();
	}
}

B.

#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n;cin>>n;
	string s,t;cin>>s>>t;
	int cnt=0;
	for(int i=0;i<n;i++) cnt+=(s[i]==t[i]);
	if(cnt==n){
		cout<<"YES"<<"\n";return;
	}
	int prefix=-1;
	for(int i=0;i<n;i++){
		if(s[i]=='0'&&t[i]=='0') prefix=i;
		else break;
	}
	if(s[1+prefix]=='0'&&t[1+prefix]=='1') {
		cout<<"NO"<<"\n";
	}
	else cout<<"YES"<<"\n";
}
int main(){
	int t;cin>>t;
	while(t--){
		//TODO
		solve();
	}
}

C.

倒着dp+小二分

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int a[N];
typedef long long ll;
ll sum[N],f[N];
void solve(){
	int k;ll n;
	cin>>n>>k;
	
	sum[0]=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	
	sum[n+1]=0;
	f[n+1]=0;
	for(int i=n;i>=1;i--){
		if(a[i]>k){
			f[i]=f[i+1]+1;
		}
		else {
			int ans=-1;
			int l=i+1,r=n;
			while(l<=r){
				int mid=(l+r)>>1;
				if(sum[mid]-sum[i-1]>1ll*k){
					ans=mid;
					r=mid-1;
				}
				else l=mid+1;
			}
			if(ans!=-1) {
				f[i]=f[ans+1]+1;	
			}
			else f[i]=0;
		}
	}
	ll tot=n*(n-1)/2+n;
	for(int i=1;i<=n;i++) tot-=f[i];
	cout<<tot<<"\n";
}
int main(){
	int t;cin>>t;
	while(t--){
		//TODO
		solve();
	}
}

D.

考虑 |ai-aj| 能整除 x 其实就是在模x意义下同余,考虑到模数比较小,根据鸽笼原理肯定有两个点能连边。

又因为模数小的更容易满足,所以倒着从大开始做(从n-1开始),比较好处理的小模数放后面。

对于n-1必然能找到两个点连边,设为(u,v),接下来把u踢掉

问题转化成更小的子问题,从而一定有解。

#include<bits/stdc++.h>
using namespace std;
const int N = 2005;
int a[N+5];
void solve(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int vis[N+5]={0};
    
    vector<pair<int,int>>ans;
    for(int i=n-1;i>=1;i--){
        
        vector<int>mo[i+1];
        for(int j=1;j<=n;j++){
            if(vis[j]) continue;
            mo[a[j]%i].push_back(j);
        }
        
        int flag=0;
        for(int j=0;j<i && (flag==0) ;j++){
            
            if(mo[j].size()>=2){
                vis[mo[j][0]]=1;
                ans.push_back({mo[j][0],mo[j][1]});
                flag=1;
            }
        }
    }
    cout<<"YES"<<"\n";
    for(int i=ans.size()-1;i>=0;i--){
        cout<<ans[i].first<<" "<<ans[i].second<<"\n";
    }
}
int main(){
    int t;cin>>t;
    while(t--){
        solve();
    }
}

E

比D简单的诈骗题,发现大小为sz的树可以通过删叶子得到[1,sz]内的任意数,所以不考虑树的形态

然后贪心+分类讨论

设当前or出来的最大值为ans,当前考虑的数为x

从大到小拆位后,若当前位上x为0,跳过;否则若ans=0,x就可以对该位产生贡献,ans | = 1<< j ;若ans = 1,说明该位的贡献都已经得到了,且x>=(1<<j),就可以贪心地把x删成((1<<j)-1)使得后面的位都为1。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int a[N];
void solve(){
    int k;cin>>k;
    for(int i=1;i<=k;i++){
        cin>>a[i];
        int x;
        for(int j=1;j<a[i];j++) cin>>x;
    }
    sort(a+1,a+k+1);
    int ans=0;
    for(int i=1;i<=k;i++){
        for(int j=24;j>=0;j--){
            int b1=(ans>>j)&1,b2=(a[i]>>j)&1;
            if(b2==0) continue;
            if(b1==0) ans|=(1<<j);
            else {
                ans|=((1<<j)-1);
                break;
            }
        }
    }
    cout<<ans<<"\n";
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        solve();
    }
}

 

标签:959,int,sum,Codeforces,cin,--,solve,ans,Div
From: https://www.cnblogs.com/liyishui2003/p/18312881

相关文章

  • CodeForces Round #959 sponsored by NEAR (Div. 1 + Div. 2) 补题记录(A~E)
    简单场.pngA若\(n\timesm=1\)则显然无解。否则因为\(a\)矩阵是一个\(n\timesm\)的排列,所以说只需要让其循环右移一位即可。时间复杂度\(O(nm)\)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=500100;inta[233][233];sign......
  • codeforce959
    CodeforcesRound959sponsoredbyNEAR(Div.1+Div.2)A.DiverseGametimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputPetr,watchingSergey'sstream,cameupwithamatrix\(a\),c......
  • 题解 Codeforces 1994H Fortnite
    首先第一次询问肯定是问\(\texttt{aa}\),答案减去\(1\)得到基数\(p\)。然后我们随意询问一个真实Hash值(取模之前)\(X\)大于模数\(m\)的字符串,例如\(s=\texttt{zzz}\cdots\texttt{zzz}\)(\(50\)个\(\textttz\))。设它取模得到的Hash值是\(a\)。考虑正整数\(1\leqb......
  • 7.18 史也分好坏,R959 是好史。
    CFR959(Div.1+2)Solve:A~E(5/8)Rank:777Rating:\(2117-1=2116\)发挥评价:Bad唉,天天喂这种比赛。然后我自己在简单题上唐完了,被卡住了,而且还被cf的波特验证控住了。以后少慌,加快速度,提前截好图。(其实最后已经会G了写完就上大分,但是来不及咯)争取下次上分吧。......
  • CodeForces - 1139D
    题目大意序列每次随机添加一个\([1,m]\)的整数,直到序列\(gcd=1\)停止,求期望操作次数。分析模拟过程发现只关心整个序列的\(gcd\)与下一次会添加什么,那么根据期望\(dp\)套路可得状态\(f_{i}\)表示当前序列\(gcd=i\),期望还操作多少次使得\(gcd=1\)。考虑枚举下一个......
  • 「比赛记录」CF Round 954 (Div. 3)
    CodeforcesRound954(Div.3)题目列表:A.XAxisB.MatrixStabilizationC.UpdateQueriesD.MathematicalProblemE.BeautifulArrayF.Non-academicProblemG1.PermutationProblem(SimpleVersion)G2.PermutationProblem(HardVersion)A.XAxis题......
  • Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
    A直接速通就好了,我第一眼看的时候以为是整个数组可以有重复的数字,后面发现是保证没有的,所以直接随便交换一下位置就结束了。B,很经典的CF题,随便推导一下就能够发现,如果我想要一个位置能够发生变化,那么唯一的要求就是他以及他前面的位置有1出现过。而且完全不需要考虑为了一个数字......
  • Round 959
    A给定\(n*m\)数组\(a\),$1\lea_i\len*m$并且两两不同,问是否存在数组\(b\),也使用这些元素,并且每个位置的值都与\(a\)不同。\(1*1\)数组特判,其他循环移位。B给定01串s和t,可以对s任意次执行以下操作:选择l,r,将l,r异或等长前缀,问s和t是否能相等对于s和t第一个不同的位置......
  • Educational Codeforces Round 139 (Rated for Div. 2)
    A.ExtremelyRound----------------------------------题解-------------------------------------因为数据范围只有1e6,我们只需要预处理出来1-1e6每个每个数包含多少个极圆整数就行了,然后t次查询就可以。这种预处理查询是面对多次询问时应该首先想到的。点击查看代码#incl......
  • 题解:CF1912D Divisibility Test
    又是一道水绿。刚刚小学毕业的数学idiot——我释怀地笑了。第一种很好判断,当$b^k$为$n$的倍数时,取基数为$b$的能被$n$整除的整数$c$的最后$k$位数显然能被$n$整除。第二种也不难,当$b^k\equiv1\pmodn$时,取以$b$为底数的能被$n$整除的整数$c$的$k$......