結果
問題 | No.619 CardShuffle |
ユーザー | chocorusk |
提出日時 | 2019-01-21 17:17:54 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,139 bytes |
コンパイル時間 | 1,047 ms |
コンパイル使用メモリ | 107,004 KB |
実行使用メモリ | 9,472 KB |
最終ジャッジ日時 | 2024-09-15 13:12:59 |
合計ジャッジ時間 | 7,022 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 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 | WA | - |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 1 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | WA | - |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 246 ms
8,320 KB |
testcase_17 | AC | 250 ms
9,344 KB |
testcase_18 | AC | 247 ms
8,172 KB |
testcase_19 | AC | 250 ms
9,472 KB |
testcase_20 | AC | 173 ms
5,632 KB |
testcase_21 | AC | 185 ms
8,320 KB |
testcase_22 | AC | 167 ms
9,472 KB |
testcase_23 | AC | 183 ms
8,320 KB |
testcase_24 | AC | 169 ms
9,344 KB |
testcase_25 | AC | 113 ms
5,632 KB |
testcase_26 | WA | - |
testcase_27 | AC | 322 ms
9,344 KB |
testcase_28 | WA | - |
testcase_29 | AC | 315 ms
9,432 KB |
testcase_30 | AC | 226 ms
5,504 KB |
testcase_31 | AC | 2 ms
5,376 KB |
testcase_32 | AC | 170 ms
5,632 KB |
testcase_33 | AC | 244 ms
8,320 KB |
testcase_34 | AC | 249 ms
8,256 KB |
testcase_35 | WA | - |
ソースコード
#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <cmath> #include <bitset> #include <vector> #include <map> #include <set> #include <queue> #include <deque> #include <algorithm> #include <complex> #include <unordered_map> #include <unordered_set> #include <random> #include <cassert> using namespace std; typedef long long int ll; typedef pair<int, int> P; const int MAX_N=1<<17; const ll MOD=1e9+7; int n; char c[100001]; set<int> ind; int m; ll prod[2*MAX_N]; void init(int m_){ m=1; while(m<m_) m<<=1; for(int i=m; i<=2*m-1; i++){ prod[i]=1; } for(int i=m+1; i<m+m_; i+=2){ prod[i]=(c[i-m]-'0'); } for(int i=m-1; i>=1; i--){ prod[i]=prod[2*i]*prod[2*i+1]%MOD; } } void update(int k, ll a){ k+=m; prod[k]=a; while(k>1){ k>>=1; prod[k]=prod[2*k]*prod[2*k+1]%MOD; } } ll query(int a, int b){ a+=m, b+=m; ll ans=1; for(;a<b; a>>=1, b>>=1){ if(b&1) ans=ans*prod[--b]%MOD; if(a&1) ans=ans*prod[a++]%MOD; } return ans; } ll bit[100001]; ll sump[100001]; ll sum(int i){ ll s=0; while(i>0){ s+=bit[i]; s%=MOD; i-=(i&(-i)); } return s; } void add(int i, ll x){ while(i<=n){ bit[i]+=x; bit[i]%=MOD; i+=(i&(-i)); } } int main() { cin>>n; for(int i=1; i<=n; i++){ cin>>c[i]; if(c[i]=='+') ind.insert(i); } init(n+1); int l=1; for(int i=2; i<=n; i+=2){ if(c[i]=='+'){ sump[l]=query(l, i); add(l, sump[l]); l=i+1; } } sump[l]=query(l, n+1); int q; cin>>q; for(int i=0; i<q; i++){ char t; int x, y; cin>>t>>x>>y; if(t=='!'){ if(x&1){ ll xc=prod[x+m], yc=prod[y+m]; update(x, yc); update(y, xc); auto itr=ind.lower_bound(x); int l, r; if(itr==ind.end()) r=n+1; else r=*itr; if(ind.empty() || itr==ind.begin()) l=1; else{ itr--; l=(*itr)+1; } ll s1=query(l, r); add(l, (s1-sump[l]+MOD)%MOD); sump[l]=s1; itr=ind.lower_bound(y); if(itr==ind.end()) r=n+1; else r=*itr; if(ind.empty() || itr==ind.begin()) l=1; else{ itr--; l=(*itr)+1; } s1=query(l, r); add(l, (s1-sump[l]+MOD)%MOD); sump[l]=s1; }else{ if(c[x]==c[y]) continue; if(c[x]=='+') swap(x, y); c[x]='+'; auto itr=ind.lower_bound(x); int l, r; if(itr==ind.end()) r=n+1; else r=*itr; if(ind.empty() || itr==ind.begin()) l=1; else{ itr--; l=(*itr)+1; } ll s1=query(l, x); add(l, (s1-sump[l]+MOD)%MOD); sump[l]=s1; s1=query(x, r); add(x+1, (s1-sump[x+1]+MOD)%MOD); sump[x+1]=s1; ind.insert(x); c[y]='*'; itr=ind.lower_bound(y); itr++; if(itr==ind.end()) r=n+1; else r=*itr; itr--; if(itr==ind.begin()) l=1; else{ itr--; l=(*itr)+1; } add(y+1, (MOD-sump[y+1])%MOD); sump[y+1]=0; s1=query(l, r); add(l, (s1-sump[l]+MOD)%MOD); sump[l]=s1; ind.erase(y); } }else{ auto itr1=ind.lower_bound(x), itr2=ind.lower_bound(y); if(itr1==itr2){ cout<<query(x, y+1)<<endl; continue; } itr2--; int r=*itr2, l=*itr1; ll ans=(query(r, y+1)+query(x, l)+sum(r)-sum(l)+MOD)%MOD;; cout<<ans<<endl; } } return 0; }