結果
問題 | No.619 CardShuffle |
ユーザー |
![]() |
提出日時 | 2018-01-08 01:24:22 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 125 ms / 3,000 ms |
コード長 | 3,900 bytes |
コンパイル時間 | 2,827 ms |
コンパイル使用メモリ | 213,320 KB |
最終ジャッジ日時 | 2025-01-05 07:12:05 |
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 35 |
コンパイルメッセージ
main.cpp:113:1: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type] 113 | main(){ | ^~~~
ソースコード
#include <bits/stdc++.h>#define FOR(i,a,b) for (int i=(a);i<(b);i++)#define FORR(i,a,b) for (int i=(a);i>=(b);i--)#define pb push_back#define pcnt __builtin_popcount#define show(x) cout<<#x<<" = "<<x<<endl;#define maxs(x,y) x = max(x,y)#define mins(x,y) x = min(x,y)#define fi first#define se second#define rng(a) (a.begin()),(a.end())#define each(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)#define sz(x) (int)(x).size()#define mp make_pairusing namespace std;typedef long long ll;typedef pair<int,int> pii;typedef vector<int> vi;typedef vector<vi> vvi;typedef vector<pii> vpii;typedef set<int> si;typedef pair<ll,ll> pll;typedef vector<ll> vl;typedef vector<vl> vvl;typedef vector<pll> vpll;typedef set<ll> sl;typedef __int128_t lll;typedef pair<lll,lll> plll;typedef vector<lll> vlll;template<typename T>string join(vector<T>&v){stringstream s;FOR(i,0,sz(v))s<<' '<<v[i];return s.str().substr(1);}ll gcd(ll a,ll b){if(a>b)swap(a,b);for(;a>0;b%=a,swap(a,b));return b;}int modpow(ll a,ll n,int m){if(a==0)return a;ll p=1;for(;n>0;n/=2,a=a*a%m)if(n&1)p=p*a%m;return(int)p;}void dout(double d){printf("%.12f\n",d);}const int iinf = 1e9;const ll linf = 1e18;const int mod = 1e9+7;const double pi = acos(-1);const double eps = 1e-10;typedef pair<ll, pll> tll;struct SegTree{tll e = tll(-1, mp(-1, -1));int n;vector<tll> d;vi id, idi;vector<bool> bl;tll merge(tll a, tll b, int c){tll ret;if(a.se.fi == -1){ret = b;}else if(b.se.fi == -1){ret = a;}else if(a.fi == -1){if(b.fi == -1){ret = (bl[id[c]] ? tll(-1, pll(a.se.fi * b.se.fi % mod, -1)) : tll(a.se.fi, pll(0, b.se.fi)));}else{ret = (bl[id[c]] ? mp(a.se.fi * b.fi % mod, b.se) : mp(a.se.fi, mp((b.fi + b.se.fi) % mod, b.se.se)));}}else{if(b.fi == -1){ret = (bl[id[c]] ? mp(a.fi, mp(a.se.fi, a.se.se * b.se.fi % mod)) : mp(a.fi, mp((a.se.fi + a.se.se) % mod, b.se.fi)));}else{ret = (bl[id[c]] ? mp(a.fi, mp((a.se.fi + a.se.se * b.fi + b.se.fi) % mod, b.se.se)) : mp(a.fi, mp((a.se.fi + a.se.se + b.fi + b.se.fi) % mod, b.se.se)));}}return ret;}void init(vl&v, vector<bool>&vb){n=1<<(32-__builtin_clz(sz(v)-1));d.resize(2*n-1);id.resize(2*n-1);idi.resize(2*n-1);bl.resize(2*n-1);fill(rng(d), e);FOR(j,0,sz(v)) d[j+n-1]=tll(-1, pll(v[j], -1));FOR(j,0,n) id[j+n-1]=j;FOR(j,0,sz(vb)) bl[j]=vb[j];FORR(k, n-2, 0){id[k] = (id[k*2+1] + id[k*2+2]) / 2;idi[id[k]] = k;d[k] = merge(d[k*2+1], d[k*2+2], k);}}void update_ope(int k){k = idi[k];while(true){d[k] = merge(d[k*2+1], d[k*2+2], k);if(k <= 0) break;k=(k-1)/2;}}void update_num(int k){while(k > 0){k = (k-1)/2;d[k] = merge(d[k*2+1], d[k*2+2], k);}}tll q(int a,int b,int k,int l,int r){return (r<=a||b<=l)?e:(a<=l&&r<=b)?d[k]:merge(q(a,b,k*2+1,l,(l+r)/2),q(a,b,k*2+2,(l+r)/2,r), k);}tll query(int a,int b){return q(a,b,0,0,n);}};int n, q, x, y;char c;vl v;vector<bool> b;tll r;main(){cin.tie(0);ios::sync_with_stdio(false);cin >> n;SegTree seg;FOR(i, 0, n){cin >> c;if(i%2){b.pb(c=='*');}else{v.pb(c-'0');}}seg.init(v, b);cin >> q;FOR(j, 0, q){cin >> c >> x >> y;if(c == '!'){if(x%2){x/= 2; y/=2;x += seg.n-1;y += seg.n-1;swap(seg.d[x], seg.d[y]);seg.update_num(x);seg.update_num(y);}else{x--; y--;x/= 2; y/=2;swap(seg.bl[x], seg.bl[y]);seg.update_ope(x);seg.update_ope(y);}}else{r = seg.query(x/2, y/2+1);cout << (r.fi < 0 ? (r.se.fi) : (r.fi+r.se.fi+r.se.se)%mod) << "\n";}}return 0;}