L-WeChat Walk

每个大点记录一下邻接点的最大步数

每次修改的时候,枚举修改点的邻接的大点来更新

修改大点的时候直接判是不是比邻接点都大


代码抄的std好不容易才看懂~

Code1

#include<bits/stdc++.h>
using namespace std;
template <class T=int> T rd()
{T res=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;
}
const int N=200010;
vector<int> d[N],g[N]; // d原图 g大点
int n,m,q,Bs;
int id[N],cnt;
int a[N];
int chmp[N],mx[N];
int h[550][20010];
int ne[N<<4],e[N<<4],idx;
int ans[N];
void add(int u)
{for(int v:g[u]){int s=id[v];e[idx]=u,ne[idx]=h[s][a[u]],h[s][a[u]]=idx++;;}
}
int main()
{n=rd(),m=rd(),q=rd();Bs=2*sqrt(m)+1;memset(h,-1,sizeof h);for(int i=1;i<=m;i++){int u=rd(),v=rd();d[u].push_back(v);d[v].push_back(u);}// 一个点周围的大点for(int i=1;i<=n;i++) for(int v:d[i]) if(d[v].size()>=Bs) g[i].push_back(v);for(int i=1;i<=n;i++) if(d[i].size()>=Bs) id[i]=++cnt;// 大点编号for(int i=1;i<=q;i++){int u=rd(),w=rd(); a[u]+=w;if(chmp[u]) {add(u);for(int v:g[u]) mx[v]=max(mx[v],a[u]);continue;}if(!id[u])// 由于a的增加使得周围某些点冠军状态被破坏 {while(1){int k=0,num=0;for(int v:d[u]){num=max(num,a[v]);if(chmp[v]&&(k==0||a[v]<a[k])) k=v;// 找到步数最小的冠军}if(!k)// 周围已经没有冠军 {if(num<a[u]) chmp[u]=i,add(u); // 看看自己是不是冠军break;}if(a[k]>a[u]) break;// 如果步数最小的冠军大于a[u]那么已经不会打破周围点的冠军状态ans[k]+=i-chmp[k];chmp[k]=0;// 更新周围点的冠军状态 累计答案}}else{int s=id[u];for(int t=a[u]-w+1;t<=a[u];t++) // a[u]+1~a[u]+w{for(int j=h[s][t];j!=-1;j=ne[j]){int v=e[j];if(a[v]==t&&chmp[v]) ans[v]+=i-chmp[v],chmp[v]=0;}}if(mx[u]<a[u]) chmp[u]=i,add(u);}for(int v:g[u]) mx[v]=max(mx[v],a[u]);}for(int i=1;i<=n;i++) if(chmp[i]) ans[i]+=q-chmp[i];for(int i=1;i<=n;i++) printf("%d\n",ans[i]);return 0;
}

Code2

KeHe大佬题解配合jiangly giegie的代码
考虑按步数 www 从大到小枚举

设 fuf_ufu​表示 uuu 最近一次更新步数的时刻, lastu\text{last}_ulastu​表示 uuu 上一次更新步数的时刻,初值均为最终时刻qqq

若 uuu 为小点直接暴力算周围的点。

若 uuu 为大点,考虑直接维护这个结果(记为 mnv\text{mn}_vmnv​)即每个点步数更新时,枚举其周围所有大点 vvv 来更新 mnv\text{mn}_vmnv​,由于每个点周围的大点的个数不超过mBs\frac{m}{\text{Bs}}Bsm​,复杂度可行

#include<bits/stdc++.h>
using namespace std;
template <class T=int> T rd()
{T res=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;
}
const int N=200010;
int n,m,q,Bs;
vector<int> e[N],big[N];
int walk[N],mx[N];
int ans[N];
vector<pair<int,int>> event[10005];
int main()
{n=rd(),m=rd(),q=rd();Bs=2*sqrt(m)+1;for(int i=1;i<=m;i++){int u=rd(),v=rd();e[u].push_back(v);e[v].push_back(u);}for(int i=1;i<=n;i++) for(int v:e[i]) if(e[v].size()>=Bs) big[i].push_back(v);for(int i=1;i<=q;i++){int u=rd(),w=rd();walk[u]+=w;event[walk[u]].push_back({u,i});}vector<int> f(n+1,q),last(n+1,q),mn(n,q);for(int w=10000;w>=1;w--){for(auto [u,t]:event[w]) {for(auto v:big[u])mn[v]=min(mn[v],t);last[u]=f[u],f[u]=t;}for(auto [u,t]:event[w]){if(e[u].size()<Bs){int r=last[u];for(auto v:e[u]) r=min(r,f[v]);ans[u]+=max(0,r-t);}else{ans[u]+=max(0,min(last[u],mn[u])-t);}}}for(int i=1;i<=n;i++) printf("%d\n",ans[i]);return 0;
}

2021牛客暑期多校训练营2 L-WeChat Walk(分块)相关推荐

  1. 2021牛客暑期多校训练营9

    2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...

  2. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

  3. 2021牛客暑期多校训练营4

    2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...

  4. 2021牛客暑期多校训练营3

    2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...

  5. 2021牛客暑期多校训练营2

    2021牛客暑期多校训练营2 题号 题目 知识点 A Arithmetic Progression B Cannon C Draw Grids D Er Ba Game E Gas Station F ...

  6. 2021牛客暑期多校训练营1

    2021牛客暑期多校训练营1 题号 题目 知识点 难度 A Alice and Bob 博弈论 B Ball Dropping 计算几何 签到 C Cut the Tree D Determine t ...

  7. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

  8. 2021牛客暑期多校训练营1, 签到题DFBG

    2021牛客暑期多校训练营1 题号 标题 已通过代码 通过率 团队的状态 A Alice and Bob 点击查看 1365/5586 通过(博弈论-打表) B Ball Dropping 点击查看 ...

  9. 【训练题66:状压暴力 | 子集dp】Greater Integer, Better LCM | 2021牛客暑期多校训练营5

    题意 Greater Integer, Better LCM | 2021牛客暑期多校训练营5 给你 a,b,ca,b,ca,b,c ,你需要找到一对 x,yx,yx,y ,满足: lcm(a+x,b ...

  10. 2021牛客暑期多校训练营7

    2021牛客暑期多校训练营7 文章目录 2021牛客暑期多校训练营7 F:xay_loves_trees 解释 代码 H:xay_loves_count 解释 代码 I:xay_loves_or 解释 ...

最新文章

  1. twitter bbs
  2. C#构造函数、私有构造函数、静态构造函数与构造函数执行顺序
  3. SSM之一(使用idea创建一个Spring+SpringMVC的项目)
  4. MYSQL 去除重复 记录
  5. 解决 kindle 书籍字体颜色偏淡问题的方法
  6. Linux ftp传送问题 WARNING! 258831 bare linefeeds received in ASCII mode
  7. java用mysql存储图片_Java存储图片到Mysql
  8. [svc]容器网络学习索引及网络监控
  9. activiti Stream之list转map及问题解决
  10. Java数据类型分类 1
  11. MAC 迅雷最新版无限重启BUG的解决方法
  12. 我的数学建模之路:从国赛二等到美赛M奖!
  13. 网吧服务器系统如何配置,网吧服务器系统配置
  14. Excel多行转置为一列
  15. Unity自动设置keystore密匙库的信息
  16. android 自定义indicator,Android自定义Indicator
  17. java搭建直播平台
  18. 没学历没经验没外语没技能,啥都没有靠啥找工作?
  19. kettle在linux下启动报错libwebkitgtk-1.0-0
  20. 新版股票api接口大全

热门文章

  1. 数字转字符函数_Excel之文本函数CONCATENATE/TEXT/LEFT/MID/RIGHT/FIND/LEN
  2. 有必要服务器虚拟化吗,服务器虚拟化有必要吗
  3. mysql group where_[MySQL] 测试where group by order by的索引问题
  4. 算法设计与分析——动态规划——矩阵连乘问题
  5. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...
  6. 每天一小时python官方文档学习(三)————函数
  7. [PAT乙级]1021 个位数统计
  8. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...
  9. java(i++和++i的理解)
  10. Java ArrayList、LinkedList和Vector的使用及性能分析