ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#205088 | #3645. 单调图 | Zxc200611 | 100 | 3456ms | 31520kb | C++11 | 3.0kb | 2024-06-23 09:28:09 | 2024-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