제출 #347388

#제출 시각아이디문제언어결과실행 시간메모리
347388UncreativeMatching (CEOI11_mat)C++14
100 / 100
1235 ms46828 KiB
#include<iostream> #include<algorithm> #include<vector> using namespace std; int mod = 1000000087; int B = 1000033; const int maxn = 1000010; int s[maxn]; pair<int, int> h[maxn]; int a[maxn]; pair<int, int> c[maxn]; int d[maxn]; long long loga[2 * maxn]; int loga2[2 * maxn]; void update(int x, int val){ for (; x < 2 * maxn; x += (x & (-x))){ loga[x] += val; if (loga[x] < 0){ loga[x] += mod; } loga[x] %= mod; } } int query(int x){ int ret = 0; for (; x > 0; x -= (x & (-x))){ ret += loga[x]; ret %= mod; } return ret; } void update2(int x, int val){ for (; x < 2 * maxn; x += (x & (-x))){ loga2[x] += val; } } int query2(int x){ int ret = 0; for (; x > 0; x -= (x & (-x))){ ret += loga2[x]; } return ret; } int pot(int e){ if (e == 0){ return 1; } if (e % 2 == 1){ int t = ((long long)pot(e - 1) * (long long)B) % mod; return t; } if (e % 2 == 0){ long long t = pot(e / 2); return ((t * t) % mod); } } int main(){ int inv = pot(mod - 2); //cout << inv; int n, m; cin >> m >> n; for (int i = 1; i <= m; i++){ int x; cin >> x; s[x] = i; } long long hs = 0; for (int i = 1; i <= m; i++){ hs *= B; hs %= mod; hs += s[i]; hs %= mod; } //cout << "HS " << hs << endl; for (int i = 1; i <= n; i++){ int x; cin >> x; h[i] = make_pair(x, i); } sort(h + 1, h + n + 1); for (int i = 1; i <= n; i++){ a[h[i].second] = i; } /*for (int i = 1; i <= n; i++){ cout << a[i] << " "; }*/ for (int i = 1; i <= m; i++){ c[i] = make_pair(a[i], i); } sort(c + 1, c + m + 1); for (int i = 1; i <= m; i++){ d[c[i].second] = i; } vector<int> sol; long long h2 = 0, bp = 1; for (int i = m; i >= 1; i--){ update2(a[i], 1); h2 += (d[i] * bp); h2 %= mod; update(a[i], bp); bp *= B; bp %= mod; //cout << "T " << h2 << endl; } if (hs == h2){ sol.push_back(1); } long long bm = 1; long long inb = inv; for (int i = m + 1; i <= n; i++){ long long t = query(n) - query(a[i - m]); if (t < 0){ t += mod; } t *= bm; t %= mod; h2 -= t; if (h2 < 0){ h2 += mod; } h2 %= mod; t = query(a[i - m]) - query(a[i - m] - 1); if (t < 0){ t += mod; } t %= mod; update(a[i - m], -t); t *= bm; t %= mod; t *= query2(a[i - m]); t %= mod; h2 -= t; if (h2 < 0){ h2 += mod; } h2 %= mod; update2(a[i - m], -1); h2 *= B; h2 %= mod; bm *= B; bm %= mod; t = query(n) - query(a[i]); if (t < 0){ t += mod; } t *= bm; t %= mod; h2 += t; h2 %= mod; update(a[i], inb); inb *= inv; inb %= mod; update2(a[i], 1); h2 += query2(a[i]); h2 %= mod; //cout << h2 << endl; if (h2 == hs){ sol.push_back(i - m + 1); } } cout << sol.size() << "\n"; for (int i = 0; i < sol.size(); i++){ cout << sol[i] << " "; } if (sol.size() == 0){ cout << "\n"; } }

컴파일 시 표준 에러 (stderr) 메시지

mat.cpp: In function 'int main()':
mat.cpp:186:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  186 |     for (int i = 0; i < sol.size(); i++){
      |                     ~~^~~~~~~~~~~~
mat.cpp: In function 'int pot(int)':
mat.cpp:70:1: warning: control reaches end of non-void function [-Wreturn-type]
   70 | }
      | ^
#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...