https://codeforces.com/contest/1257
A題 取個max(b-a+x, n-1)
B題 儅x>3 時就可以變成任意y, 儅 n <= 3 時 討論下
C題 用數組記錄下沒個數的出現位置, 取與上一次位置的最小距離為答案
D題 儅怪物中力量最大的大於勇士 則輸出 -1, 否則 貪心 將每個耐力值取最大力量, 用一個數組存 耐力值的最大力量()
/* 6 1 1 1 2 2 2 */ #include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++) #define ll long long void taskA(){ int t, n,x,a,b; cin >> t; while(t--) { cin >> n >> x >> a >> b; if(a > b) swap(a, b); int ma = b-a; if(abs(b-a) < n) ma = min(n-1, ma+x); cout << ma << endl; } } void taskB(){ ll t, x, y; cin >> t; while(t--) { int flag = 1; cin >> x >> y; //if(x%2==0 && x/2*3==x && x!=y) flag = 0; if(((x==3 && y>3) || (x==1 && y>1) || (x==2 && y>3))) flag = 0; if(flag) cout << "YES\n"; else cout << "NO\n"; } } void taskC(){ int t; cin >> t; while(t--) { int n; cin >> n; int ma = 0, k, ans = n+5, x; vector<int> lst(n+1, 0); _rep(i,1,n) { cin >> x; if(lst[x]) ans = min(ans, i-lst[x]+1); lst[x] = i; } if(ans > n) ans = -1; cout << ans << endl; } } void taskD(){ int t; cin>> t; while(t--) { int n; cin >> n; //vector<int> mon, hero; vector<int> mon(n), hero(n+1, 0); int mxm = 0; _for(i,0,n) { cin >> mon[i]; mxm = max(mon[i], mxm); } int m, mxp = 0; cin >> m; _for(i,0,m) { int x,y; cin >> x >> y; mxp = max(mxp, x); hero[y] = max(hero[y], x); } if(mxp < mxm) { cout<<"-1\n"; continue; } for(int i = n-1; i > 0; --i) hero[i] = max(hero[i], hero[i+1]); int ans = 0, pos = 0; while(pos < n) { ans++; int npos = pos; int mx = 0; while(1) { mx = max(mx, mon[npos]); if(mx > hero[npos-pos+1]) break; npos++; } //if(npos == pos) break; pos = npos; } cout << ans << endl; } } int main(){ ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); //freopen("output.txt", "w", stdout); //taskA(); //taskB(); //taskC(); taskD(); return 0; }