結果
| 問題 |
No.2338 Range AtCoder Query
|
| コンテスト | |
| ユーザー |
shobonvip
|
| 提出日時 | 2023-06-03 00:36:48 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,581 bytes |
| コンパイル時間 | 12,664 ms |
| コンパイル使用メモリ | 294,488 KB |
| 最終ジャッジ日時 | 2025-02-13 21:50:19 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 5 WA * 29 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct t3{int left, right, index;};
bool sec_sort(t3 a, t3 b){return a.right < b.right;}
int main(){
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m, q;
cin >> n >> m >> q;
vector<int> prob(n);
vector<int> dat(n);
vector<int> lftwa(n);
vector<int> nowcnt(m);
for (int i=0; i<n; i++){
int p; string s; cin >> p >> s;
p--;
prob[i] = p;
if (s == "AC"){
dat[i] = 1;
lftwa[i] = nowcnt[p];
}else{
dat[i] = 0;
nowcnt[p]++;
}
}
int sep = ceil(sqrt(n));
vector<vector<t3>> mo(sep+1, vector<t3>(0));
t3 f;
for(int i=0; i<q; i++){
int l, r;
cin >> l >> r;
l--;
f.left = l;
f.right = r;
f.index = i;
mo[l/sep].push_back(f);
}
vector<int> ans1(q); // AC
vector<int> ans2(q); // WA
vector<int> lpiv(m);
vector<int> rpiv(m);
vector<int> lftsum(m);
int l = 0, r = 0;
int tl, tr, daime;
int nowans1 = 0;
int nowans2 = 0;
for(int i=0; i<sep+1; i++){
sort(mo[i].begin(), mo[i].end(), sec_sort);
//if (i%2 == 1){
// reverse(mo[i].begin(), mo[i].end());
// }
for(int j=0; j<mo[i].size(); j++){
tl = mo[i][j].left;
tr = mo[i][j].right;
//右を伸ばす
for(int k=r; k<tr; k++){
daime = prob[k];
if (dat[k] == 1){
if (lpiv[daime] == rpiv[daime]){
nowans1++;
nowans2 += lftwa[k] - lftsum[daime];
}
rpiv[daime]++;
}
}
//右を縮ませる
for(int k=r-1; k>=tr; k--){
daime = prob[k];
if (dat[k] == 1){
rpiv[daime]--;
if (lpiv[daime] == rpiv[daime]){
nowans1--;
nowans2 -= lftwa[k] - lftsum[daime];
}
}
}
//左を縮ませる
for(int k=l; k<tl; k++){
daime = prob[k];
if (dat[k] == 1){
lpiv[daime]++;
if (lpiv[daime] != rpiv[daime]){
nowans2 += lftwa[lpiv[daime]] - lftsum[daime];
}else{
nowans1--;
}
}else{
lftsum[daime]++;
if (lpiv[daime] != rpiv[daime]) nowans2--;
}
}
//左を伸ばす
for(int k=l-1; k>=tl; k--){
daime = prob[k];
if (dat[k] == 1){
if (lpiv[daime] != rpiv[daime]){
nowans2 -= lftwa[lpiv[daime]] - lftsum[daime];
}else{
nowans1++;
}
lpiv[daime]--;
}else{
lftsum[daime]--;
if (lpiv[daime] != rpiv[daime]) nowans2++;
}
}
l = tl; r = tr;
ans1[mo[i][j].index] = nowans1;
ans2[mo[i][j].index] = nowans2;
}
}
for(int i=0; i<q; i++){
cout << ans1[i] << " " << ans2[i] << "\n";
}
}
shobonvip