单调队列,滑动窗口 #includebits/stdc.h using namespace std; int main() { int n; cinn; vectorinta(n); int k; cink; for(int i0;in;i) { cina[i]; } dequeintq; vectorintans; 最大值 for(int i0;in;i) { while(!q.empty()q.front()ki) { q.pop_front(); }//判断此时的滑动窗口是否已满满的话执行去掉队首 while(!q.empty()a[q.back()]a[i]) { q.pop_back(); }//在找最大值的时候有比a[i]要小的元素因此不能让它留在队首要去掉 q.push_back(i);//让新的下标进入队列 if(ik-1)ans.push_back(a[q.front()]);//在达到滑动窗口的大小后都会判出一个最大值 } vectorintcnt; dequeintq_min; 最小值 for(int i0;in;i) { while(!q_min.empty()q_min.front()ki) { q_min.pop_front(); } while(!q_min.empty()a[q_min.back()]a[i]) { q_min.pop_back(); } q_min.push_back(i); if(ik-1)cnt.push_back(a[q_min.front()]); } for(int x:cnt) { coutx ; } coutendl; for(int y:ans) { couty ; } }题目大意在不超过m的滑动窗口中找到最大和#includebits/stdc.h using namespace std; int main() { int n,m; cinnm; vectorint a(n 1); for (int i 1; i n; i) { cin a[i]; } // 1. 计算前缀和 vectorint s(n 1, 0); for (int i 1; i n; i) { s[i] s[i - 1] a[i]; } dequeintq; int ans-1e18; for(int i0;in;i) { while(!q.empty()q.front()mi) { q.pop_front(); }//判断滑动窗口是否满了满的话出队 if(!q.empty()) ansmax(ans,s[i]-s[q.front()]);//留下每一次滑动窗口下最大的和 while(!q.empty()s[q.back()]s[i]) q.pop_back();//如果该下标下的前缀和大于后者的前缀和这把这个下标除去因为减的越大留下的越小要留下较大的 q.push_back(i);//下标入队 } coutansendl; }题目大意在出现的所有时间下算时间差在86400内不同国家的个数#includebits/stdc.h using namespace std; #define int long long #define endl \n #define pii pairint,int #define fi first #define se second const int N101; void slove(){ int n; cinn; queuepairint,vectorintq; vectorintcnt(100005,0); int ans0; for(int i0;in;i) { int t,k; cintk; vectorints(k); for(int i0;ik;i) { cins[i]; } //把不在这个时间差的国家从不同国家数中除去 while(!q.empty()q.front().firstt-86400) { auto shipq.front(); for(int country:ship.second) { cnt[country]--; if(cnt[country]0) { ans--; } } q.pop(); } //记录不同国家数 for(int country:s) { if(cnt[country]0) ans; cnt[country]; } q.push({t,s}); coutansendl; } } signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int _1; //cin_; while(_--) slove(); return 0; }