Codeforces Round #836 (Div. 2) A~E

A. SSeeeeiinngg DDoouubbllee

一个字符串正着输出一遍,反正输出一遍就好了。

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
using namespace std;
const int _=1e6+7;
// const int mod=998244353;
int read() {
    
    
    int x=0,f=1;char s=getchar();
    for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
int n,a[_];
void solve() {
    
    
    string a;
    cin>>a;
    cout<<a;
    for(int i=a.length()-1;i>=0;--i) cout<<a[i];cout<<"\n";
}
int main() {
    
    
    #ifdef ONLINE_JUDGE
    #else
        // freopen("a.in","r",stdin);
// /        freopen("a.out","w",stdout);
    #endif
    int T=read();
    while(T--) {
    
    
        solve();
    }   
    return 0;
}

B. XOR = Average

n为奇数直接全是1,这样异或和以及均值都是1。
n为偶数就1,3,2,2,2,2…这样异或和以及均值都为2。

#include<bits/stdc++.h>
#define clean(x) memset(x,0,sizeof(x))
#define fil(x,n) fill(x,x+1+n,0)
#define inf 2000000009
#define maxn 1000005
#define int long long
using namespace std;

int read()
{
    
    
	int x=1,res=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
    
    
		if(c=='-')
		x=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
    
    
		res=res*10+(c-'0');
		c=getchar();
	}
	return res*x;
}

void solve() {
    
    
	int n=read();
	if(n%2==1) for(int i=1;i<=n;i++) cout<<1<<" ";
	else {
    
    
		cout<<1<<" "<<3<<" ";
		for(int i=3;i<=n;i++) cout<<2<<" ";
	}
	puts("");
}

signed main()
{
    
    
	int t=read();
	while(t--) solve();
	return 0;
}

C. Almost All Multiples

首先,如果有解,必须满足 x x x n n n的因数。在起始时刻,数组下标为 x x x的位置数值为n,考虑字典序最小的话,由于下标 x x x之前的位置已经是最优的,所以只需要考虑之后的数值,我们每次只需要找到 x x x最小的倍数,并且这个数同时满足是 n n n的因数,只需要从小到大枚举 x x x的倍数即可,时间复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
#define clean(x) memset(x,0,sizeof(x))
#define fil(x,n) fill(x,x+1+n,0)
#define inf 2000000009
#define maxn 1000005
#define int long long
using namespace std;

int read()
{
    
    
    int x=1,res=0;
    char c=getchar();
    while(c<'0'||c>'9')
    {
    
    
        if(c=='-')
        x=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
    
    
        res=res*10+(c-'0');
        c=getchar();
    }
    return res*x;
}
int a[maxn];
void solve() {
    
    
    int n=read(),x=read();
    if(n%x!=0) puts("-1");
    else {
    
    
        for(int i=1;i<=n;i++) a[i]=i;
        a[1]=x;a[x]=n;a[n]=1;
        for(int i=x*2;i<n;i+=x) {
    
    
            if((i%x)==0&&(n%i)==0) {
    
    
                swap(a[x],a[i]);
                x=i;
            }
        }
        for(int i=1;i<=n;i++) cout<<a[i]<<" ";
        puts("");
    }    
}

signed main()
{
    
    
    int t=read();
    while(t--) solve();
    return 0;
}

D. Range = √Sum

这算是一个比较水的构造了。
如果 n n n为偶数,我们令 s u m = n ⇒ s u m = n 2 \sqrt{sum}=n \Rightarrow{sum=n^2} sum =nsum=n2,比较显然只要均值为 n n n就可以,这样我们只需要取 [ n 2 , n − 1 ] 和 [ n + 1 , n + n 2 ] [\frac{n}{2},n-1]和[n+1,n+\frac{n}{2}] [2n,n1][n+1,n+2n]两个区间的 n n n个数即可。
如果 n n n为奇数,我们令 s u m = 2 n ⇒ s u m = 4 n 2 \sqrt{sum}=2n\Rightarrow{sum=4n^2} sum =2nsum=4n2,这样需要均值为 4 n 4n 4n,我们取 [ 4 n − ⌊ n 2 ⌋ + 1 , 4 n + ⌊ n 2 ⌋ − 1 ] [4n-\lfloor\frac{n}{2}\rfloor+1,4n+\lfloor\frac{n}{2}\rfloor-1] [4n2n+1,4n+2n1]区间中的 n − 2 n-2 n2个数,再取 3 n 3n 3n 5 n 5n 5n这两个数即可。

#include<bits/stdc++.h>
#define clean(x) memset(x,0,sizeof(x))
#define fil(x,n) fill(x,x+1+n,0)
#define inf 2000000009
#define maxn 1000005
#define int long long
using namespace std;

int read()
{
    
    
    int x=1,res=0;
    char c=getchar();
    while(c<'0'||c>'9')
    {
    
    
        if(c=='-')
        x=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
    
    
        res=res*10+(c-'0');
        c=getchar();
    }
    return res*x;
}

void solve() {
    
    
    vector<int>a;
    int n=read();
    if(n%2==0) {
    
    
        for(int i=n-n/2;i<n;i++) cout<<i<<" ",a.push_back(i);
        for(int i=n+1;i<=n+n/2;i++) cout<<i<<" ",a.push_back(i);
        puts("");
    }
    else {
    
    
        int x=n/2-1;
        for(int i=4*n-x;i<=x+4*n;i++) cout<<i<<" ",a.push_back(i);
        cout<<5*n<<" "<<3*n<<endl;
        a.push_back(5*n);a.push_back(3*n);
    }
    // int sum=0,ma=-1,mi=2e9;
    // for(int i:a) sum+=i,ma=max(ma,i),mi=min(mi,i);
    // cout<<sqrt(sum)<<" "<<ma-mi<<endl;
}

signed main()
{
    
    
    int t=read();
    while(t--) solve();
    return 0;
}

E. Tick, Tock

题目大意:给一个 n ∗ m n*m nm的方格,格子上可以有数 [ 0 , h − 1 ] [0,h-1] [0,h1]代表这个格子上的钟表处于某一个时刻,也可以是 − 1 -1 1表示这个格子里钟表的时刻可以是任意的,并且,你可以把每一行或者每一列的钟表的时刻同时改变一个相同的数字,问有多少种方法把可以任意调节的钟表调节完后,能够通过有限次操作使得所有的钟表的时间全部统一。

题解:可以按照行和列来考虑,把 n n n行拆成 n n n个点, m m m列也同样拆分成 m m m个点,然后如果一个位置 ( i , j ) (i,j) (i,j)上面有数字 v a l val val,我们就从第 i i i行向第 j j j列连一条权值为 v a l val val的边,这样我们只需要对每一个连通块单独考虑即可;对于每一个单独的连通块,记边为 ( u , v ) (u,v) (u,v),记点权为 p i p_i pi,边权为 d i s i , j dis_{i,j} disi,j,如果对于所有的边都能够保证 ( p u + p v + d i s u , v ) % m o d = 0 (p_u+p_v+dis_{u,v}) \%mod=0 (pu+pv+disu,v)%mod=0,我们把这样的连通块成为一个好的连通块,判断可以通过类似二分图染色的方法实现,可以将第一个点赋值为 0 0 0,然后就是一个带边权的二分图染色问题,如果图中出现某个连通块不是好的,答案一定为0,否则,记好的连通块个数为cnt,答案就是 a n s = h c n t − 1 ans=h^{cnt-1} ans=hcnt1

#include<bits/stdc++.h>
#define clean(x) memset(x,0,sizeof(x))
#define fil(x,n) fill(x,x+1+n,0)
#define inf 2000000009
#define maxn 400005
#define int long long
#define mod 1000000007
using namespace std;

int read()
{
    
    
    int x=1,res=0;
    char c=getchar();
    while(c<'0'||c>'9')
    {
    
    
        if(c=='-')
        x=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
    
    
        res=res*10+(c-'0');
        c=getchar();
    }
    return res*x;
}
int vis[maxn],f[maxn],pd,n,m,k;
vector<array<int,2>>g[maxn];
void dfs(int x,int dd) {
    
    
    vis[x]=1;f[x]=dd;
    for(auto i:g[x]) {
    
    
        int v=i[0],dis=i[1];
        if(f[v]==-1) {
    
    
            int s=((-dd-dis)%k+k)%k;
            dfs(v,s);
        }
        else if(((dd+f[v]+dis)%k+k)%k!=0) pd=0;
    }
}

void solve() {
    
    
    n=read(),m=read(),k=read();
    for(int i=1;i<=n+m;i++) vis[i]=0,g[i].clear(),f[i]=-1;
    for(int i=1;i<=n;i++) {
    
    
        for(int j=1;j<=m;j++) {
    
    
            int x=read();
            if(x==-1) continue;
            else {
    
    
                g[i].push_back({
    
    j+n,x});
                g[j+n].push_back({
    
    i,x});
            } 
        }
    }
    auto qpow=[&](int a,int b) {
    
    
        int ans=1;
        while(b) {
    
    
            if(b&1) ans=ans*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return ans;
    };
    int ans=1,cnt=0;
    for(int i=1;i<=n+m;i++) {
    
    
        if(vis[i]) continue;
        vis[i]=1;
        if(g[i].size()==0) cnt++;
        else {
    
    
            f[i]=0;pd=1;
            dfs(i,0);
            if(pd==1) cnt++;
            else ans=0;
        }
    }
    if(ans==0) puts("0");
    else cout<<qpow(k,cnt-1)<<endl;
}

signed main()
{
    
    
    int t=read();
    while(t--) solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/NEUQ_snowy/article/details/128268159