找规律

貌似跟官方题解有点出入,不过好像本质是一样的。

看到 “hacks are disabled” 回忆起这应该是个诈骗啥的。

看操作,先看非特殊行,一个数 $+1$,相邻数 $-1$,并且一次有两个这样的东西。

这个东西是不是很像差分后搞区间长度为 $1$ 区间加的操作。

所以做一下前缀和再看看,发现一次操作就是前缀和数组一对 $+1,-1$。前缀和的和不改变。

再看看特殊行,它做完前缀和的操作是 $+1,-1,-1$,减多了一次,前缀和的和改变了。

又因为至少做一次,所以特殊行的前缀和的和肯定改变了。

然后还可以发现,每操作一次特殊行的前缀和的和 $-1$。

所以直接找完,然后普通行的前缀和的和减去特殊行前缀和的和就能得出第二问的答案了。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define rep(a,b,c) for(int c(a);c<=(b);++c)
#define drep(a,b,c) for(int c(a);c>=(b);--c)
#define grep(b,c) for(int c(head[b]);c;c=nxt[c])
#define Clear(a,n) memset(a,0,((n)+3)*sizeof(a[0]))
typedef long long LL;
typedef std::pair<int,int> pii;
#define int LL
inline int read()
{
int res=0;char ch=getchar();bool flag=0;while(ch<'0'||ch>'9')flag^=(ch=='-'),ch=getchar();
while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();return flag ? -res : res ;
}
inline void rd(bool &x){char c;do c=getchar();while(c!='0'&&c!='1');x=c=='1';}
inline void print(LL x){if(x>9)print(x/10);putchar(x%10+'0');}
template<typename T> inline T min(const T&x,const T&y){return x<y?x:y;}
template<typename T> inline T max(const T&x,const T&y){return x<y?y:x;}
template<typename T> inline T Swap(T&x,T&y){T tmp=x;x=y;y=tmp;}
template<typename T> inline T Abs(T&x){return x<0?-x:x;}
const int N=3e5+10,INF=0x3f3f3f3f;int n,m,sum[N];
inline void Solve()
{
n=read();m=read();rep(1,n,i)
{
// int ss=0;d
int ss=0;sum[i]=0;rep(1,m,j)sum[i]+=(ss+=read());
// ClearV(a[i]);ClearV(s[i]);a[i].resize(m+1);s[i].resize(m+1);
// sum[i]=0;rep(1,m,j)sum[i]+=s[i][j]=s[i][j-1]+(a[i][j]=read());
}
int cnt=0,idx=0;rep(2,n,i)if(sum[i]!=sum[1])++cnt,idx=i;
int qwq=cnt==n-1?1:idx,qaq=(qwq==1?sum[2]:sum[1]);
printf("%lld %lld\n",qwq,qaq-sum[qwq]);
}

signed main()
{
int T=read();
while(T--)Solve();
return 0;
}