QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#116212#6659. 외곽 순환 도로 2yyyyxh#Compile Error//C++171.7kb2023-06-28 12:13:232024-05-31 18:21:12

Judging History

你现在查看的是测评时间为 2024-05-31 18:21:12 的历史记录

  • [2024-08-26 15:49:46]
  • 管理员手动重测本题所有提交记录
  • 测评结果:100
  • 用时:29ms
  • 内存:42064kb
  • [2024-05-31 18:21:12]
  • 评测
  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-28 12:13:23]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pil;
const int N=100003;
const ll INF=0x3f3f3f3f3f3f3f3f;
int hd[N],ver[N],nxt[N],tot;
ll dp[N][2][2][2];
vector<pil> g[N];
ll wl[N];
int leaf;
int lef[N],rig[N];
void chmn(ll &x,ll v){if(x>v) x=v;}
void dfs(int u){
	for(int x=0;x<2;++x)
		for(int y=0;y<2;++y)
			for(int z=0;z<2;++z) dp[u][x][y][z]=INF;
	if(g[u].empty()){
		dp[u][0][0][0]=0;
		dp[u][1][1][1]=0;
		lef[u]=rig[u]=leaf;
		++leaf;
		return;
	}
	int l=-1,r=-1;
	for(auto [v,w]:g[u]){
		dfs(v);
		if(l<0&&r<0){
			l=lef[v];
			r=rig[v];
			for(int x=0;x<2;++x)
				for(int y=0;y<2;++y)
					for(int z=0;z<2;++z){
						if(dp[v][x][y][z]==INF) continue;
						for(int t=0;t<2;++t)
							chmn(dp[u][t][y][z],dp[v][x][y][z]+(x==t)*w);
					}
		}
		else{
			ll tmp[2][2][2];
			for(int x=0;x<2;++x)
				for(int y=0;y<2;++y)
					for(int z=0;z<2;++z){
						tmp[x][y][z]=dp[u][x][y][z];
						dp[u][x][y][z]=INF;
					}
			for(int x=0;x<2;++x)
				for(int y=0;y<2;++y)
					for(int z=0;z<2;++z){
						if(dp[v][x][y][z]==INF) continue;
						for(int t=0;t<2;++t)
							for(int a=0;a<2;++a)
								for(int b=0;b<2;++b){
									if(tmp[t][a][b]==INF) continue;
									chmn(dp[u][t][a][z],tmp[t][a][b]+dp[v][x][y][z]+(x==t)*w+(b==y)*wl[r]);
								}
					}
			r=rig[v];
		}
	}
	lef[u]=l;rig[u]=r;
}
ll place_police(vector<int> P,vector<ll> C,vector<ll> W){
	int n=P.size();
	for(int i=0;i<n;++i) g[P[i]].emplace_back(i+1,C[i]);
	leaf=W.size();
	for(int i=0;i<leaf;++i) wl[i]=W[i];
	leaf=0;dfs(0);
	ll res=INF;
	for(int x=0;x<2;++x)
		for(int y=0;y<2;++y)
			for(int z=0;z<2;++z) chmn(res,dp[0][x][y][z]+(y==z)*W.back());
    return res;
}

詳細信息

cc1plus: fatal error: implementer.cpp: No such file or directory
compilation terminated.