题意:
有n个组,m个人,s条描述语句,问在这m条描述语句之后每个人各收到了多少条信息
每一条语句是如下描述的其中一个:
t x y
t == 1:表示x加入y
t == 2:表示x从y出来
t == 3:表示x在y组发送了一条信息
思路:
就是直接模拟,无奈我代码能力太差,没写出来
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
const int S = 20;
map<ll,ll>mp[maxn];
vector<ll>G[maxn];
ll ans[maxn];
int main(){
ll n,m,s;
scanf("%lld%lld%lld",&n,&m,&s);
ll t,x,y;
for(ll i = 1;i <= s;i++){
scanf("%lld%lld%lld",&t,&x,&y);
if(t == 1){
mp[x][y] = i;//x在i时刻加入了y
}
else if(t == 2){
ll tmp = G[y].end()-lower_bound(G[y].begin(),G[y].end(),mp[x][y]);//接收到的信息数
ans[x] += tmp;
mp[x].erase(y);//x从y组出来,和mp[x][y] = 0;这条语句好像不太一样
}
else if(t == 3){
G[y].push_back(i);//i时刻在y组发送信息
ans[x]--;//x是发送者,不接收
}
}
for(ll i = 1;i <= m;i++){//s条语句完成之后全部都要出来
map<ll,ll>::iterator it;
for(it = mp[i].begin();it != mp[i].end();it++){
ll pre = it -> first;
ll last = it -> second;
ll tmp = G[pre].end() - lower_bound(G[pre].begin(),G[pre].end(),last);
ans[i] += tmp;
}
}
for(int i = 1;i <= m;i++){
printf("%lld\n",ans[i]);
}
return 0;
}