[BZOJ4419][SHOI2013]发微博

BZOJ4419题解:微博好友互动算法
本文提供了一种解决BZOJ4419问题的有效算法,通过逆序处理操作并利用差分思想,有效地计算了每个用户在微博平台上与好友互动的总次数。该算法避免了使用set数据结构,降低了时间复杂度。

考虑要让复杂度和操作数同阶,每次删除时统计下与对方成为好友的时刻到现在对方一共发了多少条微博即可,set维护,最后将所有仍为好友的全部处理掉。

考虑不用set,操作倒序即可,类似差分思想。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 6 typedef long long ll;
 7 using namespace std;
 8 
 9 const int N=500010;
10 char ch;
11 int n,m,ans[N],num[N];
12 struct P{ int op,x,y; }a[N];
13 
14 int main(){
15     freopen("bzoj4419.in","r",stdin);
16     freopen("bzoj4419.out","w",stdout);
17     scanf("%d%d",&n,&m);
18     rep(i,1,m){
19         scanf(" %c",&ch); scanf("%d",&a[i].x);
20         if (ch=='!') a[i].op=1;
21         else{
22             if (ch=='+') a[i].op=2; else a[i].op=3;
23             scanf("%d",&a[i].y);
24         }
25     }
26     for (int i=m; i; i--){
27         if (a[i].op==1) num[a[i].x]++;
28         if (a[i].op==2) ans[a[i].x]+=num[a[i].y],ans[a[i].y]+=num[a[i].x];
29         if (a[i].op==3) ans[a[i].x]-=num[a[i].y],ans[a[i].y]-=num[a[i].x];
30     }
31     rep(i,1,n) printf("%d ",ans[i]);
32     return 0;
33 }

 

转载于:https://www.cnblogs.com/HocRiser/p/9940698.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值