首页 > 其他分享 >Codeforces 956 Div2

Codeforces 956 Div2

时间:2024-07-14 10:52:56浏览次数:15  
标签:lb Div2 int sum Codeforces 956 && c1 ll

期末考试结束,开始训练

A. Array Divisibility

----------------------------------题解----------------------------

简单的构造题,要让数组a里面的下表为1<=k<=n的数以及下表为(k的因数)的数加起来的和能被K整除,那我们只需要让每一个k的因数都能被k整除就行了,直接让每一个编号i处所带的元素为i*i便可以实现,不信你就随便找几个k试一下例如(2,3,5)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cout<<i*i<<" ";
        }
        cout<<endl;
    }
}

B. Corner Twist


不擅长这种猜结论题,卡了很久

最后结论是每行每列的值模3不相等就不行

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=510;
char a[N][N];
char b[N][N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++) cin>>a[i][j];
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++) cin>>b[i][j];
        }
        int jud=0;
        int c1=0,c2=0;
        for(int i=1;i<=n;i++)
        {   c1=0,c2=0;
            for(int j=1;j<=m;j++)
            {
                c1+=a[i][j]-'0';
                c2+=b[i][j]-'0';
            }
            if(c1%3!=c2%3) jud=1;
        }
        for(int i=1;i<=m;i++)
        {   c1=0,c2=0;
            for(int j=1;j<=n;j++)
            {
                c1+=a[j][i]-'0';
                c2+=b[j][i]-'0';
            }
            if(c1%3!=c2%3) jud=1;
        }
        if(jud==1) cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
}
C. Have Your Cake and Eat It Too

--------------------------------------题解---------------------------------------

这题我尝试了一个暴力解法,我求出了a,b,c三个数组的前缀和,然后枚举每个数组的前缀和中所有能放在中间的值假如说把数组a取得数字放在中间 让B,和C各自取左右两边的编号都试试如果符合条件就输出,不符合就继续试,直到把三个数组全试玩,如果没有符合条件的,就返回-1.略微考验码力

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
ll a[N];
ll b[N],c[N];
ll a1[N],b1[N],c1[N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        ll sum=0;
        for(ll i=1;i<=n;i++) cin>>a[i],sum+=a[i];
        for(ll i=1;i<=n;i++) cin>>b[i];
        for(ll i=1;i<=n;i++) cin>>c[i];
        ll la=1,ra=1,lb=1,rb=1,lc=1,rc=1;
        ll s1=0;
        sum=sum/3+(sum%3!=0);
        a1[0]=b1[0]=c1[0]=0;
        for(ll i=1;i<=n;i++)
        {  
            a1[i]=a1[i-1]+a[i];
            b1[i]=b1[i-1]+b[i];
            c1[i]=c1[i-1]+c[i];
        }
        ll jud=0;
       for(ll i=1;i<=n;i++)
       {
       	s1+=a[i];
       	while(s1-a[la]>=sum)
       	{
       		s1-=a[la];
       		la++;
		}
		if(s1>=sum&&b1[la-1]>=sum&&c1[n]-c1[i]>=sum)
		{
			cout<<la<<" "<<i<<" "<<1<<" "<<la-1<<" "<<i+1<<" "<<n<<'\n';
			jud=1;
			break;
		}
		if(s1>=sum&&c1[la-1]>=sum&&b1[n]-b1[i]>=sum)
		{
			cout<<la<<" "<<i<<" "<<i+1<<" "<<n<<" "<<1<<" "<<la-1<<'\n';
			jud=1;
			break;
		}
	   }
        s1=0;
        if(jud==0){
		
        for(ll i=1;i<=n;i++)
       {
       	s1+=b[i];
       	while(s1-b[lb]>=sum)
       	{
       		s1-=b[lb];
       		lb++;
		}
		if(s1>=sum&&a1[lb-1]>=sum&&c1[n]-c1[i]>=sum)
		{
			cout<<1<<" "<<lb-1<<" "<<lb<<" "<<i<<" "<<i+1<<" "<<n<<'\n';
		
			jud=1;
			break;
		}
		if(s1>=sum&&c1[lb-1]>=sum&&a1[n]-a1[i]>=sum)
		{
			cout<<i+1<<" "<<n<<" "<<lb<<" "<<i<<" "<<1<<" "<<lb-1<<'\n';
			
			jud=1;
			break;
		}
	   }
	}
	s1=0;
	if(jud==0){
		lb=1;
	//	cout<<11111<<endl;
        for(ll i=1;i<=n;i++)
       {
       	s1+=c[i];
       	while(s1-c[lb]>=sum)
       	{
       		s1-=c[lb];
       		lb++;
		}
		if(s1>=sum&&a1[lb-1]>=sum&&b1[n]-b1[i]>=sum)
		{
			cout<<1<<" "<<lb-1<<" "<<i+1<<" "<<n<<" "<<lb<<" "<<i<<'\n';
			jud=1;
			break;
		}
		if(s1>=sum&&b1[lb-1]>=sum&&a1[n]-a1[i]>=sum)
		{
			cout<<i+1<<" "<<n<<" "<<1<<" "<<lb-1<<" "<<lb<<" "<<i<<'\n';
			jud=1;
			break;
		}
	   }
	}
        if(jud==0) cout<<"-1"<<'\n';
    }
    
}

/*
4
4 4 4 4
4 4 4 4
4 4 4 4
*/


D


能看到这的都是糕手了,我简要分析

------------------------------题解-----------------------------------------------

每交换一次,数组中逆序对数量的奇偶性都会发生改变,因此我猜测这题是个猜结论的,因为我没分析出来。结论大概是和逆序对的奇偶性有关。

我们设定一个数组不变,只变一个数组,看看需要变多少次才能让两数组相同,看看需要奇数次还是偶数次,如果是偶数次便可以,奇数次不行
可以类比于两个人互相接近,一次只能走1,如果距离点是偶数便可以两人最后不能停在一个格子,奇数就可以

这里我写的不好看贴一下别人代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200005], b[200005];
map<int, int> mp;
void solve()
{
	mp.clear();
    int n;
    cin >> n;
    for (int i=1;i<=n;i++) 
	cin >> a[i];
    for (int i=1;i<=n;i++)
	{
        cin >> b[i];
        mp[b[i]]=i;
    }
    int ans = 0;
    for (int i=1;i<=n;i++)
	{
        if (b[i] == a[i]) 
		continue;
        if (mp.count(a[i]) == 0)
		{
            cout << "NO\n";
            return;
        }
        int p=mp[a[i]];
        swap(b[i],b[p]);
        mp[b[i]]=i;
        mp[b[p]]=p;
        ans+=1; 
    }
    if (ans%2 == 0) 
	cout << "YES\n";
    else 
	cout << "NO\n";
}
signed main()
{
    int t;
    cin >> t;
    while (t--) 
	solve();
    return 0;
}


**You can BE the best**

标签:lb,Div2,int,sum,Codeforces,956,&&,c1,ll
From: https://www.cnblogs.com/qau-marisa3/p/18301138

相关文章

  • CodeForces - 1982E
    分析可以设状态\(f_{l,r,k}\)表示区间\([l,r],bit(x\in[l,r])\lek\)的{前缀长度,后缀长度,总方案数}。合并即找一个\(mid\),类似最大子段和的合并。如何找个\(mid\)是解题的关键,关于二进制分治题目,令\(mid\)为highbit或lowbit通常有很好的性质,本题\(mid\)为highbit......
  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • CodeForces Round 957 (Div3)
    蒟蒻找了一些简单题做了而已,别太在意……比赛链接CodeForcesRound957(Div3)A.OnlyPluses题意三个正整数\(a,b,c\),有五次操作机会。每次操作:选取\(a,b,c\)中任意一个数,将这个数加上一。要求最大化\(a\timesb\timesc\)。思路很直接的贪心题。假设有三个正整......
  • Codeforces Round 957 (Div. 3) A-G 题解
    CodeforcesRound957(Div.3)A-G题解A.OnlyPluses枚举思路:枚举\(a\),\(b\),\(c\)增加的次数,维护最值即可。代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#......
  • CodeForces - 1984F
    分析考虑相邻两个字符带来的约束。若为"SS",则满足$|b_i-b_{i+1}|\lem$若为"PP",则满足\(|b_{i+1}-b_i|\lem\)若为"PS",则满足\(tot_a=b_i+b_{i+1}\)若为"SP",则满足\(tot_a+a_{i}+a_{i+1}=b_i+b_{i+1}\)发现可以枚举"PS"的位置来确定\(to......
  • Codeforces Round 957 (Div. 3)
    E-Novice'sMistake题意为寻找n*a-b=("n"+"n"+...){a个n的字符串-b的长度}即为"2"⋅20−18="22222222222222222222"−18=22=2⋅20−18使用暴力枚举每个n相加的长度和又因为n<=100a<=100000所有答案t的值必定小于1e6所以对每个a进行枚举对于每个答案t进行判断是否成立其......
  • CodeForces - 1987F1 & CodeForces - 1987F2
    分析首先显然有dp状态\(g_i\)表示前\(i\)个数,能进行最大的操作次数。转移有\(g_i=\max\limits_{j=1}^{i-1}(g_j+\frac{i-j}{2})[2|(i-j)]\)但这里显然缺少转移条件。经过基本观察,发现若\(i\)操作过,满足条件:\(a_i\equivi(mod\2)\)\(i\)左侧操作过\(\frac{i-......
  • Codeforces Round 957 (Div. 3)
    推荐个C++编程仓库模板https://github.com/yxc-s/programming-templateA.OnlyPluses总结:为什么优先增加最小的数,它们的乘积会是最优的呢?可以这么理解,假如只有两个数a和b,b>a,那么a+1,就增加一份b。如果b+1,只能增加1份a。因为b>a,所以增加小的数是最优的。voidsolve(){......
  • Codeforces Round #956 (Div. 2)题解
    A.ArrayDivisibility需要让满足$k\midj$的所有\(a_j\)的和整除k,只需要让每个\(a_j\)整除k就可以了,可以让\(a_j=j\)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'typedefpair<int,int>pii;typedefunsignedlonglo......
  • CodeForces - 1986G1 & CodeForces - 1986G2
    经过基本观察,可得当点对\((i,j)\)合法时,有\(a_i|b_j,a_j|b_i\),其中\(a_i=i/gcd(p_i,i),b_i=p_i/gcd(p_i,i)\),证明显然。如何维护?考虑开\(mp_{x,y}\)表示\(x=a_i\),\(y|b_i\)的个数。对于点\(i\)点对个数即为\(\sum\limits_{d|b_i}mp_{d,a_i}\)时间复杂度为\(O(nlog......