제출 #1287190

#제출 시각아이디문제언어결과실행 시간메모리
1287190StefanSebezMonochrome Points (JOI20_monochrome)C++20
100 / 100
824 ms8924 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double #define mp make_pair const int N=2e5+50,lg=18; int n;string s; vector<int>ids[2]; struct BIT{ int T[2*N+1]; void Update(int i,int x){for(;i<=2*N;i+=i&-i)T[i]+=x;} int Get(int i){int x=0;for(;i>=1;i-=i&-i)x+=T[i];return x;} int Get(int l,int r){return Get(r)-Get(l-1);} }bt[2]; ll Calc(vector<int>p){ ll cnt=0; int ev[2*n+1]={0}; for(int i=0;i<n;i++){ int l=ids[0][i],r=ids[1][p[i]]; if(l>r)swap(l,r); ev[r+1]=l+1; } for(int i=1;i<=2*n;i++)if(ev[i]){ cnt+=bt[0].Get(ev[i]-1)-bt[1].Get(ev[i]-1); bt[0].Update(ev[i],1); bt[1].Update(i,1); } for(int i=1;i<=2*n;i++)if(ev[i])bt[0].Update(ev[i],-1),bt[1].Update(i,-1); return cnt; } ll res,Val[N]; ll Calc(int j){ if(Val[j]) return Val[j]; vector<int>p={j}; while(p.size()<n)p.pb((p.back()+1)%n); ll x=Calc(p);res=max(res,x); return Val[j]=x; } int main(){ scanf("%i",&n);cin>>s; for(int i=0;i<2*n;i++){if(s[i]=='B') ids[0].pb(i);else ids[1].pb(i);} for(int i=0,e=1<<lg;e>=1;e>>=1){ if(Calc(i)<Calc((i+1)%n)) i=(i+(e%n))%n; else if(Calc(i)<Calc((i-1+n)%n)) i=(i-(e%n)+n)%n; } printf("%lld\n",res); return 0; }

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

monochrome.cpp: In function 'int main()':
monochrome.cpp:43:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |     scanf("%i",&n);cin>>s;
      |     ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...