結果
問題 | No.714 回転寿司屋のシミュレート |
ユーザー |
![]() |
提出日時 | 2018-07-16 02:54:48 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 10 ms / 2,000 ms |
コード長 | 5,884 bytes |
コンパイル時間 | 1,463 ms |
コンパイル使用メモリ | 119,304 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-08 00:16:03 |
合計ジャッジ時間 | 2,711 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 35 |
ソースコード
#include <fstream>#include <iostream>#include <algorithm>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <string>#include <sstream>#include <map>#include <set>#include <vector>#include <stack>#include <cmath>#include <queue>#include <random>using namespace std;#define INT_MAX_VALUE 2147483647#define LONG_LONG_MAX_VALUE 9223372036854775807#define ll long long#define ld long doublestruct XX{ll x;ll i;};class xxGreater {public:bool operator()(const XX& riLeft, const XX& riRight) const {//第2条件if((riLeft.x) == (riRight.x)){return riLeft.i > riRight.i;//<:昇順(小さいものから順番)、>:降順(大きいものから順番)//プライオリティキューの場合は > で、top()すると値の小さいものがとれる}//第1条件return (riLeft.x) > (riRight.x);}};//map<long long,long long> prime_f(long long n){// map<long long,long long>res;// for(int i=2;i*i<=n;i++){// while(n%i==0){// ++res[i];// n/=i;// }// }// if(n!=1)res[n]=1;// return res;//}int n;//int dat[2*10000000];//int dat2[2*10000000];int dat[10];int dat2[10];void init(int n_){n=1;while(n<n_)n*=2;for(int i=0;i<2*n-1;i++){dat[i]=0;dat2[i]=0;}}void initset(int k,int a){k+=n-1;dat[k]=a;while(k>0){k=(k-1)/2;dat[k]=dat[k*2+1]+dat[k*2+2];}}//[a,b)の間を[l,r]区間で比較しアップデート//引数のindexに注意//nは固定。initで計算すみ//update2(L[i],R[i]+1,0,0,n,D[i]);void update2(int a,int b,int k,int l,int r,int v){//v更新値、区間は0-indexif(r<=a || b<=l)return;if(a<=l && r<=b){dat[k]+=dat2[k];if(r-l>1){dat2[k*2+1]+=dat2[k]/2;dat2[k*2+1]+=dat2[k]/2;}dat2[k]=v*(r-l);return;}else{update2(a,b,k*2+1,l,(l+r)/2,v);update2(a,b,k*2+2,(l+r)/2,r,v);return;}}int query(int a,int b,int k,int l,int r){if(r<=a || b<=l)return 0;if(a<=l && r<=b){dat[k]+=dat2[k];if(r-l>1){dat2[k*2+1]+=dat2[k]/2;dat2[k*2+1]+=dat2[k]/2;}dat2[k]=0;return dat[k];}else{int vl=query(a,b,k*2+1,l,(l+r)/2);int vr=query(a,b,k*2+2,(l+r)/2,r);return vl+vr;}}struct edge {int to,cap,rev;};vector<edge> G[100];int level[100];int iter[100];void add_edge(int from, int to, int cap){G[from].push_back((edge){to,cap,(int)G[to].size()});G[to].push_back((edge){from,0,(int)G[from].size()-1});}void bfs(int s){memset(level, -1, sizeof(level));queue<int> que;level[s]=0;que.push(s);while(!que.empty()){int v=que.front();que.pop();for(int i=0;i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0 && level[e.to]<0){level[e.to]=level[v]+1;que.push(e.to);}}}}int dfs(int v, int t, int f){if(v==t) return f;for(int &i=iter[v];i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0 && level[v]<level[e.to]){int d=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=d;G[e.to][e.rev].cap+=d;return d;}}}return 0;}int max_flow(int s,int t){//s:start, t:endint flow=0;while(1){bfs(s);//s:スタートif(level[t]<0) return flow;memset(iter,0,sizeof(iter));int f;while((f=dfs(s,t,INT_MAX_VALUE))>0){flow+=f;}}}int main(int argc, const char * argv[]){//scanf("%s",S);//scanf("%d",&N);//scanf("%lld %lld",&target1,&target2);//sscanf(tmp.c_str(),"%dd%d%d",&time[i], &dice[i], &z[i]);//getline(cin, target);//ifstream ifs("1_06.txt");//テスト用//ifs >> a;//ここから//入力高速化ios::sync_with_stdio(false);cin.tie(0);int N;cin >> N;bool seki[20];for(int i=0;i<20;i++) seki[i]=false;map<string,int> kuilist[20];vector<int>ans;for(int i=0;i<N;i++){int tmp;cin >> tmp;if(tmp==0){int ni,mi;cin >> ni >> mi;ni--;seki[ni]=true;for(int j=0;j<mi;j++){string key;cin >> key;kuilist[ni][key]++;}}else if(tmp==1){string skey;cin >> skey;int f=-1;for(int j=0;j<20;j++){if(seki[j]){for(int k=0;k<kuilist[j].size();k++){if(kuilist[j].find(skey)!=kuilist[j].end()){kuilist[j][skey]--;if(kuilist[j][skey]==0){kuilist[j].erase(kuilist[j].find(skey));}f=j;break;}}if(f!=-1){break;}}}if(f==-1){ans.push_back(-1);}else{ans.push_back(f+1);}}else{int deru;cin >> deru;deru--;seki[deru]=false;kuilist[deru].clear();}}for(int i=0;i<ans.size();i++){cout << ans[i] << endl;}//ここまで//cout << "ans" << endl;改行含む//printf("%.0f\n",ans);//小数点以下表示なし//printf("%.7f\n",p);return 0;}