2025/2/26日组队过题记录

比赛链接:https://codeforces.com/gym/105644
本次只做了4道题,赛时三道题,还有一道题2小时没解决TLE,MLE等问题,赛后终于调出了

F. Five Letter Warning

思路:这个题目由我写,也是校队内第一个过了样例的,可惜没解决MLE和TLE问题,其实这题是一个线性的问题,1.要注意取模次数不能太多,能变成加减一定得变不然TLE,2.开滚动数组,这样才不会MLE

#include<iostream>
#define ll                             long long  
#pragma GCC optimize(3)                             
//#define endl "\n"//                           交互题记得删除
using namespace std;
inline string readstr() {
	string s = "";
	char ch;
	while ((ch = getchar()) != '\n') {
		s += ch;
	}
	return s;
}
ll e[150][150];
ll k[150][150];
ll pre[150];
ll fo[150];
ll zo[150][150];
ll wz[150];
int main()
{
      //cin.tie(0);
      string f;
      f=readstr();
      int mod;
      scanf("%d",&mod);
      int n=f.size();
      for(int i=0;i<n;i++)
      {
      pre[f[i]]++;
      }
      long long ans=0;
      for(int i=0;i<n;i++)
      { 
        ll fi=f[i];
        pre[fi]--;
        ll k1=i-wz[fi];
        ll k2=i-wz[fi]-1;
        k1%=mod;
        k2%=mod;
        for(int j=33;j<=126;j++)
        {
            if(pre[j]==0)continue;
            if(wz[fi]==0)
            {
                k[fi][j]=k[fi][j]+fo[j];
                while(k[fi][j]>=mod)k[fi][j]-=mod;
            }
            else 
            {
                ll jd=k[fi][j]-zo[fi][j];
                while(jd<0)jd+=mod;
                while(jd>=mod)jd-=mod;
                e[fi][j]=(e[fi][j]+jd*k1%mod)%mod+(zo[fi][j]*k2%mod)%mod;
                ans=(ans+e[fi][j]*(pre[j]))%mod;
                k[fi][j]=k[fi][j]+fo[j];
                while(k[fi][j]>=mod)k[fi][j]-=mod;
            }
            zo[fi][j]=fo[j];
        }
        wz[fi]=i;
        fo[fi]++;
        while(fo[fi]>=mod)fo[fi]-=mod;
      }
      printf("%lld\n",ans);
      return 0;
}

G. Gridlandia

思路:本题还是我写的,通过观察法发现偶数时按照顺时针构造,然后尽量往外边建墙即可,奇数时直接端点分别上上下下,然后暴力往外建即可,注意如果n>1,最后一次的国家可以不建墙,上面和下面的国家可以建墙。

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<deque>
#include<cctype>
#include<string.h>
#include<math.h>
#include<time.h>
#include<random>
#include<functional>
#include<stack>
#include<unordered_map>
#include<string>
#define ll                                  long long 
#define lowbit(x) (x & -x)
#define endl "\n"//                           交互题记得删除
using namespace std;
mt19937 rnd(time(0));
const ll mod = 998244353;
//const ll p=rnd()%mod;
#define F first
#define S second
ll ksm(ll x, ll y)
{
    ll ans = 1;
    while (y)
    {
        if (y & 1)
        {
            ans = ans % mod * (x % mod) % mod;
        }
        x = x % mod * (x % mod) % mod;
        y >>= 1;
    }
    return ans % mod % mod;
}
ll gcd(ll x, ll y)
{
    if (y == 0)
        return x;
    else
        return gcd(y, x % y);
}
void fio()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
struct s
{
    ll l, r;
    friend bool operator<(const s& a, const s& b)
    {
        return a.l > b.l;
    }
};
char a[1005][1005];
int main()
{
    fio();
    ll t;
     t=1;
    while (t--)
    {
       ll n;
       cin>>n;
       for(ll i=1;i<=n;i++)
       {
        for(ll j=1;j<=n;j++)a[i][j]='.';
       }
       ll l=1,r=n;
       if(n%2==0)
       {
        while(l<=r)
        {
            a[l][l]='L';
            a[l][r]='U';
            a[r][l]='D';
            a[r][r]='R';
            for(ll i=l+1;i<=r-1;i++)
            {
                if(a[l][i-1]!='U'&&a[l][i+1]!='U')a[l][i]='U';
                if(a[i-1][l]!='L'&&a[i+1][l]!='L')a[i][l]='L';
                if(a[i-1][r]!='R'&&a[i+1][r]!='R')a[i][r]='R';
                if(a[r][i-1]!='D'&&a[r][i+1]!='D')a[r][i]='D';
            }
            l++;
            r--;
        }
       }
       else 
       {
        ll ok=0;
        if(r!=1)ok=1;
        while(l<=r)
        {
            if(l==r&&ok==1)
            {
            a[l-1][l]='D',a[l+1][l]='U';
            break;
            }
            a[l][l]='U';
            a[l][r]='U';
            a[r][l]='D';
            a[r][r]='D';
            for(ll i=l+1;i<=r-1;i++)
            {
                if(a[l][i-1]!='U'&&a[l][i+1]!='U')a[l][i]='U';
                if(a[i-1][l]!='L'&&a[i+1][l]!='L')a[i][l]='L';
                if(a[i-1][r]!='R'&&a[i+1][r]!='R')a[i][r]='R';
                if(a[r][i-1]!='D'&&a[r][i+1]!='D')a[r][i]='D';
            }
            l++;
            r--;
        }
       }
       for(ll i=1;i<=n;i++)
       {
        for(ll j=1;j<=n;j++)cout<<a[i][j];
        cout<<endl;
       }
    }
}

I. Julienne the Deck

思路:这题不难,特判1,2,其他都是n*2然后取模,赛时wa了3次,没发现i!=n,特判错了

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<deque>
#include<cctype>
#include<string.h>
#include<math.h>
#include<time.h>
#include<random>
#include<functional>
#include<stack>
#include<unordered_map>
#include<string>
#define ll                                  long long 
#define lowbit(x) (x & -x)
//#define endl "\n"//                           交互题记得删除
using namespace std;
mt19937 rnd(time(0));
const ll mod = 998244353;
//const ll p=rnd()%mod;
#define F first
#define S second
ll ksm(ll x, ll y)
{
    ll ans = 1;
    while (y)
    {
        if (y & 1)
        {
            ans = ans % mod * (x % mod) % mod;
        }
        x = x % mod * (x % mod) % mod;
        y >>= 1;
    }
    return ans % mod % mod;
}
ll gcd(ll x, ll y)
{
    if (y == 0)
        return x;
    else
        return gcd(y, x % y);
}
void fio()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
struct s
{
    ll l, r;
    friend bool operator<(const s& a, const s& b)
    {
        return a.l > b.l;
    }
};
int main()
{
    fio();
    ll t;
    t=1;
    while (t--)
    {
        ll n;
        cin>>n;
        if(n<=2)
        cout<<1%mod<<endl;
        else 
        cout<<(n%mod*2)%mod<<endl;
    }
}

J. Knight's Tour Redux

思路:本题队友写的,代码量巨大

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll a[33];
void solve(){
	int n;
	scanf("%d",&n);
	if(n==1){
		printf("POSSIBLE\n1 1");
		return ;
	}else if(n==12){
		printf("POSSIBLE\n5 3\n2 4\n1 1\n4 2\n3 5\n");
		printf("6 6\n9 7\n12 8\n11 11\n8 12\n7 9\n10 10\n");
		return ;
	}else if(n>11&&(n-11)%9==0&&(n-11)%18!=0){
		printf("POSSIBLE\n5 3\n2 4\n1 1\n4 2\n3 5\n");
		int x=6,y=6;
		int jd=0,jd1=0;
		int cnt=0,k=0;
		for(int i=1;i<=n-11;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y++;
				}else if(jd1==1){
					x+=3;y--;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
		printf("%d %d\n",n-3,n-5);
		printf("%d %d\n",n,n-4);
		printf("%d %d\n",n-1,n-1);
		printf("%d %d\n",n-4,n);
		printf("%d %d\n",n-5,n-3);
		printf("%d %d\n",n-2,n-2);
		return ;
	}
	if(n%9==0){
		printf("POSSIBLE\n");
		int x=n,y=n;
		int k=0;
		int jd=0;
		int jd1=0;
		int cnt=0;
		for(int i=1;i<=n;i++){
			printf("%d %d\n",x,y);
			k++;
			if(k%9==0){
				k=0;
				x--;
				y-=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			cnt++;
			if(cnt%3==0){
				if(jd1==0){
					x-=3;
					y--;
				}else if(jd1==1){
					x-=3;
					y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x--;
				y-=3;
			}else if(jd==1){
				y+=3;
				x++;
			}
		}
	}else if(n%9==1){
		printf("POSSIBLE\n");
		int x=2,y=4;
		int jd=0,jd1=0;
		int cnt=0,k=0;
		printf("1 1\n");
		for(int i=2;i<=n;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y--;
				}else if(jd1==1){
					x+=3;y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
	}else if(n>9&&n%9==2&&(n-2)%18!=0){
		printf("POSSIBLE\n");
		int x=2,y=4;
		int jd=0,jd1=0;
		int cnt=0,k=0;
		printf("1 1\n");
		for(int i=2;i<=n-1;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y--;
				}else if(jd1==1){
					x+=3;y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
		printf("%d %d\n",n,n);
	}else if(n%18==12&&n>18){
		printf("POSSIBLE\n5 3\n2 4\n1 1\n4 2\n3 5\n");
		int x=6,y=6;
		int jd=0,jd1=1;
		int cnt=0,k=0;
		for(int i=1;i<=n-12;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y--;
				}else if(jd1==1){
					x+=3;y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
		printf("%d %d\n",n-6,n-6);
		printf("%d %d\n",n-3,n-5);
		printf("%d %d\n",n,n-4);
		printf("%d %d\n",n-1,n-1);
		printf("%d %d\n",n-4,n);
		printf("%d %d\n",n-5,n-3);
		printf("%d %d\n",n-2,n-2);
	}else if(n%9==8){
		printf("POSSIBLE\n");
		int x=n,y=n-2;
		int jd=0,jd1=0;
		int cnt=1,k=1;
		for(int i=1;i<=n;i++){
			printf("%d %d\n",x,y);
			k++;
			if(k%9==0){
				k=0;
				x--;
				y-=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			cnt++;
			if(cnt%3==0){
				if(jd1==0){
					x-=3;
					y--;
				}else if(jd1==1){
					x-=3;
					y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x--;
				y-=3;
			}else if(jd==1){
				y+=3;
				x++;
			}
		}
//		printf("%d %d\n",n,n);
	}else if(n%9==7){
		printf("POSSIBLE\n");
		printf("%d %d\n",n-2,n-2);
		printf("%d %d\n",n-5,n-3);
		printf("%d %d\n",n-4,n);
		printf("%d %d\n",n-1,n-1);
		printf("%d %d\n",n,n-4);
		printf("%d %d\n",n-3,n-5);
		printf("%d %d\n",n-6,n-6);
		int x=n-7,y=n-9;
		int k=0;
		int jd=0;
		int jd1=1;
		int cnt=0;
		for(int i=1;i<=n-7;i++){
			printf("%d %d\n",x,y);
			k++;
			if(k%9==0){
				k=0;
				x--;
				y-=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			cnt++;
			if(cnt%3==0){
				if(jd1==0){
					x-=3;
					y--;
				}else if(jd1==1){
					x-=3;
					y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x--;
				y-=3;
			}else if(jd==1){
				y+=3;
				x++;
			}
		}
	}else if(n%9==5||(n%9==4&&n>9&&(n-4)%18!=0)){
		printf("POSSIBLE\n5 3\n2 4\n1 1\n4 2\n3 5\n");
		int x=6,y=6;
		int jd=0,jd1=0;
		int cnt=0,k=0;
		for(int i=1;i<=n-5;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y++;
				}else if(jd1==1){
					x+=3;y--;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
	}else if((n%9==4&&n>18&&(n-4)%18==0)){
		printf("POSSIBLE\n5 3\n2 4\n1 1\n4 2\n3 5\n6 6\n");
		int x=7,y=9;
		int jd=0,jd1=1;
		int cnt=0,k=0;
		for(int i=1;i<=n-13;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y++;
				}else if(jd1==1){
					x+=3;y--;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
		printf("%d %d\n",n-6,n-6);
		printf("%d %d\n",n-3,n-5);
		printf("%d %d\n",n-2,n-2);
		printf("%d %d\n",n-5,n-1);
		printf("%d %d\n",n-4,n-4);
		printf("%d %d\n",n-1,n-3);
		printf("%d %d\n",n,n);
	}else if(n%18==3&&n>18){
		printf("POSSIBLE\n5 3\n2 4\n1 1\n4 2\n3 5\n6 6\n");
		int x=7,y=9;
		int jd=0,jd1=1;
		int cnt=0,k=0;
		for(int i=1;i<=n-12;i++){
			printf("%d %d\n",x,y);
			k++;
			cnt++;
			if(k%9==0){
				k=0;
				x++;y+=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			if(cnt%3==0){
				if(jd1==0){
					x+=3;y++;
				}else if(jd1==1){
					x+=3;y--;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x++;y+=3;
			}else if(jd==1){
				x--;y-=3;
			}
		}
		printf("%d %d\n",n-5,n-5);
		printf("%d %d\n",n-2,n-4);
		printf("%d %d\n",n-3,n-1);
		printf("%d %d\n",n,n);
		printf("%d %d\n",n-1,n-3);
		printf("%d %d\n",n-4,n-2);
	}else if(n%9==6){
		printf("POSSIBLE\n");
		printf("%d %d\n",n-2,n-2);
		printf("%d %d\n",n-5,n-3);
		printf("%d %d\n",n-4,n);
		printf("%d %d\n",n-1,n-1);
		printf("%d %d\n",n,n-4);
		printf("%d %d\n",n-3,n-5);
		int x=n-6,y=n-6;
		int k=0;
		int jd=0;
		int jd1=0;
		int cnt=0;
		for(int i=1;i<=n-6;i++){
			printf("%d %d\n",x,y);
			k++;
			if(k%9==0){
				k=0;
				x--;
				y-=3;
				jd1++;
				jd1%=2;
				jd=0;
				cnt=0;
				continue;
			}
			cnt++;
			if(cnt%3==0){
				if(jd1==0){
					x-=3;
					y--;
				}else if(jd1==1){
					x-=3;
					y++;
				}
				jd++;
				jd%=2;
				cnt=0;
				continue;
			}
			if(jd==0){
				x--;
				y-=3;
			}else if(jd==1){
				y+=3;
				x++;
			}
		}	
	}else{
		printf("IMPOSSIBLE");
	}
	
	return ;
}
int main(){
	int t=1;
	while(t--){
		solve();
	}
	return 0;	
}
posted @ 2025-02-26 21:19  长皆  阅读(76)  评论(0)    收藏  举报