解法
2分探索使ってほげると良い。
multisetとかmapとか色々使ったけどやっぱりvectorが実行時間が短かった。
ソース
#include<cstdio> #include<algorithm> #include<map> #include<vector> #include<string> using namespace std; #define INF ( 1 << 30 ) typedef pair < int , int > Pi; int main() { int N, Q; int stmp[1000000], comp[1000000], a; char buff[1024]; scanf( "%d %d", &N, &Q); for(int i = 0 ; i < N ; i++ ){ scanf( "%d", &stmp[i]); comp[i] = stmp[i]; } sort( comp, comp + N); vector< int > sym; while(Q--){ scanf("%s %d", buff, &a); if(*buff == 'A'){ //ADD sym.push_back(stmp[a - 1]); sort( sym.begin(), sym.end()); } else if(*buff == 'R'){ //REMOVE sym.erase( lower_bound( sym.begin(), sym.end(), stmp[a - 1])); } else { //CHECK int left = 0, right = INF; while(left != right){ int center = ( left + right ) / 2; int pre = 0, BAN = 0; for(int i = 0 ; i < sym.size() ; i++ ){ int p = distance( comp,lower_bound( comp, comp + N, sym[i] - center)); BAN += max( p - pre, 0); pre = distance( comp, upper_bound( comp, comp + N, sym[i])); } BAN += max( N - pre, 0); if(BAN <= a) right = center; else left = center + 1; } if( left != INF) printf("%d\n", left); else puts("NA"); } } return false; }
0 件のコメント:
コメントを投稿