G. Mischievous Shooter
1.C. Insert and Equalize2.C. Removal of Unattractive Pairs3.D. Jumping Through Segments4.E. Good Triples5.F. Shift and Reverse6.D. Yet Another Monster Fight7.A. Constructive Problems8.C. Game with Multiset9.A. Rating Increase10.B. Swap and Delete11.A. Problemsolving Log12.B. Preparing for the Contest13.C. Quests14.D. Three Activities15.E2. Game with Marbles (Hard Version)16.cf刷题有感17.A. Anonymous Informant18.A. Forked!19.B. Make Almost Equal With Mod20.C. Heavy Intervals21.D. Split Plus K22.A. 202323.B. Two Divisors24.C. Training Before the Olympiad25.D. Mathematical Problem26.F. Greetings27.C. Partitioning the Array28.G. Bicycles29.E. Eat the Chip30.G. Lights31.D. Array Repetition32.D. Berserk Monsters33.E. Increasing Subsequences34.D. Very Different Array
35.G. Mischievous Shooter
36.B. Plus-Minus Split37.B. A Balanced Problemset38.C. Did We Get Everything Covered39.D. Find the Different Ones!40.C. Grouping Increases41.D. Good Trip42.C. Physical Education Lesson43.E. Final Countdown44.D. Divisible Pairs45.G. Vlad and Trouble at MIT46.A. Brick Wall47.B. Minimize Inversions48.C. XOR-distance49.A. Moving Chips50.B. Monsters Attack!51.C. Find B52.D. Slimes53.C. Turtle Fingers: Count the Values of k54.D. Turtle Tenacity: Continual Mods55.D. Vlad and Division56.C. LR-remainders57.D. Lonely Mountain Dungeons思路简述
二维差分+矩阵旋转
思路详述
1.二维差分,对于每一个标签而言,有对一维的影响和二维的传递之分
2.为什么要差分?对于每一个目标而言,它对以其为左上角顶点,k为边长的三角形内的点都有一个贡献,这种范围内的累加就考虑用前缀和(这里是二维差分)
3.为什么要矩阵旋转?由于在某个点喷的方向不同,得到的值也不同。所以每个目标的贡献只能对一个方向
4.好烦啊,怎么用文字表述呢
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
string s[100005];
int ss1()
{
vector<vector<int> > a(n+5,vector<int> (m+5));//二维数组n*m
vector<vector<int> > b(n+5,vector<int> (m+5));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='#')
{
a[i][j]++;
if(i+k<n)
{
a[i+k+1][j]--;//传递截至点
b[i+k+1][j]++;
}
if(j+k<m) b[i][j+k+1]--;//b代表斜线传递
else if(i+j+k-m+1<=n) b[i+j+k-m+1][m]--;//三角形的范围可能超过了矩阵范围
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=1;j<=m;j++)
{
sum+=a[i][j]+b[i][j];//赋能
ans=max(ans,sum);
a[i+1][j]+=a[i][j];//传递
b[i+1][j-1]+=b[i][j];
}
}
return ans;
}
void rotate90Degrees()
{
vector<string> temp(m+1);//二维字符串,string是一维,vector是一维,m+1代表vector的大小,即含有几个string
for (int j = 1; j <= m; ++j) temp[j].resize(n+1, ' ');//把temp中的每一个元素(string)变成长度为n+1的空格
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
temp[j][n-i+1] = s[i][j];//旋转,注意这里不能temp[i][j]=s[j][n-i+1],因为s会越界
for (int i = 1; i <= m; i++) s[i] = temp[i];//字符串的复制可以直接等于
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]=" "+s[i];//使下标从1开始
}
int ans=0;
for(int i=1;i<=4;i++)
{
ans=max(ans,ss1());
rotate90Degrees();
swap(n,m);//旋转后的矩阵nm发生变换
}
cout<<ans<<endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~