Submission #651713

#TimeUsernameProblemLanguageResultExecution timeMemory
651713Markomafko972Traffic (CEOI11_tra)C++14
100 / 100
950 ms82764 KiB
#include <bits/stdc++.h> #define X first #define Y second #define pb push_back #define pii pair<int, int> typedef long long ll; using namespace std; const int MOD = 1e9 + 7; const ll INF = 1e18; const int OFF = (1 << 20); int n, m, a, b, px, py, poc, kr, ty; vector<int> v[300005]; vector<int> vr[300005]; int bio[300005]; stack<int> st; int tren; int comp[300005]; vector<int> e[300005]; vector< pair<int, int> > l; vector< pair<int, int> > r; vector< pair<int, int> > r2; pair<int, int> dp[300005]; int dosao[300005]; vector<int> koji[300005]; int reshi[300005]; void prolaz(int x) { dosao[x] = 1; for (int i = 0; i < e[x].size(); i++) { if (dosao[e[x][i]] == 0) prolaz(e[x][i]); } } void dfs(int x) { bio[x] = 1; for (int i = 0; i < v[x].size(); i++) { if (bio[v[x][i]] == 0) { dfs(v[x][i]); } } st.push(x); } void dfsr(int x) { comp[x] = tren; //cout << x << " je " << tren << endl; for (int i = 0; i < vr[x].size(); i++) { if (comp[vr[x][i]] == -1) dfsr(vr[x][i]); } } pair<int, int> rek(int x) { if (dp[x] != make_pair((int)1e9, (int)-1e9)) return dp[x]; if (reshi[x]) return make_pair((int)1e9, (int)-1e9); pair<int, int> &ret = dp[x]; ret = make_pair((int)1e9, (int)-1e9); for (int i = 0; i < e[x].size(); i++) { pair<int, int> sus = rek(e[x][i]); ret.X = min(ret.X, sus.X); ret.Y = max(ret.Y, sus.Y); } for (int i = 0; i < koji[x].size(); i++) { ret.X = min(ret.X, koji[x][i]); ret.Y = max(ret.Y, koji[x][i]); } reshi[x] = 1; return ret; } int main () { scanf("%d %d %d %d", &n, &m, &a, &b); for (int i = 0; i < n; i++) { scanf("%d %d", &px, &py); if (px == 0) l.push_back({py, i}); if (px == a) r.push_back({py, i}); } for (int i = 0; i < m; i++) { scanf("%d %d %d", &poc, &kr, &ty); poc--; kr--; if (ty == 1) { v[poc].push_back(kr); vr[kr].push_back(poc); } else { v[poc].push_back(kr); v[kr].push_back(poc); vr[poc].push_back(kr); vr[kr].push_back(poc); } } for (int i = 0; i < n; i++) { if (bio[i] == 0) { dfs(i); } } memset(comp, -1, sizeof comp); while (st.size() > 0) { if (comp[st.top()] != -1) { st.pop(); } else { dfsr(st.top()); st.pop(); tren++; } } for (int i = 0; i < n; i++) { dp[i] = make_pair(1e9, -1e9); for (int j = 0; j < v[i].size(); j++) { if (comp[i] != comp[v[i][j]]) e[comp[i]].push_back(comp[v[i][j]]); } } for (int i = 0; i < l.size(); i++) { if (dosao[comp[l[i].Y]] == 0) prolaz(comp[l[i].Y]); } for (int i = 0; i < r.size(); i++) { if (dosao[comp[r[i].Y]] == 1) r2.push_back(r[i]); } r = r2; sort(r.begin(), r.end()); for (int i = 0; i < r.size(); i++) { koji[comp[r[i].Y]].push_back(i); } /*for (int i = 0; i < tren; i++) { cout << i << ": " << kol[i].X << " " << kol[i].Y << endl; }*/ sort(l.begin(), l.end()); for (int i = (int)l.size()-1; i >= 0; i--) { if (reshi[comp[l[i].Y]]) { if (dp[comp[l[i].Y]].X == (int)1e9 && dp[comp[l[i].Y]].Y == (int)-1e9) printf("0\n"); else printf("%d\n", dp[comp[l[i].Y]].Y-dp[comp[l[i].Y]].X+1); } else { pair<int, int> rj = rek(comp[l[i].Y]); if (rj == make_pair((int)1e9, (int)-1e9)) printf("0\n"); else printf("%d\n", rj.Y-rj.X+1); } } return 0; } //maknut nespojene na a //4 3 1 100 //0 1 //1 0 //1 1 //1 2 //1 2 2 //2 3 1 //1 4 2

Compilation message (stderr)

tra.cpp: In function 'void prolaz(int)':
tra.cpp:32:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for (int i = 0; i < e[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~
tra.cpp: In function 'void dfs(int)':
tra.cpp:40:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |  for (int i = 0; i < v[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~
tra.cpp: In function 'void dfsr(int)':
tra.cpp:53:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |  for (int i = 0; i < vr[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~~
tra.cpp: In function 'std::pair<int, int> rek(int)':
tra.cpp:65:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |  for (int i = 0; i < e[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~
tra.cpp:71:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |  for (int i = 0; i < koji[x].size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~~
tra.cpp: In function 'int main()':
tra.cpp:125:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |   for (int j = 0; j < v[i].size(); j++) {
      |                   ~~^~~~~~~~~~~~~
tra.cpp:130:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  130 |  for (int i = 0; i < l.size(); i++) {
      |                  ~~^~~~~~~~~~
tra.cpp:134:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  134 |  for (int i = 0; i < r.size(); i++) {
      |                  ~~^~~~~~~~~~
tra.cpp:140:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |  for (int i = 0; i < r.size(); i++) {
      |                  ~~^~~~~~~~~~
tra.cpp:82:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |  scanf("%d %d %d %d", &n, &m, &a, &b);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tra.cpp:84:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |   scanf("%d %d", &px, &py);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~
tra.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |   scanf("%d %d %d", &poc, &kr, &ty);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...