L :WeChat Walk
生活随笔
收集整理的這篇文章主要介紹了
L :WeChat Walk
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
詳見代碼
#include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<map> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; const int N=2e5+10;int h[N],e[N<<1],ne[N<<1],idx=0; void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;return ;} int n,m,q; int cham[N],bs[N],big[N],in[N],id[N],ans[N]; vector<int>c[N];//存附近的大點 ; vector<int>B[550][11000];//存大點附近的小點; int main() {memset(h,-1,sizeof h);scanf("%d%d%d",&n,&m,&q);int siz=sqrt(n)+1;while(m--){int a,b;scanf("%d%d",&a,&b); add(a,b),add(b,a);in[a]++,in[b]++;}idx=1;for(int i=1;i<=n;i++)if(in[i]>siz)id[i]=idx++;//給大點編號1-idx-1; for(int i=1;i<=n;i++)if(id[i])//大點 for(int u=h[i];~u;u=ne[u])if(id[e[u]])//附近的大點 c[i].push_back(e[u]);for(int t=1;t<=q;t++) //大點-大點 更新大點的時候對大點無影響 { //大點-小點 更新大點的時候遍歷小點int a,b; //小點-大點 更新小點的時候要把他加到對應大點的步數中因為大點對應小點的步數要枚舉; scanf("%d%d",&a,&b);//小點-小點 更新小點的時候對小點沒影響 bs[a]+=b; //步數加 if(id[a]&&!cham[a]) //所以如果是冠軍并且是大點的話就不用了; {int ma=0; for(int i=0;i<c[a].size();i++)//大點附近的大點; {int j=c[a][i];ma=max(ma,bs[j]);if(cham[j]&&bs[a]>=bs[j])ans[j]+=t-cham[j],cham[j]=0;}for(int i=bs[a]-b+1;i<=bs[a];i++)for(auto u:B[id[a]][i])if(cham[u]&&bs[u]<=bs[a])ans[u]+=t-cham[u],cham[u]=0;//更新; // int i=10000; //這步感覺可以存個big數組,。。。。 //不存的話就卡時間了; // while(!B[id[a]][i].size())i--;ma=max(ma,big[a]); if(!cham[a]&&ma<bs[a])cham[a]=t;}else if(!id[a]){//小點 遍歷 int ma=0;for(int i=h[a];~i;i=ne[i]){int j=e[i];ma=max(ma,bs[j]);if(id[e[i]])B[id[e[i]]][bs[a]].push_back(a),big[j]=max(big[j],bs[a]);if(cham[j]&&bs[a]>=bs[j])ans[j]+=t-cham[j],cham[j]=0;}if(bs[a]>ma&&!cham[a])cham[a]=t;}}for(int i=1;i<=n;i++){if(cham[i])ans[i]+=q-cham[i];printf(i==n?"%d":"%d\n",ans[i]);}return 0; }總結
以上是生活随笔為你收集整理的L :WeChat Walk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HEVC编码结构简要总结
- 下一篇: Building Fire Statio