UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#205088#3645. 单调图Zxc2006111003456ms31520kbC++113.0kb2024-06-23 09:28:092024-06-23 13:02:26

answer

/*
最短路然后二维偏序。
注意必须存在一个点,有至少一维小于 u,另外两维小于等于 u,u 才无用。
*/
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
struct FenwickTree
{
	int val[110000],siz;
	static constexpr int lowbit(int x)
	{
		return x&(-x);
	}
	void init(int n)
	{
		siz=n;
		memset(val,0x3f,sizeof(val));
	}
	void update(int u,int x)
	{
		for(;u<=siz;u+=lowbit(u))
			val[u]=min<int>(val[u],x);
	}
	int query(int u)
	{
		int ans=inf;
		for(;u;u-=lowbit(u))
			ans=min<int>(ans,val[u]);
		return ans;
	}
};
struct Edge
{
	int end,len;
};
struct Point
{
	int x1,x2,x3;
};
struct Query
{
	int x1,x2;
	pair<int,int> qid;
};
int n,m;
vector<Edge> t[110000];
int dis[4][110000];
vector<Point> pnt[110000];
vector<Query> qry[110000];
FenwickTree ftr;
int mn3[4][110000];
void dijkstra(int s,int dis[])
{
	struct Item
	{
		int u,dis;
		bool operator<(Item b) const
		{
			return dis!=b.dis?dis>b.dis:u>b.u;
		}
	};
	static bool vis[110000];
	static priority_queue<Item> q={};
	memset(vis,0,sizeof(vis));
	q.push((Item){s,dis[s]});
	while(!q.empty())
	{
		int u=q.top().u;
		q.pop();
		if(vis[u])
			continue;
		vis[u]=1;
		for(Edge e:t[u])
		{
			int v=e.end;
			if(dis[v]>dis[u]+e.len)
			{
				dis[v]=dis[u]+e.len;
				q.push((Item){v,dis[v]});
			}
		}
	}
}
void discretize(int dis[])
{
	static int tmp[110000];
	memcpy(tmp,dis,sizeof(tmp));
	sort(tmp+1,tmp+n+1);
	static map<int,int> mp;
	mp=map<int,int>();
	int cnt=0;
	for(int i=1;i<=n;i++)
		mp[tmp[i]]=(cnt+=(i==1||tmp[i]!=tmp[i-1]));
	for(int i=1;i<=n;i++)
		dis[i]=mp[dis[i]];
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v,l;
		cin>>u>>v>>l;
		t[u].push_back((Edge){v,l});
		t[v].push_back((Edge){u,l});
	}
	memset(dis,0x3f,sizeof(dis));
	for(int s=1;s<=3;s++)
	{
		dis[s][s]=0;
		dijkstra(s,dis[s]);
		// cout<<"dis s="<<s<<" :";
		// for(int i=1;i<=n;i++)
		// 	cout<<" "<<i<<"="<<setw(3)<<dis[s][i];
		// cout<<endl;
		discretize(dis[s]);
		// cout<<"dis s="<<s<<" :";
		// for(int i=1;i<=n;i++)
		// 	cout<<" "<<i<<"="<<setw(3)<<dis[s][i];
		// cout<<endl;
	}
	for(int u=1;u<=n;u++)
	{
		pnt[dis[1][u]].push_back((Point){dis[1][u],dis[2][u],dis[3][u]});
		qry[dis[1][u]-1].push_back((Query){dis[1][u]-1,dis[2][u],make_pair(1,u)});
		qry[dis[1][u]].push_back((Query){dis[1][u],dis[2][u]-1,make_pair(2,u)});
		qry[dis[1][u]].push_back((Query){dis[1][u],dis[2][u],make_pair(3,u)});
	}
	ftr.init(n);
	for(int i=0;i<=n;i++)
	{
		for(Point p:pnt[i])
			ftr.update(p.x2,p.x3);
		for(Query q:qry[i])
			mn3[q.qid.first][q.qid.second]=ftr.query(q.x2);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		// cout<<"mn3 i="<<i<<" : 1="<<mn3[1][i]<<" 2="<<mn3[2][i]<<" 3="<<mn3[3][i]<<endl;
		if(!(mn3[1][i]<=dis[3][i]||mn3[2][i]<=dis[3][i]||mn3[3][i]<dis[3][i]))
		{
			ans++;
			// cout<<i<<endl;
		}
	}
	// cout<<endl;
	cout<<ans<<endl;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 5
Accepted
time: 7ms
memory: 11756kb

input:

250 300
224 221 81
7 224 11
19 221 40
186 7 96
149 19 86
143 149 75
111 221 47
4 221 84
87 224 28
24...

output:

33

result:

ok single line: '33'

Test #2:

score: 5
Accepted
time: 0ms
memory: 11756kb

input:

250 300
15 55 47
44 15 29
36 44 39
147 15 76
114 55 20
47 15 99
5 36 44
185 55 37
224 5 67
113 147 4...

output:

27

result:

ok single line: '27'

Test #3:

score: 5
Accepted
time: 4ms
memory: 11756kb

input:

250 300
145 60 26
26 145 19
131 26 62
73 131 66
228 26 4
250 60 32
30 73 32
210 26 33
161 131 68
70 ...

output:

33

result:

ok single line: '33'

Test #4:

score: 5
Accepted
time: 7ms
memory: 11756kb

input:

250 300
212 227 26
70 227 83
122 70 31
245 122 1
162 122 18
89 212 45
233 89 78
159 162 49
87 70 89
...

output:

37

result:

ok single line: '37'

Test #5:

score: 5
Accepted
time: 9ms
memory: 12008kb

input:

1800 2000
481 73 36
1145 481 90
899 481 12
855 899 71
117 1145 87
17 855 51
1223 17 13
1708 1145 55
...

output:

43

result:

ok single line: '43'

Test #6:

score: 5
Accepted
time: 11ms
memory: 12016kb

input:

1800 2000
1533 1556 16
1551 1556 96
1076 1556 37
31 1551 83
40 1076 18
1648 1551 97
1760 1533 89
141...

output:

58

result:

ok single line: '58'

Test #7:

score: 5
Accepted
time: 0ms
memory: 12008kb

input:

1800 2000
554 498 60
442 554 18
54 498 9
1798 54 33
422 1798 14
1696 54 41
201 1798 40
297 1798 63
8...

output:

49

result:

ok single line: '49'

Test #8:

score: 5
Accepted
time: 492ms
memory: 31520kb

input:

100000 99999
5092 35397 69
59669 5092 13
66060 5092 45
45290 66060 57
86709 5092 79
37616 86709 66
7...

output:

5616

result:

ok single line: '5616'

Test #9:

score: 5
Accepted
time: 335ms
memory: 31416kb

input:

100000 99999
76853 94 59
27726 94 13
90492 76853 33
97933 90492 71
46476 97933 18
6568 90492 37
3242...

output:

3202

result:

ok single line: '3202'

Test #10:

score: 5
Accepted
time: 307ms
memory: 31408kb

input:

100000 99999
20874 85984 48
8458 20874 88
50743 8458 100
41101 8458 84
8267 20874 86
30201 8458 55
3...

output:

4659

result:

ok single line: '4659'

Test #11:

score: 5
Accepted
time: 225ms
memory: 27488kb

input:

100000 200000
53018 80768 61
5832 80768 43
2997 80768 91
66393 80768 56
81366 5832 59
85664 5832 16
...

output:

40

result:

ok single line: '40'

Test #12:

score: 5
Accepted
time: 229ms
memory: 27744kb

input:

100000 200000
28908 36036 66
91872 36036 84
1622 28908 74
60237 1622 1
17200 28908 44
89734 28908 82...

output:

39

result:

ok single line: '39'

Test #13:

score: 5
Accepted
time: 241ms
memory: 27772kb

input:

100000 200000
80169 49117 81
59533 80169 11
38687 80169 66
73361 49117 69
86848 80169 39
97609 73361...

output:

37

result:

ok single line: '37'

Test #14:

score: 5
Accepted
time: 225ms
memory: 27500kb

input:

100000 200000
8518 10111 89
80152 8518 82
28398 8518 42
64281 8518 89
79057 10111 31
67454 64281 64
...

output:

52

result:

ok single line: '52'

Test #15:

score: 5
Accepted
time: 226ms
memory: 27760kb

input:

100000 200000
63008 51968 67
14619 63008 33
38273 63008 86
30436 51968 98
95240 30436 21
44387 51968...

output:

118

result:

ok single line: '118'

Test #16:

score: 5
Accepted
time: 213ms
memory: 27496kb

input:

100000 200000
38428 6838 6
57875 38428 62
23341 6838 42
77486 57875 67
36886 57875 99
35263 6838 58
...

output:

106

result:

ok single line: '106'

Test #17:

score: 5
Accepted
time: 244ms
memory: 27772kb

input:

100000 200000
29745 3984 50
23260 3984 62
53496 23260 79
81207 53496 13
79920 81207 44
90071 53496 1...

output:

99

result:

ok single line: '99'

Test #18:

score: 5
Accepted
time: 204ms
memory: 27760kb

input:

100000 200000
46691 643 96
325 46691 74
74789 325 7
65177 46691 54
98613 46691 46
69449 643 77
60913...

output:

62

result:

ok single line: '62'

Test #19:

score: 5
Accepted
time: 241ms
memory: 27760kb

input:

100000 200000
33629 97358 73
44862 33629 12
25151 33629 46
87268 25151 34
81508 25151 83
45636 81508...

output:

160

result:

ok single line: '160'

Test #20:

score: 5
Accepted
time: 236ms
memory: 27504kb

input:

100000 200000
68252 47666 98
62764 68252 87
84831 68252 91
49616 68252 73
58627 68252 71
33313 68252...

output:

166

result:

ok single line: '166'

Extra Test:

score: 0
Extra Test Passed