Dashboard - Codeforces Round #752 (Div. 2) - Codeforces (Unofficial mirror site, accelerated for Chinese users)Codeforces. Programming competitions and contests, programming communityhttps://codeforces.ml/contest/1604放个链接在这里,然后开始小小的复盘

A比较简单跳过了,B想了一会,发现与XOR和相关的题目,一般都不会真的求XOR,很容易就想到,如果是偶数个数的话,全部切成1,那么xor和自然为0,但是如果是奇数,全部切成1就不行,那么我们只要划分一个降序的2,其他都是1,xor和又变成0了,也就是说,只有全部是升序的奇数个数情况才不行

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int num[maxn];
int dp1[maxn];
int uplength(int *now,int n){
    int l = 1;
    memset(dp1,0,sizeof dp1);
    dp1[1] = now[1];
    for(int i=2;i<=n;i++){
        if(now[i]>dp1[l])
            dp1[++l] = now[i];
        else{
            int j = upper_bound(dp1+1,dp1+l+1,now[i])-dp1;
            dp1[j] = now[i];
        }
    }
    return l;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i = 1;i<=n;i++){
            cin>>num[i];
        }
        if(n%2==0) {
            cout << "YES" << endl;   //全部分成只有一个点
            continue;
        }
        if(n%2!=0) {
            if(uplength(num,n)!=n)
                cout<<"YES"<<endl;
            else
                cout<<"No"<<endl;
        }
    }
}

这个地方其实可以不用上升最大子序列去判断,只要单纯判断这一个和前一个比是不是上升了就可以了。

然后是C,C有一个数论知识

如果一个数x 能整除一个集合a中所有数的 Lcm,那么x整除这个集合内的所有数。

两种不可能的情况,一种是谁都动不了,也就是大家都恰好整除i+1

第二种情况是某个数,即使被移动到前面的位置,所有位置都会被整除,也就是ai如果能整除前面位置+1的lcm,那么这个数就没有办法被挪开
 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    ll sum=b==0?a:gcd(b,a%b);
    return sum;
}
ll lcm(ll a,ll b)
{
    ll g=gcd(a,b);
    ll sum=a*b/g;
    return sum;
}
void solve(){
    int n;
    scanf("%d",&n);
    ll k=1,ok=1;
    for(int i=1;i<=n;i++)
    {
        ll x;
        scanf("%lld",&x);
        k=lcm(k,i+1);
        if(x%k==0)ok=0;
    }
    if(ok)puts("YES");
    else puts("NO");
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)solve();
    return 0;
}

D 非常巧妙的题目,我到现在也不能理解的很顺畅,总而言之就是三种情况

x=y,输出x

x>y  从n%x = y%n可以看出来,n也可能同时小于x和y,但是规律不太好找(不确定),n不可能在x和y中间,否则左边为n,右边一定小于y,矛盾了;确定的规律是,我们可以让n=x+y,这样左边就是n-x=x+y-x=y,右边是y,恒成立

x<y 看题解明白的,n在x和y中间的时候是可以找到一定规律的,n mod x = n -kx,我们可以让k最大,也就是让k = k/x,而y mod n = y-n,化简得到n = (y+y%x*x)/2;


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int t;cin>>t;
    ll x,y;
    while(t--){
        cin>>x>>y;
        if(x==y){
            cout<<x<<endl;
            continue;
        }
        if(x>=y){
            cout<<x+y<<endl;
            continue;
        }
        cout<<(y+(y/x)*x)/2<<endl;
    }
    return 0;
}
//知道两个偶数,找一个n n%x = y%n
//对应的n也是偶数
//两个如果相等,那么输出相等结果就可以了,如果两个不相等,那么根据大于或者小于去判断
//x>y,从 n%x = y%n可以看出来,我们如果让n = x+y,那么左边就会等于y,右边也等于y(相当于让左边等于x+y-x)
//x<y则不行,因为减去的x可能不止一个了,无法维持这个结论
//从公式可以推出n = (y+(y/x)*x)/2

后面的题没开,感觉做到这里就是极限了,一步一步来吧,这周尽量再把吉首大学那个新生赛补了

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐