結果

問題 No.1502 Many Simple Additions
ユーザー ぷら
提出日時 2021-05-08 02:19:26
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
(最新)
AC  
(最初)
実行時間 -
コード長 3,447 bytes
コンパイル時間 2,386 ms
コンパイル使用メモリ 207,872 KB
最終ジャッジ日時 2025-01-21 09:07:09
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 38 WA * 1
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/stdc++.h>
using namespace std;
int mod = 1000000007;
int main() {
int N,M,K;
cin >> N >> M >> K;
vector<vector<pair<int,int>>> road(N);
for(int i = 0; i < M; i++) {
int X,Y,Z;
cin >> X >> Y >> Z;
X--;
Y--;
road[X].push_back({Y,Z});
road[Y].push_back({X,Z});
}
vector<vector<int>> dist(N,vector<int>(2,-mod));
long long tmp = 1,tmp2 = 1;
bool flag = true;
for(int i = 0; i < N; i++) {
if(dist[i][0] == -mod && dist[i][1] == -mod) {
if(road[i].size() == 0) {
tmp *= K;
tmp2 *= K-1;
tmp %= mod;
tmp2 %= mod;
continue;
}
dist[i][0] = 0;
vector<int> dist2;
queue<pair<int,int>> que;
que.push({i,0});
while (!que.empty()) {
pair<int,int> x = que.front();
que.pop();
dist2.push_back(x.first);
for(int j = 0; j < road[x.first].size(); j++) {
pair<int,int> nx = {road[x.first][j].first,x.second^1};
if(dist[nx.first][nx.second] == -mod) {
dist[nx.first][nx.second] = road[x.first][j].second-dist[x.first][x.second];
que.push(nx);
}
else if(dist[nx.first][nx.second] != road[x.first][j].second-dist[x.first][x.second]){
flag = false;
}
}
}
int gmi = mod,gmx = -mod,kmi = mod,kmx = -mod;
int res = -mod;
for(int j = 0; j < dist2.size(); j++) {
if(dist[dist2[j]][0] != -mod) {
gmi = min(gmi,dist[dist2[j]][0]);
gmx = max(gmx,dist[dist2[j]][0]);
}
if(dist[dist2[j]][1] != -mod) {
kmi = min(kmi,dist[dist2[j]][1]);
kmx = max(kmx,dist[dist2[j]][1]);
}
if(dist[dist2[j]][0] != -mod && dist[dist2[j]][1] != -mod) {
int a = abs(dist[dist2[j]][0]-dist[dist2[j]][1]);
if(a%2 == 1) {
flag = false;
}
if(res == -mod) {
res = a/2;
}
else if(res != a/2) {
flag = false;
}
}
}
if(res != -mod) {
if(res >= 1 && res <= K && gmi+res >= 1 && gmx+res <= K && kmi-res >= 1 && kmx-res <= K) {
if(gmx+res == K || kmx-res == K) {
tmp2 = 0;
}
}
else {
flag = false;
}
}
else {
int mi = 0,mx = 0;
mi = max(1,1-gmi);
mx = min(K,K-gmx);
mi = max(mi,kmx-K);
mx = min(mx,kmi-1);
if(mi > mx) {
flag = false;
}
tmp *= mx-mi+1;
tmp %= mod;
tmp2 *= mx-mi+1-(kmx-mi == K)-(gmx+mx == K);
tmp2 %= mod;
}
}
}
if(!flag) {
cout << 0 << endl;
return 0;
}
cout << (tmp+mod-tmp2)%mod << endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0