20200926T1T3代码

T1

#include <cstdio>
#include <cstring>
#include <algorithm>
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;

int read()
{
	int a = 0,x = 1;
	char ch = getchar();
	while(ch > '9' || ch < '0') {
		if(ch == '-') x = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		a = a*10 + ch-'0';
		ch = getchar();
	}
	return a*x;
}	
const int N=1e7+7;
int n;
char s[N];

int head[30],go[N],nxt[N],cnt;
void add(int u,int v)
{
	go[++cnt] = v;
	nxt[cnt] = head[u];
	head[u] = cnt;
}

int main()
{
	File("a");
	n = read();
	scanf("%s",s+1);
	for(int i = n;i >= 1;i --) {
		add(s[i]-'a'+1,i);
	}
	int t = 0;
	for(int i = 26;i >= 1;i --) {
		for(int e = head[i];e;e = nxt[e]) {
			int v = go[e];
			if(v <= t) continue;
			putchar('a'+i-1);
			t = v;
		}
	}
	return 0;
}

T3

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define int long long
using namespace std;

int read()
{
	int a = 0,x = 1;
	char ch = getchar();
	while(ch > '9' || ch < '0') {
		if(ch == '-') x = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		a = a*10 + ch-'0';
		ch = getchar();
	}
	return a*x;
}
const int N=1e6+7,inf = 1e18+7;
int n,m,s,t,x,y;

int head[N],go[N],nxt[N],cnt,val[N];
void add(int u,int v,int w)
{
	go[++cnt] = v;
	nxt[cnt] = head[u];
	head[u] = cnt;
	val[cnt] = w;
}

int dis1[N],dis2[N],dis3[N];
int vis[N];

struct node{
	int u,dis;
	friend bool operator < (node a,node b) {return a.dis>b.dis;}
};

void dij(int a,int* dis)
{
	for(int i = 1;i <= n;i ++) vis[i] = 0;
	priority_queue<node>q;
	q.push((node){a,0});
	while(!q.empty()) {
		int u = q.top().u;
		if(vis[u]) {q.pop();continue;}
		dis[u] = q.top().dis;
		q.pop();
		vis[u] = 1;
		for(int e = head[u];e;e = nxt[e]) {
			int v = go[e];
			if(vis[v]) continue;
			q.push((node){v,dis[u]+val[e]});
		}
	}
}

int dp1[N],dp2[N],ans;
void dfs(int u,int fa,int mini1,int mini2)
{
	if(vis[u]) return;
	vis[u] = 1;
	mini1 = min(dis2[u],mini1),mini2 = min(dis3[u],mini2);
	for(int e = head[u];e;e = nxt[e]) {
		int v = go[e];
		if(dis1[v] != dis1[u]-val[e]) continue;
		dfs(v,u,mini1,mini2);
	//	ans = min(ans,min(mini1+dp2[v],mini2+dp1[v]));
		dp1[u] = min(dp1[u],dp1[v]);dp2[u] = min(dp2[u],dp2[v]);
	}
	dp1[u] = min(dp1[u],dis2[u]);dp2[u] = min(dp2[u],dis3[u]);
	ans = min(ans,min(dp1[u]+mini2,dp2[u]+mini1));
}	

signed main()
{
	File("c");
	n = read(),m = read(),s = read(),t = read(),x = read(),y = read();
	for(int i = 1;i <= m;i ++) {
		int u = read(),v = read(),w = read();
		add(u,v,w);add(v,u,w);
	}
	dij(s,dis1);dij(x,dis2);dij(y,dis3);
	ans = dis2[y];
//	printf("!!!");
	for(int i = 1;i <= n;i ++) vis[i] = 0,dp1[i] = dp2[i] = inf;
	dfs(t,0,inf,inf);
	printf("%lld",ans);
	return 0;
}
posted @ 2020-09-26 16:15  nao-nao  阅读(93)  评论(0)    收藏  举报