记录编号 |
561104 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
Giving slaps(题目有误) |
最终得分 |
100 |
用户昵称 |
Sicly |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.254 s |
提交时间 |
2021-06-20 16:36:44 |
内存使用 |
5.13 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n,k,m,q;
int b[10010];
const int INF=1e15;
typedef struct
{
int to;
int val;
}Point;
vector<Point> map[100020];
int dis[10020];
int path[10020];
int c;
/**/const int maxn=20005;
const int V=10000;
struct node
{
int l,r,sum;
node()
{
l=r=sum=0;
}
}tree[maxn<<2];
void pushup(int i)
{
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
return;
}
void update(int i,int l,int r,int pos,int val)
{
tree[i].l=l;
tree[i].r=r;
if(l==r)
{
tree[i].sum+=val;
return ;
}
int mid=l + r >> 1;
if(pos <= mid)update(i << 1,l,mid,pos,val);
else update(i << 1 | 1,mid+1,r,pos,val);
pushup(i);
return ;
}
int query(int i,int k)
{
if(tree[i].l==tree[i].r)return tree[i].l;
int x=tree[i<<1].sum;
int mid=tree[i].l+tree[i].r>>1;
if(k<=x)return query(i<<1,k);
else return query(i<<1|1,k-x);
}
void SPFA()
{
for(int i=2;i<=n;i++)
dis[i]=INF;
dis[1]=0;
queue<int>q;
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<map[u].size();i++)
{
Point v=map[u][i];
if(dis[v.to]>dis[u]+v.val)
{
dis[v.to]=dis[u]+v.val;
path[v.to]=u; //存每个点的前一个点
q.push(v.to);
}
}
}
}
int main()
{
freopen("LPH_girlsonwayhome.in","r",stdin);//real one
freopen("LPH_girlsonwayhome.out","w",stdout);
cin>>n>>k>>m>>q>>c;
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
memset(path,0,sizeof(path));
for(int i=0;i<=n;i++)
{
map[i].clear();
}
for(int i=1;i<=m;i++)
{
int u,v,e;//u到v有一条有向边,权值为e
cin>>u>>v>>e;
/*cout<<u<<' '<<v<<' '<<e<<endl;
Sleep(1000);*/
Point s;
s.to=v;
s.val=e;
map[u].push_back(s);
Point si;
si.to=u;
si.val=e;
map[v].push_back(si);
}
SPFA();
int num[10020];
int cnt=0;
//起始都是从1开始出发
for(int i=c;i!=1;i=path[i])
{
num[cnt++]=i;
/*cout<<i<<endl<<endl;
Sleep(1000);*/
}
for(int i=cnt-1;i>=0;i--)
{
update(1,1,V,b[num[i]],1);
//cout<<b[num[i]]<<endl;
}
update(1,1,V,b[1],1);
/*for(int i=1;i<=n;i++)
{
if(tree[i].l==tree[i].r)cout<<i<<' '<<tree[i].l<<endl;
Sleep(500);
}*/
for(int i=1;i<=q;i++)
{
int x;
char s[10];
cin>>s;
if(s[0]=='C')
{
cin>>x;
int d;
cin>>d;
update(1,1,V,b[x],-1);
update(1,1,V,b[x]=d,1);
}
else
{
cout<<query(1,k)<<endl;
}
}
return 0;
}