結果

問題 No.151 セグメントフィッシング
ユーザー koyumeishikoyumeishi
提出日時 2015-02-14 03:02:38
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 47 ms / 5,000 ms
コード長 2,252 bytes
コンパイル時間 777 ms
コンパイル使用メモリ 80,724 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-06-23 19:54:02
合計ジャッジ時間 2,063 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 7 ms
5,376 KB
testcase_09 AC 8 ms
5,376 KB
testcase_10 AC 8 ms
5,376 KB
testcase_11 AC 7 ms
5,376 KB
testcase_12 AC 28 ms
5,376 KB
testcase_13 AC 29 ms
5,376 KB
testcase_14 AC 29 ms
5,376 KB
testcase_15 AC 29 ms
5,376 KB
testcase_16 AC 28 ms
5,376 KB
testcase_17 AC 16 ms
5,376 KB
testcase_18 AC 18 ms
5,376 KB
testcase_19 AC 47 ms
5,376 KB
testcase_20 AC 46 ms
5,376 KB
testcase_21 AC 19 ms
5,376 KB
testcase_22 AC 19 ms
5,376 KB
testcase_23 AC 24 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <cstdio>
#include <sstream>
#include <map>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
#include <set>
using namespace std;

template<class T>
class BinaryIndexedTree_0_indexed{
	void init(const vector<T> &A){
		for(int i=0; i<N; i++){
			add(i+1, A[i]);
		}
	}
	
public:
	vector<T> tree;
	int N;
	
	BinaryIndexedTree_0_indexed(const int n) : tree(n+1,0), N(n){
		
	}
	
	BinaryIndexedTree_0_indexed(const vector<T> &A) : tree(A.size()+1,0), N(A.size()){
		init(A);
	}

	//caution : position "i" must be 0-indexed
	void add(int i, const T x){
		i += 1;
		while(i <= N){
			tree[i] += x;
			i += i & -i;
		}
	}

	//get sums [0,i]
	T get_sum(int i){
		i += 1;
		T ret=0;
		while(i>0){
			ret += tree[i];
			i -= i & -i;
		}
		return ret;
	}

	//get sums [from,to]
	T get_sums_range(const int from, const int to){
		return get_sum(to) - get_sum(from-1);
	}

	//get at [i]
	T get_at(const int i){
		return get_sum(i) - get_sum(i-1);
	}

	void print(){
		for(int i=0; i<N; i++){
			cerr << get_at(i) << " ";
		}
		cerr << endl;
	}
};

int main(){
	int N,Q;
	cin >> N >> Q;
	vector<BinaryIndexedTree_0_indexed<long long>> BIT(2, BinaryIndexedTree_0_indexed<long long>(N*2));


	for(int t=1; t<=Q; t++){
		string x;
		int y,z;
		cin >> x >> y >> z;

		if(x=="R"){
			y += N;
			y = y - t%(2*N);
			if(y<0) y += 2*N;
			BIT[0].add(y, z);
		}else if(x=="L"){
			y += N;
			y = y + t%(2*N);
			if(y>=2*N) y -= 2*N;
			BIT[1].add(y, z);
		}else{
			z--;

			long long ans = 0;
			for(int k=0; k<2; k++){
				vector<int> L(2);
				vector<int> R(2);
				L[0] = -z + (N-1) + (k%2==0?-1:+1)*t%(2*N) ;
				R[0] = -y + (N-1) + (k%2==0?-1:+1)*t%(2*N) ;

				L[1] = +y + N + (k%2==0?-1:+1)*t%(2*N) ;
				R[1] = +z + N + (k%2==0?-1:+1)*t%(2*N) ;

				for(int i=0; i<2; i++){
					if(L[i] < 0) L[i] += 2*N;
					if(L[i] >= 2*N) L[i] -= 2*N;

					if(R[i] < 0) R[i] += 2*N;
					if(R[i] >= 2*N) R[i] -= 2*N;

					if(L[i] > R[i]){
						ans += BIT[k].get_sums_range(L[i],2*N-1);
						ans += BIT[k].get_sums_range(0,R[i]);
					}else{
						ans += BIT[k].get_sums_range(L[i],R[i]);
					}

				}

			}
			cout << ans << endl;
		}
/*
		for(int i=0; i<2; i++){
			BIT[i].print();
		}
*/
	}
	return 0;
}
0