답안 #243912

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
243912 2020-07-02T07:10:33 Z arnold518 Wild Boar (JOI18_wild_boar) C++14
12 / 100
813 ms 1014564 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 4000;
const int MAXL = 1e5;
const ll INF = 1e18;

struct Edge
{
	int u, v, w, p;
};

int N, M, T, L;
vector<Edge> adj[MAXN+10], radj[MAXN+10];
Edge E[MAXN+10];
ll dist[MAXN+10][MAXN+10];
int A[MAXN+10];

struct Queue
{
	int v; ll w;
	bool operator < (const Queue &p) const { return w>p.w; }
};

struct Node
{
	int l, r; ll w;
	Node() : l(0), r(0), w(INF) {}
	Node(int l, int r, ll w) : l(l), r(r), w(w) {}
	bool operator < (const Node &p) const { return w<p.w; }
};

Node dist2[MAXN+10][MAXN+10][4];
Node tree[MAXN*4+10][4];

void add(int node)
{
	int i, j, k;
	for(i=0; i<4; i++) tree[node][i]=Node();

	vector<Node> V;
	for(i=0; i<4; i++) for(j=0; j<4; j++) if(tree[node*2][i].r!=tree[node*2+1][j].l) V.push_back({tree[node*2][i].l, tree[node*2+1][j].r, tree[node*2][i].w+tree[node*2+1][j].w});

	for(i=0; i<V.size(); i++) tree[node][0]=min(tree[node][0], V[i]);
	for(i=0; i<V.size(); i++) if(V[i].l!=tree[node][0].l && V[i].r!=tree[node][0].r) tree[node][1]=min(tree[node][1], V[i]);
	for(i=0; i<V.size(); i++) if(V[i].l!=tree[node][0].l && V[i].r!=tree[node][1].r) tree[node][2]=min(tree[node][2], V[i]);
	for(i=0; i<V.size(); i++) if(V[i].l!=tree[node][1].l && V[i].r!=tree[node][0].r) tree[node][3]=min(tree[node][3], V[i]);
}

void init(int node, int tl, int tr)
{
	if(tl==tr)
	{
		int i, j;
		for(i=0; i<4; i++) tree[node][i]=dist2[A[tl]][A[tl+1]][i];
		return;
	}
	int mid=tl+tr>>1;
	init(node*2, tl, mid);
	init(node*2+1, mid+1, tr);
	add(node);
}

void update(int node, int tl, int tr, int p)
{
	if(tr<p-1 || p<tl) return;
	if(tl==tr)
	{
		int i, j;
		for(i=0; i<4; i++) tree[node][i]=dist2[A[tl]][A[tl+1]][i];
		return;
	}
	int mid=tl+tr>>1;
	update(node*2, tl, mid, p);
	update(node*2+1, mid+1, tr, p);
	add(node);
}

int main()
{
	int i, j, k;
	scanf("%d%d%d%d", &N, &M, &T, &L);
	for(i=1; i<=M; i++)
	{
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		adj[u].push_back({u, v, w, i*2-1}); radj[v].push_back({u, v, w, i*2-1});
		adj[v].push_back({v, u, w, i*2}); radj[u].push_back({v, u, w, i*2});
		E[i*2-1]={u, v, w, i*2-1};
		E[i*2]={v, u, w, i*2};
	}
	for(i=1; i<=N; i++) sort(adj[i].begin(), adj[i].end(), [&](const Edge &p, const Edge &q) { return p.v<q.v; });

	for(i=1; i<=2*M; i++)
	{
		for(j=1; j<=2*M; j++) dist[i][j]=INF;

		priority_queue<Queue> PQ;
		PQ.push({i, E[i].w});
		while(!PQ.empty())
		{
			Queue now=PQ.top(); PQ.pop();
			if(dist[i][now.v]<=now.w) continue;
			dist[i][now.v]=now.w;
			for(auto nxt : adj[E[now.v].v]) if(nxt.v!=E[now.v].u) PQ.push({nxt.p, now.w+nxt.w});
		}
	}

	for(i=1; i<=N; i++)
	{
		for(j=1; j<=N; j++)
		{
			vector<Node> V;
			for(k=0; k<4; k++) dist2[i][j][k]=Node();
			for(auto it : adj[i]) for(auto jt : radj[j]) V.push_back(Node(it.v, jt.u, dist[it.p][jt.p]));

			for(k=0; k<V.size(); k++) dist2[i][j][0]=min(dist2[i][j][0], V[k]);
			for(k=0; k<V.size(); k++) if(V[k].l!=dist2[i][j][0].l && V[k].r!=dist2[i][j][0].r) dist2[i][j][1]=min(dist2[i][j][1], V[k]);
			for(k=0; k<V.size(); k++) if(V[k].l!=dist2[i][j][0].l && V[k].r!=dist2[i][j][1].r) dist2[i][j][2]=min(dist2[i][j][2], V[k]);
			for(k=0; k<V.size(); k++) if(V[k].l!=dist2[i][j][1].l && V[k].r!=dist2[i][j][0].r) dist2[i][j][3]=min(dist2[i][j][3], V[k]);
		}
	}

	//for(i=1; i<=2*M; i++) { for(j=1; j<=2*M; j++) printf("%lld ", dist[i][j]); printf("\n"); }

	//for(i=1; i<=N; i++) { for(j=1; j<=N; j++) { for(k=0; k<4; k++) printf("%lld ", dist2[i][j][k].w); printf(" / "); } printf("\n"); }

	for(i=1; i<=L; i++) scanf("%d", &A[i]);
	init(1, 1, L-1);

	while(T--)
	{
		int p, q;
		scanf("%d%d", &p, &q); A[p]=q;
		update(1, 1, L-1, p);
		if(tree[1][0].w==INF) printf("-1\n");
		else printf("%lld\n", tree[1][0].w);
	}
}

Compilation message

wild_boar.cpp: In function 'void add(int)':
wild_boar.cpp:48:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0; i<V.size(); i++) tree[node][0]=min(tree[node][0], V[i]);
           ~^~~~~~~~~
wild_boar.cpp:49:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0; i<V.size(); i++) if(V[i].l!=tree[node][0].l && V[i].r!=tree[node][0].r) tree[node][1]=min(tree[node][1], V[i]);
           ~^~~~~~~~~
wild_boar.cpp:50:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0; i<V.size(); i++) if(V[i].l!=tree[node][0].l && V[i].r!=tree[node][1].r) tree[node][2]=min(tree[node][2], V[i]);
           ~^~~~~~~~~
wild_boar.cpp:51:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0; i<V.size(); i++) if(V[i].l!=tree[node][1].l && V[i].r!=tree[node][0].r) tree[node][3]=min(tree[node][3], V[i]);
           ~^~~~~~~~~
wild_boar.cpp:42:12: warning: unused variable 'k' [-Wunused-variable]
  int i, j, k;
            ^
wild_boar.cpp: In function 'void init(int, int, int)':
wild_boar.cpp:58:10: warning: unused variable 'j' [-Wunused-variable]
   int i, j;
          ^
wild_boar.cpp:62:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=tl+tr>>1;
          ~~^~~
wild_boar.cpp: In function 'void update(int, int, int, int)':
wild_boar.cpp:73:10: warning: unused variable 'j' [-Wunused-variable]
   int i, j;
          ^
wild_boar.cpp:77:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=tl+tr>>1;
          ~~^~~
wild_boar.cpp: In function 'int main()':
wild_boar.cpp:121:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(k=0; k<V.size(); k++) dist2[i][j][0]=min(dist2[i][j][0], V[k]);
             ~^~~~~~~~~
wild_boar.cpp:122:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(k=0; k<V.size(); k++) if(V[k].l!=dist2[i][j][0].l && V[k].r!=dist2[i][j][0].r) dist2[i][j][1]=min(dist2[i][j][1], V[k]);
             ~^~~~~~~~~
wild_boar.cpp:123:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(k=0; k<V.size(); k++) if(V[k].l!=dist2[i][j][0].l && V[k].r!=dist2[i][j][1].r) dist2[i][j][2]=min(dist2[i][j][2], V[k]);
             ~^~~~~~~~~
wild_boar.cpp:124:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(k=0; k<V.size(); k++) if(V[k].l!=dist2[i][j][1].l && V[k].r!=dist2[i][j][0].r) dist2[i][j][3]=min(dist2[i][j][3], V[k]);
             ~^~~~~~~~~
wild_boar.cpp:86:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d", &N, &M, &T, &L);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &u, &v, &w);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp:132:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(i=1; i<=L; i++) scanf("%d", &A[i]);
                      ~~~~~^~~~~~~~~~~~~
wild_boar.cpp:138:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &p, &q); A[p]=q;
   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 562 ms 1008604 KB Output is correct
2 Correct 516 ms 1008656 KB Output is correct
3 Correct 556 ms 1008636 KB Output is correct
4 Correct 522 ms 1008752 KB Output is correct
5 Correct 542 ms 1008760 KB Output is correct
6 Correct 531 ms 1008632 KB Output is correct
7 Correct 532 ms 1008632 KB Output is correct
8 Correct 516 ms 1008760 KB Output is correct
9 Correct 514 ms 1008632 KB Output is correct
10 Correct 539 ms 1008760 KB Output is correct
11 Correct 550 ms 1008504 KB Output is correct
12 Correct 516 ms 1008504 KB Output is correct
13 Correct 514 ms 1008760 KB Output is correct
14 Correct 528 ms 1008632 KB Output is correct
15 Correct 532 ms 1008760 KB Output is correct
16 Correct 534 ms 1008632 KB Output is correct
17 Correct 543 ms 1008632 KB Output is correct
18 Correct 526 ms 1008632 KB Output is correct
19 Correct 509 ms 1008632 KB Output is correct
20 Correct 536 ms 1008632 KB Output is correct
21 Correct 536 ms 1008632 KB Output is correct
22 Correct 524 ms 1008728 KB Output is correct
23 Correct 534 ms 1008632 KB Output is correct
24 Correct 514 ms 1008660 KB Output is correct
25 Correct 553 ms 1008504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 562 ms 1008604 KB Output is correct
2 Correct 516 ms 1008656 KB Output is correct
3 Correct 556 ms 1008636 KB Output is correct
4 Correct 522 ms 1008752 KB Output is correct
5 Correct 542 ms 1008760 KB Output is correct
6 Correct 531 ms 1008632 KB Output is correct
7 Correct 532 ms 1008632 KB Output is correct
8 Correct 516 ms 1008760 KB Output is correct
9 Correct 514 ms 1008632 KB Output is correct
10 Correct 539 ms 1008760 KB Output is correct
11 Correct 550 ms 1008504 KB Output is correct
12 Correct 516 ms 1008504 KB Output is correct
13 Correct 514 ms 1008760 KB Output is correct
14 Correct 528 ms 1008632 KB Output is correct
15 Correct 532 ms 1008760 KB Output is correct
16 Correct 534 ms 1008632 KB Output is correct
17 Correct 543 ms 1008632 KB Output is correct
18 Correct 526 ms 1008632 KB Output is correct
19 Correct 509 ms 1008632 KB Output is correct
20 Correct 536 ms 1008632 KB Output is correct
21 Correct 536 ms 1008632 KB Output is correct
22 Correct 524 ms 1008728 KB Output is correct
23 Correct 534 ms 1008632 KB Output is correct
24 Correct 514 ms 1008660 KB Output is correct
25 Correct 553 ms 1008504 KB Output is correct
26 Correct 528 ms 1008880 KB Output is correct
27 Correct 562 ms 1010424 KB Output is correct
28 Correct 614 ms 1010424 KB Output is correct
29 Incorrect 813 ms 1014564 KB Output isn't correct
30 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 562 ms 1008604 KB Output is correct
2 Correct 516 ms 1008656 KB Output is correct
3 Correct 556 ms 1008636 KB Output is correct
4 Correct 522 ms 1008752 KB Output is correct
5 Correct 542 ms 1008760 KB Output is correct
6 Correct 531 ms 1008632 KB Output is correct
7 Correct 532 ms 1008632 KB Output is correct
8 Correct 516 ms 1008760 KB Output is correct
9 Correct 514 ms 1008632 KB Output is correct
10 Correct 539 ms 1008760 KB Output is correct
11 Correct 550 ms 1008504 KB Output is correct
12 Correct 516 ms 1008504 KB Output is correct
13 Correct 514 ms 1008760 KB Output is correct
14 Correct 528 ms 1008632 KB Output is correct
15 Correct 532 ms 1008760 KB Output is correct
16 Correct 534 ms 1008632 KB Output is correct
17 Correct 543 ms 1008632 KB Output is correct
18 Correct 526 ms 1008632 KB Output is correct
19 Correct 509 ms 1008632 KB Output is correct
20 Correct 536 ms 1008632 KB Output is correct
21 Correct 536 ms 1008632 KB Output is correct
22 Correct 524 ms 1008728 KB Output is correct
23 Correct 534 ms 1008632 KB Output is correct
24 Correct 514 ms 1008660 KB Output is correct
25 Correct 553 ms 1008504 KB Output is correct
26 Correct 528 ms 1008880 KB Output is correct
27 Correct 562 ms 1010424 KB Output is correct
28 Correct 614 ms 1010424 KB Output is correct
29 Incorrect 813 ms 1014564 KB Output isn't correct
30 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 562 ms 1008604 KB Output is correct
2 Correct 516 ms 1008656 KB Output is correct
3 Correct 556 ms 1008636 KB Output is correct
4 Correct 522 ms 1008752 KB Output is correct
5 Correct 542 ms 1008760 KB Output is correct
6 Correct 531 ms 1008632 KB Output is correct
7 Correct 532 ms 1008632 KB Output is correct
8 Correct 516 ms 1008760 KB Output is correct
9 Correct 514 ms 1008632 KB Output is correct
10 Correct 539 ms 1008760 KB Output is correct
11 Correct 550 ms 1008504 KB Output is correct
12 Correct 516 ms 1008504 KB Output is correct
13 Correct 514 ms 1008760 KB Output is correct
14 Correct 528 ms 1008632 KB Output is correct
15 Correct 532 ms 1008760 KB Output is correct
16 Correct 534 ms 1008632 KB Output is correct
17 Correct 543 ms 1008632 KB Output is correct
18 Correct 526 ms 1008632 KB Output is correct
19 Correct 509 ms 1008632 KB Output is correct
20 Correct 536 ms 1008632 KB Output is correct
21 Correct 536 ms 1008632 KB Output is correct
22 Correct 524 ms 1008728 KB Output is correct
23 Correct 534 ms 1008632 KB Output is correct
24 Correct 514 ms 1008660 KB Output is correct
25 Correct 553 ms 1008504 KB Output is correct
26 Correct 528 ms 1008880 KB Output is correct
27 Correct 562 ms 1010424 KB Output is correct
28 Correct 614 ms 1010424 KB Output is correct
29 Incorrect 813 ms 1014564 KB Output isn't correct
30 Halted 0 ms 0 KB -