CF #569 Div. 2(All)

https://codeforces.com/contest/1180

A:

题意:求第n个有几个,n<100

思路 :for

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX =1e6+5;
int main(){
    int n;cin>>n;
    LL ans=0;
    for(int i=1;i<n*2;i+=2){
        ans+=(LL)i;
    }
    for(int i=1;i<n*2-2;i+=2)
        ans+=(LL)i;
    cout<<ans;
    return 0;
}

B:

题意:给n个数,每个数可以执行任意次操作:

求最后可以使得n个数的乘积最大的数组(任意一个)

思路:先将ai变成负数,如果n%2==1取一个绝对值最大的变成正数。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX =1e6+5;
 
int a[MX];
 
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
        if(a[i]>=0) a[i]=a[i]*-1-1;
    }
    if(n%2==0){
        for(int i=1;i<=n;i++)printf("%d ",a[i]);
        return 0;
    }
    int u=1,mx=0;
    for(int i=1;i<=n;i++){
        if(a[i]<mx) mx=a[i],u=i;
    }
    a[u]=-a[u]-1;
    for(int i=1;i<=n;i++)
        printf("%d ",a[i]);
 
    return 0;
}

C:

题意:每次取出数组前两个数,大的放前面,小的放后面,求第i次操作操作的两个数是什么。

思路:肯定是最大的会被操作到第一位,然后循环操作,那么相应模拟一遍之后取模即可。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX =1e6+5;
 
int a[MX];int n,q;
map<int,pair<int,int> >mp;
vector<int>v;
void get(int u){
    deque<int>q;
    for(int i=1;i<=n;i++)q.push_back(a[i]);
    for(int i=1;i<u;i++){
        int A=q.front();q.pop_front();
        int B=q.front();q.pop_front();
        mp[i]=make_pair(A,B);
        if(A>=B)swap(A,B);
        q.push_back(A);q.push_front(B);
    }
    q.pop_front();
    while(!q.empty()){
        v.push_back(q.front());
        q.pop_front();
    }
}
int main(){
    cin>>n>>q;for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    int u,mx=-1;
    for(int i=1;i<=n;i++){
        if(a[i]>mx)mx=a[i],u=i;
    }
    get(u);
    while(q--){
        LL x;cin>>x;
        if(x<u)printf("%d %d\n",mp[x].first,mp[x].second);
        else {
            LL zz=(x-(LL)u)%(LL)(n-1);
            printf("%d %d\n",mx,v[zz]);
        }
    }
    return 0;
}

D:

题意:给一个n*m的矩阵,从(1,1)出发,每次可以到达任意一个点,求遍历完所有的点后,所有的移动矢量都不相同。

思路:构造题,日常被卡,大概一种比较好的构造:每次走(第一行,最后一行),然后回到(第二行,倒数第二行),如果n%2==1,再走来走去即可。

 #include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MX = 1e6+5;
 
int main(){
    int n,m;cin>>n>>m;
        for(int i=1;i<=n/2;i++){
            int l=1,r=m;
            for(int j=1;j<=m;j++){
                printf("%d %d\n",i,l++);
                printf("%d %d\n",n+1-i,r--);
            }
        }
    
    if(n%2==1){
        int l=1,r=m;
        while(r-l>=1){
            printf("%d %d\n",n/2+1,l++);
            printf("%d %d\n",n/2+1,r--);
        }
        if(l==r) printf("%d %d\n",n/2+1,l++);
    }
    return 0;
}

 E:区间最小线段树

独立文章:https://blog.youkuaiyun.com/qq_41730604/article/details/94913814

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值