2020ICPC.小米 网络选拔赛第一场 A. Intelligent Warehouse C. Smart Browser I. Walking Machine J. Matrix Subtraction

Link:
Nowcoder https://ac.nowcoder.com/acm/contest/7501


剩下的题就不补了。。



调和级数


C. Smart Browser


草草草
在线模拟草草草

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<map>
using namespace std;
#define rep(i,j,k) for (int i = j; i <= k; ++i)
string S;
int Ans=0;
int main()
{
	ios::sync_with_stdio(false);
	cin>>S;
	if(S[0]=='w')++Ans;
	for(int i=1;i<S.size();++i)
	{
		if(S[i]=='w')
		{
			++Ans;
			if(S[i-1]=='w') ++Ans;
		}
	}
	cout<<Ans;
	return 0;
}


I. Walking Machine


有手就能做
反向建图然后DFS

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
using namespace std;
#define getchar() (frS==frT&&(frT=(frS=frBB)+fread(frBB,1,1<<12,stdin),frS==frT)?EOF:*frS++)
#define ll long long
char frBB[1<<12],*frS=frBB,*frT=frBB;
inline void read(int&T)
{
    int x=0;char ch=getchar();bool w=0;
    while(!isdigit(ch))w|=(ch=='-'),ch=getchar();
    while(isdigit(ch))x=x*10+(ch-48),ch=getchar();
    T=w?-x:x;
}
inline void write(ll T)
{
	if(T<0)putchar('-'),T=-T;
	if(T>9)write(T/10);
	putchar(T%10+48);
}


#define add_edge(a,b) nxt[++tot]=head[a],head[a]=tot,to[tot]=b
int to[2000005]={},head[1000005],nxt[2000005];
int Ans=0;
//int s[1005][1005];
int n, m, tot=0, N;
string S[1010];
void dfs(int x)
{
	++Ans;
	for(int i=head[x];i;i=nxt[i])
	{
		dfs(to[i]);
	}
}
int main()
{
	cin>>n>>m; N=0;
	for(int i=1;i<=n;++i)cin>>S[i];
	char sasa;
	for(int pret, i=1;i<=n;++i)
	{
		for(int j=0;j<m;++j)
		{
			++N;
			sasa = S[i][j];
			if(sasa=='D')pret=N+1;
			if(sasa=='W')pret=N-m;
			if(sasa=='S')pret=N+m;
			if(sasa=='A')pret=N-1;
			if(sasa=='D'&&j==m-1)pret=1000001;
			if(sasa=='W'&&i==1)pret=1000001;
			if(sasa=='A'&&j==0)pret=1000001;
			if(sasa=='S'&&i==n)pret=1000001;
			add_edge(pret,N);
		}
	}
	dfs(1000001);
	cout<<Ans-1;
    return 0;
}


J. Matrix Subtraction


二维差分模板题。
想不出来也可以直接上二维线段树/树状数组??可能要神力卡常

只不过用二维差分细节比较多,比较坑。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
using namespace std;
#define rep(ii,jj,kk) for(int ii=jj;ii<=kk;++ii)
const int MAXN = 1551;
int n, m, a, b;
int t;
long long M[MAXN][MAXN];
long long P[MAXN][MAXN];
bool Imp;
int main()
{
	scanf("%d",&t);
	int i2, j2, c;
	while(t--)
	{
		Imp = false;
		
		scanf("%d%d%d%d", &n ,&m, &a, &b);
		rep(i,0,n+2)rep(j,0,m+2)M[i][j]=P[i][j]=0;
		rep(i,1,n)rep(j,1,m)scanf("%lld", &M[i][j]);
		
		rep(i,1,n+1)
		{
			rep(j,1,m+1)
			{
				P[i][j]=M[i][j]-M[i-1][j]-M[i][j-1]+M[i-1][j-1];
			}
		}
		
		rep(i,1,n-a+1)
		{
			rep(j,1,m-b+1)
			{
				if(!P[i][j]) continue;
				if(P[i][j]<0) //*****!!!!!!*!*!**!*!*!*!
				{
					Imp = true;break;
				}
				i2 = i+a, j2 = j+b;
				c=P[i][j];
				P[i][j]-=c;
				P[i][j2]+=c;
				P[i2][j]+=c;
				P[i2][j2]-=c;
			}if(Imp)break;
		}
		if(Imp)
		{
			puts("QAQ");
			continue;
		}
		rep(i,1,n+1)
		{
			rep(j,1,m+1)
			{
				P[i][j]+=P[i-1][j]+P[i][j-1]-P[i-1][j-1];
				if(P[i][j])
				{
					Imp = true;
					break;
				}
			}
			if(Imp)break;
		}
		puts(Imp?"QAQ":"^_^");
	}
    return 0;
}