ABC-269解题报告
D. Do use hexagon grid
E. Last Rook
由于不需要考虑斜向的冲突,所以考虑行和列分开二分。以行为例:
如果有若干连续行的棋子数量小于行数,则答案一定在这些行中,以此作为二分的 check。
F. Numbered Checker
显然每一行剩下的数都是一个等差数列。
考虑奇偶行分开计算:对于奇数行,只有奇数列能产生贡献;对于偶数行,只有偶数列能产生贡献。以奇数行为例:
具体地,若输入的四界分别为
显然贡献的左上角的值为
第二个产生贡献的行(即
偶数行偶数列的情况同理,由于操作完全相同,可以封装成函数调用两遍。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int add(int a,int b) {return (a+b)%mod;}
int mul(int a,int b) {return a*b%mod;}
signed main() {
int inv2=(mod+1)/2;
int n,m,q;
cin>>n>>m>>q;
while(q--) {
int l,r,u,d,ans=0;
cin>>u>>d>>l>>r;
auto solve=[&](bool flag) {
int u1=u,d1=d,l1=l,r1=r;
if(u1%2==flag) u1++;
if(d1%2==flag) d1--;
if(l1%2==flag) l1++;
if(r1%2==flag) r1--;
int lenrow=(r1-l1)/2+1,lencol=(d1-u1)/2+1;
int res=mul(mul(add(add(mul(u1-1,m),l1),add(mul(u1-1,m),r1)),lenrow),inv2);
(ans+=mul(res,lencol))%=mod;
(ans+=mul(mul(mul(mul(2*(lencol-1),m),lencol),inv2),lenrow))%=mod;
};
solve(0),solve(1);
cout<<ans<<endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步