记录编号 561104 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Giving slaps(题目有误) 最终得分 100
用户昵称 GravatarSicly 是否通过 通过
代码语言 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;
 }