2 solutions

  • 1
    @ 2024-10-29 17:15:16

    #include<bits/stdc++.h> using namespace std; const int N = 1e6 + 10, M = 21; int n, m, Q; struct section{ int l,r; }sec[N]; bool cmp_sec(section x,section y){return x.l < y.l;} int f[N][M]; int solve(int l,int r){ int x = l, ans = 0; for(int j = 20; j >= 0; j -= 1) if(f[x][j] < r){ x = f[x][j]; ans += (1 << j); } return ans + 1; } int main(){ scanf("%d%d%d",&n,&m,&Q); for(int i = 1; i <= m; i += 1) scanf("%d%d",&sec[i].l,&sec[i].r); sort(sec + 1, sec + 1 + m, cmp_sec); for(int i = 1, j = 1, r = 0; i <= n; i += 1){ while(sec[j].l == i && j <= m){ r = max(r, sec[j].r); j += 1; } f[i][0] = r; } for(int j = 1; j < M; j += 1) for(int i = 1; i <= n; i += 1) f[i][j] = f[f[i][j - 1]][j - 1]; for(int i = 1; i <= Q; i += 1){ int l, r; scanf("%d%d",&l,&r); printf("%d\n",solve(l, r)); } return 0; }

    • 1
      @ 2024-10-29 17:14:56

      #include<bits/stdc++.h> using namespace std; const int N = 1e6 + 10, M = 21; int n, m, Q; struct section{ int l,r; }sec[N]; bool cmp_sec(section x,section y){return x.l < y.l;} int f[N][M]; int solve(int l,int r){ int x = l, ans = 0; for(int j = 20; j >= 0; j -= 1) if(f[x][j] < r){ x = f[x][j]; ans += (1 << j); } return ans + 1; } int main(){ scanf("%d%d%d",&n,&m,&Q); for(int i = 1; i <= m; i += 1) scanf("%d%d",&sec[i].l,&sec[i].r); sort(sec + 1, sec + 1 + m, cmp_sec); for(int i = 1, j = 1, r = 0; i <= n; i += 1){ while(sec[j].l == i && j <= m){ r = max(r, sec[j].r); j += 1; } f[i][0] = r; } for(int j = 1; j < M; j += 1) for(int i = 1; i <= n; i += 1) f[i][j] = f[f[i][j - 1]][j - 1]; for(int i = 1; i <= Q; i += 1){ int l, r; scanf("%d%d",&l,&r); printf("%d\n",solve(l, r)); } return 0; }

      • 1

      Information

      ID
      654
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      8
      Tags
      (None)
      # Submissions
      57
      Accepted
      7
      Uploaded By