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;
}

浙公网安备 33010602011771号