46届icpc上海站热身赛George’s Grass

发布于 2021-11-27  882 次阅读


题目链接:https://ac.nowcoder.com/acm/contest/24871/B

当时现场想了半天怎么做,一直在想着这个东西套一个什么数据结构上去,绞尽脑汁也没想出来。后来是结束之后逛submission看到了一种做法。我直呼牛逼

大致是按照时间倒序,然后对于某一行或者某一列被除掉了,那么就删除掉这一行/列,因为这是最后一次对这一行/列进行的操作相当于这一行/列,在t之前的所有杂草全被清掉了,那么这一行也就没有必要再存在了

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MOD=1e9+7;
int opt[100005],x[100005],t[100005],a[100005],b[100005];
int main(){
	int	n,m;
	ll suma=0,sumb=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]%=MOD;
		suma+=a[i];
		suma%=MOD;
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
		b[i]%=MOD;
		sumb+=b[i];
		sumb%=MOD;
	}
	int q;
	ll ans=0;
	cin>>q;
	map<int,bool>k[5];
	for(int i=1;i<=q;i++) cin>>opt[i]>>x[i]>>t[i];
	while(q){
		if(k[opt[q]][x[q]]) {
			q--;
			continue;
		}
		k[opt[q]][x[q]]=1;
		if(opt[q]==1){
			ans=(ans+sumb*a[x[q]]%MOD*t[q]%MOD)%MOD;
			suma=(suma-a[x[q]]+MOD)%MOD;
		}
		else{
			ans=(ans+suma*b[x[q]]%MOD*t[q])%MOD;
			sumb=(sumb-b[x[q]]+MOD)%MOD;
		}
		q--;
	}
	cout<<ans;
	return 0;
}

回忆这理想不够理想,沿途逛世间一趟只有向上