AtCoder AGC017C Snuke and Spells
生活随笔
收集整理的這篇文章主要介紹了
AtCoder AGC017C Snuke and Spells
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
https://atcoder.jp/contests/agc017/tasks/agc017_c
題解
很久前不會做看了題解,現在又看了一下,只想說,這種智商題真的殺我。。。
轉化成如果現在有\(x\)個\(y\), 我們給區間\([y-x+1,y]\)都\(+1\),那么答案就是區間內\(0\)的個數。。
于是就很好\(O(n)\)維護了。。然而我真的想不到。。。
代碼
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define llong long long #define ldouble long double #define uint unsigned int #define ullong unsigned long long #define udouble unsigned double #define uldouble unsigned long double #define modinc(x) {if(x>=P) x-=P;} #define pii pair<int,int> #define piii pair<pair<int,int>,int> #define piiii pair<pair<int,int>,pair<int,int> > #define pli pair<llong,int> #define pll pair<llong,llong> #define Memset(a,x) {memset(a,x,sizeof(a));} using namespace std;const int N = 2e5; int cnt[N+2]; int a[N+2]; int num[N+2]; int n,q,ans;int main() {scanf("%d%d",&n,&q);for(int i=1; i<=n; i++) {scanf("%d",&a[i]); cnt[a[i]]++;}for(int i=1; i<=n; i++){for(int j=max(i-cnt[i]+1,0); j<=i; j++) num[j]++;}for(int i=1; i<=n; i++) if(num[i]==0) ans++;for(int i=1; i<=q; i++){int x,y; scanf("%d%d",&x,&y);cnt[a[x]]--; if(a[x]-cnt[a[x]]>0) {num[a[x]-cnt[a[x]]]--; if(num[a[x]-cnt[a[x]]]==0) ans++;}a[x] = y;if(y-cnt[y]>0) {if(num[y-cnt[y]]==0) ans--; num[y-cnt[y]]++;} cnt[y]++;printf("%d\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的AtCoder AGC017C Snuke and Spells的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 6089 Rikka with
- 下一篇: Codeforces 798D Mike