选拔赛2

A

https://codeforces.com/gym/105588/problem/M
还是有点难读,相邻两个的和不能重复出现。
打表,奇数偶数分开打表,发现奇数错开一个,偶数照常

#include<iostream>
using namespace std;
#include<cstring>

/*int a[10][10];bool flag=1;
bool vis[100];int n,m;
bool check(){
    int vis1[100]={0};
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i+1<=n){
                int t1=a[i][j]+a[i+1][j];
                if(vis1[t1])return 0;
                vis1[t1]=1;
            }
            if(j+1<=m){
                int t2=a[i][j]+a[i][j+1];
                if(vis1[t2])return 0;
                vis1[t2]=1;
            }
        }
    }
    return 1;
}

void dfs(int x,int y){
    if(flag)return ;
    if(x==n+1&&y==1){
        if(check()){
            cout<<"get"<<n<<" "<<m<<endl;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    printf("%d ",a[i][j]);
                }printf("\n");
            }
            flag=1;
        }
        return ;
    }
    
    for(int i=1;i<=n*m;i++){
        if(!vis[i]){
            vis[i]=1;a[x][y]=i;
            if(y!=m)
            dfs(x,y+1);
            else dfs(x+1,1);
            vis[i]=0;
        }
    }
}
void dabiao(){
    for(int i=2;i<=5;i++){
        for(int j=3;j<=5;j+=2){
            memset(vis,0,sizeof(vis));
            n=i;m=j;flag=0;
            dfs(1,1);
            if(!flag)cout<<"no\n";
        }
    }
    for(int i=2;i<=5;i++){
        for(int j=2;j<=5;j+=2){
             memset(vis,0,sizeof(vis));
            n=i;m=j;flag=0;
            dfs(1,1);
            if(!flag)cout<<"no\n";
        }
    }
}

 */

 int n,m;
int main(){
//dabiao();
int T;cin>>T;
while(T--){
    cin>>n>>m;
    printf("YES\n");
    int cnt=1;
    if(m&1){
        for(int i=1;i<=n;i++){
            if(i&1){
                for(int j=1;j<=m;j++){
                    printf("%d ",cnt);cnt++;
                }
            }
            else {
                int bf=cnt;cnt++;
                for(int j=1;j<=m-1;j++){
                    printf("%d ",cnt);cnt++;
                }printf("%d ",bf);
            }printf("\n");
        }
        
    }else {
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                printf("%d ",cnt);cnt++;
            }printf("\n");
        }
    }
}

}

B

https://codeforces.com/gym/104090/problem/D
列转移一圈后的结果,等于开始的结果,
方程秩为n-1,能解出来比例。

#include<iostream>
using namespace std;
int n;double sum=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){double temp;scanf("%lf",&temp);sum+=temp;}
double x=2.0*sum/(1.0*(n+1));double y=x/2.0;
for(int i=1;i<=n;i++){
    if(i==1)printf("%.8lf ",x);
    else printf("%.8lf ",y);
}
}

C

没过??

D

数据结构2,不用差分的话
https://codeforces.com/gym/104128/problem/D

二分,

转化为判断能否在一次操作后,数组第k大元素>=X
转化为能否在一次操作后,数组>=X的个数>=k

对于某一个元素可以O(1)算出将它变为>=X需要把等差数列首项放在哪里,一个区间[l[i],r[i]]
它对这个区间内有贡献,对[l[i],r[i]]区间权值+1
转化为是否存在一个位置,这个位置权值>=k

#include<iostream>
using namespace std;
#include<cstring>
#define ll long long
const ll N=200010;
ll n,m,k,c,d;
ll b[N];ll a[N];ll na[N];
ll l[N];ll r[N];

bool check(ll mid){
memset(b,0,sizeof(b));
    for(ll i=1;i<=n;i++){
        if(a[i]>=mid){
            l[i]=1;r[i]=n;
            b[l[i]]++;b[r[i]+1]--;
        }
        else {
            if(a[i]+c+d*(min(i,m)-1)<mid){
                l[i]=-1;r[i]=-1;
            }
            else {
                if(d){
  l[i]=max(1ll,i-m+1);r[i]=min(i,(a[i]+c+d*i-mid)/d);//如果c足够大,就算加负多少倍的d也可以正好
  //cout<<l[i]<<" "<<r[i]<<endl;
                b[l[i]]++;b[r[i]+1]--;
                }else {
                    l[i]=max(1ll,i+1-m);r[i]=i;
                    b[l[i]]++;b[r[i]+1]--;
                }

            }
        }

    }


    for(ll i=1;i<=n;i++){
        na[i]=na[i-1]+b[i];
        if(na[i]>=k)return 1;
    }
return 0;
}


int main(){
    cin>>n>>k>>m>>c>>d;
    for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
    ll l=0;ll r=1e17;
    while(l<r){
       // cout<<"check"<<l<<" "<<r<<endl;
        ll mid=(l+r+1)>>1;
        if(check(mid))l=mid;
        else r=mid-1;
    }
    printf("%lld\n",l);
}

G. Arpa’s overnight party and Mehrdad’s silent entering

二分图:只有偶环
建男女朋友之间边,2i-1和2i之间的边(为什么不能2i 2i+1另一种?)
二分图染色

#include<iostream>
using namespace std;
#include<vector>
const int N=100010;

int px[N];int py[N];
int col[2*N];int n;
vector<int> G[2*N];

void dfs(int u,int fa){
if(col[fa]==1)col[u]=2;
else col[u]=1;

for(auto v:G[u]){
    if(!col[v])
    dfs(v,u);
}

}


int main(){

cin>>n;
for(int i=1;i<=n;i++){
    scanf("%d%d",&px[i],&py[i]);
    G[px[i]].push_back(py[i]);G[py[i]].push_back(px[i]);
}
for(int i=1;i<=n;i++){
    G[2*i].push_back(2*i-1);
    G[2*i-1].push_back(2*i);
}

for(int i=1;i<=2*n;i++){
    if(!col[i])dfs(i,0);
}

for(int i=1;i<=n;i++){
    printf("%d %d\n",col[px[i]],col[py[i]]);
}

}
posted @ 2025-05-15 22:45  arin876  阅读(9)  评论(0)    收藏  举报