记录编号 561104 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Giving slaps(题目有误) 最终得分 100
用户昵称 GravatarSicly 是否通过 通过
代码语言 C++ 运行时间 0.254 s
提交时间 2021-06-20 16:36:44 内存使用 5.13 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <vector>
  6. #include <queue>
  7. #include <algorithm>
  8. using namespace std;
  9. int n,k,m,q;
  10. int b[10010];
  11. const int INF=1e15;
  12. typedef struct
  13. {
  14. int to;
  15. int val;
  16. }Point;
  17. vector<Point> map[100020];
  18. int dis[10020];
  19. int path[10020];
  20. int c;
  21.  
  22. /**/const int maxn=20005;
  23. const int V=10000;
  24. struct node
  25. {
  26. int l,r,sum;
  27. node()
  28. {
  29. l=r=sum=0;
  30. }
  31. }tree[maxn<<2];
  32.  
  33. void pushup(int i)
  34. {
  35. tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
  36. return;
  37. }
  38. void update(int i,int l,int r,int pos,int val)
  39. {
  40. tree[i].l=l;
  41. tree[i].r=r;
  42. if(l==r)
  43. {
  44. tree[i].sum+=val;
  45. return ;
  46. }
  47. int mid=l + r >> 1;
  48. if(pos <= mid)update(i << 1,l,mid,pos,val);
  49. else update(i << 1 | 1,mid+1,r,pos,val);
  50. pushup(i);
  51. return ;
  52. }
  53. int query(int i,int k)
  54. {
  55. if(tree[i].l==tree[i].r)return tree[i].l;
  56. int x=tree[i<<1].sum;
  57. int mid=tree[i].l+tree[i].r>>1;
  58. if(k<=x)return query(i<<1,k);
  59. else return query(i<<1|1,k-x);
  60. }
  61. void SPFA()
  62. {
  63. for(int i=2;i<=n;i++)
  64. dis[i]=INF;
  65. dis[1]=0;
  66. queue<int>q;
  67. q.push(1);
  68. while(!q.empty())
  69. {
  70. int u=q.front();
  71. q.pop();
  72. for(int i=0;i<map[u].size();i++)
  73. {
  74. Point v=map[u][i];
  75. if(dis[v.to]>dis[u]+v.val)
  76. {
  77. dis[v.to]=dis[u]+v.val;
  78. path[v.to]=u; //存每个点的前一个点
  79. q.push(v.to);
  80. }
  81. }
  82. }
  83. }
  84.  
  85. int main()
  86. {
  87. freopen("LPH_girlsonwayhome.in","r",stdin);//real one
  88. freopen("LPH_girlsonwayhome.out","w",stdout);
  89. cin>>n>>k>>m>>q>>c;
  90. for(int i=1;i<=n;i++)
  91. {
  92. cin>>b[i];
  93. }
  94. memset(path,0,sizeof(path));
  95. for(int i=0;i<=n;i++)
  96. {
  97. map[i].clear();
  98. }
  99. for(int i=1;i<=m;i++)
  100. {
  101. int u,v,e;//u到v有一条有向边,权值为e
  102. cin>>u>>v>>e;
  103. /*cout<<u<<' '<<v<<' '<<e<<endl;
  104. Sleep(1000);*/
  105. Point s;
  106. s.to=v;
  107. s.val=e;
  108. map[u].push_back(s);
  109. Point si;
  110. si.to=u;
  111. si.val=e;
  112. map[v].push_back(si);
  113. }
  114. SPFA();
  115. int num[10020];
  116. int cnt=0;
  117. //起始都是从1开始出发
  118. for(int i=c;i!=1;i=path[i])
  119. {
  120. num[cnt++]=i;
  121. /*cout<<i<<endl<<endl;
  122. Sleep(1000);*/
  123. }
  124. for(int i=cnt-1;i>=0;i--)
  125. {
  126. update(1,1,V,b[num[i]],1);
  127. //cout<<b[num[i]]<<endl;
  128. }
  129. update(1,1,V,b[1],1);
  130. /*for(int i=1;i<=n;i++)
  131. {
  132. if(tree[i].l==tree[i].r)cout<<i<<' '<<tree[i].l<<endl;
  133. Sleep(500);
  134. }*/
  135. for(int i=1;i<=q;i++)
  136. {
  137. int x;
  138. char s[10];
  139. cin>>s;
  140. if(s[0]=='C')
  141. {
  142. cin>>x;
  143. int d;
  144. cin>>d;
  145. update(1,1,V,b[x],-1);
  146. update(1,1,V,b[x]=d,1);
  147. }
  148. else
  149. {
  150. cout<<query(1,k)<<endl;
  151. }
  152. }
  153. return 0;
  154. }