質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

382閲覧

abc217 E-sorting queriesにおいて自分のコードのどこが間違っているのかがわからないです。協力していただけると幸いです。

miwawa.1

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/03/29 07:16

実現したいこと

コード内の間違えを見つけていただきたいです。

発生している問題・分からないこと

16個のtest caseのうち5個がwaです。

エラーメッセージ

error

1エラーメッセージは出ていないです。

該当のソースコード

c++

1#include <bits/stdc++.h> 2#include <cmath> 3using ll=long long; 4#define rep(i,a,b) for(i=a;i<b;i++) 5#define chmin(x,b) x=min(x,b) 6using namespace std; 7using v=vector<int>; 8using vv=vector<vector<int>>; 9int mod1=998244353; 10int mod2=1000000007; 11const ll INF = 1e18; 12 13int main(){ 14 ll n,q,y,x,i,j,k,z,p; 15 int ans=1e9,sum2=0,h=0,w=0,m,h1=0,w1=0; 16 ll tmp1=0,tmp2=0,sum=0; 17 cin>>q; 18 deque<int> deq; 19 set<int>sat; 20 rep(i,0,q){ 21 cin>>x; 22 if(x==1){ 23 cin>>y; 24 deq.push_back(y); 25 }else if(x==2){ 26 if(sat.size()){ 27 auto ch=sat.begin(); 28 cout<<*ch<<endl; 29 sat.erase(*ch); 30 auto chh=sat.begin(); 31 //cout<<"*"<<*chh<<endl; 32 }else{ 33 cout<<deq.front()<<endl; 34 deq.pop_front(); 35 } 36 }else{ 37 while(deq.size()){ 38 sat.insert(deq.front());deq.pop_front(); 39 } 40 } 41 } 42 }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

waがでたtest caseをみて自分なりにdebugをしたのですがなぜwaが出るのか原因を特定できませんでした。atcoder公式が出している解答コードを見たのですが同じようなコードを書いてあるように感じました。

問題のリンクです。
https://atcoder.jp/contests/abc217/tasks/abc217_e

解答コードを添付しておきます。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)

int main() {
int Q;
cin >> Q;
priority_queue<int,vector<int>,greater<int>> pq;
queue<int> q;
rep(qi,Q) {
int c;
cin >> c;
if (c == 1) {
int x;
cin >> x;
q.push(x);
} else if (c == 2) {
if (pq.size()) {
cout << pq.top() << endl;
pq.pop();
} else {
cout << q.front() << endl;
q.pop();
}
} else {
while (q.size()) {
pq.push(q.front());
q.pop();
}
}
}
return 0;
}

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/03/29 08:31

全く使わない using とか define とか変数とか…… ご自身がご自身のためだけにコードを書いている分には好きにやればよかろうとは思いますが, 他者にコードを見せるとなった時点で,少しは不要な雑音を取り除こうとか思わないのでしょうか.
fana

2024/03/29 08:38

> 自分なりにdebugをした のであれば,問題が再現する入力くらいは示すべきでは. 「こんな単純なのでも動かない」という最小に近い入力例を.
guest

回答2

0

ベストアンサー

fana さんの回答でも解決しないようなので、蛇足だとは思いますが補足させていただきます。

以下の入力に対して、

6 1 1 1 1 1 2 3 2 2

正しい出力は以下ですが、

1 1

ご提示のコードだと以下が出力されます。

1 2

原因は既に fana さんがおっしゃっている通りで、setには同じ値を複数登録できないからです。

同じ値を複数登録できるmultisetに変更したうえで、削除をイテレータによる位置指定で行うようにすれば、WAが無くなります。(削除を値で行おうとすると、同じ値がまとめて削除されてしまう)

diff

1 ll tmp1=0,tmp2=0,sum=0; 2 cin>>q; 3 deque<int> deq; 4- set<int>sat; 5+ multiset<int>sat; 6 rep(i,0,q){ 7 cin>>x; 8 if(x==1){

diff

1 if(sat.size()){ 2 auto ch=sat.begin(); 3 cout<<*ch<<endl; 4- sat.erase(*ch); 5+ sat.erase(ch); 6 auto chh=sat.begin(); 7 //cout<<"*"<<*chh<<endl; 8 }else{

投稿2024/03/31 00:03

編集2024/03/31 00:14
actorbug

総合スコア2224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

set<int>sat;

何故set を使うのですか?
同じ値が複数個入力されてきたらまずいのではないのですか?

解答コードを見たのですが同じようなコードを書いてある

「同じような」 と 「同じ」 は違うわけで.
見た目の雰囲気が何となく似ていればそれで同じ動作結果になるわけではないです.
「同じ」と言えないのであれば,そこに存在する差分に着目してください.

投稿2024/03/29 08:22

編集2024/03/29 08:27
fana

総合スコア11663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問