T1:Project LeaF
Problem:
- 0 x wa wb,表示将原来的概率px修改为wa / wb;
- 1 l r,表示询问在这首曲子的l到r的音符组成的片段内,YLCH 的期望得分。
Solution:
BasicScore = A * ∑(i=l~r) pi
设Ei为combo(i)的期望:ComboScore = B * ∑(i=l~r) pi * (Ei-1 +1)
原因是,显然Si =1 才能得到combo(i),故combo(i)显然就是i-1的期望+1。
考虑如何得到Ei显然可以递推,通过Ei-1转移得到,考虑当前是否为1,有:Ei =pi * (Ei-1 +1)+(1-pi )* Ei-1 * t
Code:
1 #include<bits/stdc++.h> 2 #define re register 3 #define rint re int 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int> P; 7 #define rll re ll 8 #define rqwq re qwq 9 template<class T> 10 void Swap(T &x,T &y){ 11 T z=x; 12 x=y; 13 y=z; 14 } 15 #define PairOP 16 #ifdef PairOP 17 template<class T1,class T2> 18 inline const pair<T1,T2> operator + (const pair<T1,T2> &p1,const pair<T1,T2> &p2){ 19 return pair<T1,T2>(p1.first+p2.first,p1.second+p2.second); 20 } 21 template<class T1,class T2> 22 inline const pair<T1,T2> operator - (const pair<T1,T2> &p1,const pair<T1,T2> &p2){ 23 return pair<T1,T2>(p1.first-p2.first,p1.second-p2.second); 24 } 25 #endif 26 #ifdef FastIO 27 char buf[1<<21],*p1,*p2; 28 #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 29 #endif 30 template<class T> 31 T Read(){ 32 T x=0,f=1; 33 char ch=getchar(); 34 while(ch<'0'||ch>'9'){ 35 if(ch=='-') 36 f=-1; 37 ch=getchar(); 38 } 39 while(ch>='0'&&ch<='9'){ 40 x=(x<<1)+(x<<3)+(ch^'0'); 41 ch=getchar(); 42 } 43 return x*f; 44 } 45 ll (*readll)()=Read<ll>; 46 #define read Read<int> 47 #define int long long 48 const int N=5e5+5,mod=1e8+7; 49 int n,m,op,l,r,A,B,T,ta,tb,x,y,a[N]; 50 inline int ksm(rint a,rint b){ 51 rint res=1; 52 while(b){ 53 if(b&1) res=res*a%mod; 54 a=a*a%mod,b>>=1; 55 } 56 return res; 57 } 58 class SegmentTree{ 59 private: 60 class Node{ 61 public: 62 int sump,k,b,sumb,sumk; 63 }t[N<<2]; 64 #define mid (l+((r-l)>>1)) 65 #define ls (p<<1) 66 #define rs (p<<1|1) 67 inline void Pushup(rint p){ 68 t[p].sump=(t[ls].sump+t[rs].sump)%mod; 69 t[p].k=(t[ls].k*t[rs].k)%mod; 70 t[p].b=(t[rs].k*t[ls].b%mod+t[rs].b)%mod; 71 t[p].sumk=(t[rs].sumk*t[ls].k%mod+t[ls].sumk)%mod; 72 t[p].sumb=(t[rs].sumk*t[ls].b%mod+t[ls].sumb+t[rs].sumb)%mod; 73 } 74 public: 75 inline void Build(rint p,rint l,rint r){ 76 if(l==r) return t[p].sump=t[p].b=t[p].sumk=t[p].sumb=a[l],t[p].k=(a[l]+T+mod-a[l]*T%mod)%mod,void(); 77 Build(ls,l,mid),Build(rs,mid+1,r),Pushup(p); 78 } 79 inline void Change(rint p,rint l,rint r,rint pos,rint k){ 80 if(l>pos||r<pos) return ; 81 if(l==r) return t[p].sump=t[p].b=t[p].sumk=t[p].sumb=k,t[p].k=(k+T+mod-k*T%mod)%mod,void(); 82 Change(ls,l,mid,pos,k),Change(rs,mid+1,r,pos,k),Pushup(p); 83 } 84 inline P Ask(rint p,rint l,rint r,rint x,rint y){ 85 if(l>y||r<x) return P(0,0); 86 if(l>=x&&r<=y) return P(t[p].sump,t[p].sumb); 87 P res=Ask(ls,l,mid,x,y)+Ask(rs,mid+1,r,x,y); 88 return Pushup(p),res; 89 } 90 }t; 91 inline int True(){ 92 #ifdef Clock 93 rint STR=clock(); 94 #endif 95 read(),n=read(),m=read(),ta=read(),tb=read(),A=read(),B=read(),T=ta*ksm(tb,mod-2)%mod; 96 for(rint i=1,x,y;i<=n;++i) x=read(),y=read(),a[i]=x*ksm(y,mod-2)%mod; 97 t.Build(1,1,n); 98 for(rint i=1;i<=m;++i){ 99 rint op=read(); 100 if(!op){ 101 rint pos=read(),x=read(),y=read(),k=x*ksm(y,mod-2)%mod; 102 t.Change(1,1,n,pos,k); 103 } 104 else{ 105 rint x=read(),y=read();P res=t.Ask(1,1,n,x,y); 106 printf("%lld\n",(A*res.first%mod+B*res.second%mod)%mod); 107 } 108 } 109 #ifdef Clock 110 rint END=clock(); 111 printf("Time:%dms\n",int((END-STR)/(qwq)CLOCKS_PER_SEC*1000)); 112 printf("Time:%ds\n",int((END-STR)/(qwq)CLOCKS_PER_SEC)); 113 #endif 114 return (0-0); 115 } 116 int Love=True(); 117 signed main(){;}
T2:JOJOI Tower
Problem:
Solution:
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s; 4 int n; 5 inline bool check(int x){ 6 int cnt=0,tot=0,ans=0; 7 for(int i=n-1;i>=0;i--){ 8 if(s[i]=='I'){ 9 if(cnt+tot+ans>=x){ 10 if(tot>0){ 11 tot--; 12 ans++; 13 } 14 } 15 else cnt++; 16 } 17 if(s[i]=='O'){ 18 if(cnt>0){ 19 cnt--; 20 tot++; 21 } 22 } 23 if(s[i]=='J'){ 24 if(tot>0){ 25 tot--; 26 ans++; 27 } 28 } 29 } 30 if(ans>=x) return 1; 31 return 0; 32 } 33 int main(){ 34 cin>>n>>s; 35 int l=0,r=n/3,ans; 36 while(l<=r){ 37 int mid=(l+r)>>1; 38 if(check(mid)){ 39 ans=mid; 40 l=mid+1; 41 } 42 else r=mid-1; 43 } 44 cout<<ans; 45 return 0; 46 }
T3:炉心融解
Problem:
Solution:
Code:
1 #include<bits/stdc++.h> 2 #define awa 2147483647 3 #define re register 4 #define rint re int 5 using namespace std; 6 typedef long long ll; 7 typedef double qwq; 8 #define rll re ll 9 #define rqwq re qwq 10 template<class T> 11 void Swap(T &x,T &y){ 12 T z=x; 13 x=y; 14 y=z; 15 } 16 #ifdef PairOP 17 template<class T1,class T2> 18 inline const pair<T1,T2> operator + (const pair<T1,T2> &p1,const pair<T1,T2> &p2){ 19 return pair<T1,T2>(p1.first+p2.first,p1.second+p2.second); 20 } 21 template<class T1,class T2> 22 inline const pair<T1,T2> operator - (const pair<T1,T2> &p1,const pair<T1,T2> &p2){ 23 return pair<T1,T2>(p1.first-p2.first,p1.second-p2.second); 24 } 25 #endif 26 #ifdef FastIO 27 char buf[1<<21],*p1,*p2; 28 #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 29 #endif 30 template<class T> 31 T Read(){ 32 T x=0,f=1; 33 char ch=getchar(); 34 while(ch<'0'||ch>'9'){ 35 if(ch=='-') 36 f=-1; 37 ch=getchar(); 38 } 39 while(ch>='0'&&ch<='9'){ 40 x=(x<<1)+(x<<3)+(ch^'0'); 41 ch=getchar(); 42 } 43 return x*f; 44 } 45 ll (*readll)()=Read<ll>; 46 #define read Read<int> 47 const int N=1e5+5; 48 int n,type,f[260][260],g[260][260],S=255,op; 49 inline int GetOp(){ 50 char ch=getchar(); 51 while(ch<'a'||ch>'z') ch=getchar(); 52 return ch=='a'?1:ch=='o'?2:3; 53 } 54 inline int F(rint x,rint y){ 55 return op==1?x&y:op==2?x|y:x^y; 56 } 57 inline int True(){ 58 #ifdef Clock 59 rint STR=clock(); 60 #endif 61 n=read(),op=GetOp(),type=read(),memset(f,0xcf,sizeof(f)); 62 for(rint k=1,now,x,y,maxx,cnt;k<=n;++k){ 63 x=read(),y=x&S,x>>=8,maxx=-awa,cnt=0; 64 for(rint i=0;i<=S;++i){ 65 now=f[x][i]+F(i,y); 66 if(now>maxx) maxx=now,cnt=0; 67 if(now==maxx) cnt+=g[x][i]; 68 } 69 for(rint i=0;i<=S;++i){ 70 now=F(i,x)<<8; 71 if(f[i][y]<now) f[i][y]=now,g[i][y]=0; 72 if(f[i][y]==now) g[i][y]++; 73 } 74 if(k>1) type?printf("%d %d\n",maxx,cnt):printf("%d\n",maxx); 75 } 76 #ifdef Clock 77 rint END=clock(); 78 printf("Time:%dms\n",int((END-STR)/(qwq)CLOCKS_PER_SEC*1000)); 79 printf("Time:%ds\n",int((END-STR)/(qwq)CLOCKS_PER_SEC)); 80 #endif 81 return (0-0); 82 } 83 int Love=True(); 84 signed main(){;}
T4:马赛克卷
Problem:
Solution:
Code:
1 #include<bits/stdc++.h> 2 #define re register 3 #define rint re int 4 using namespace std; 5 typedef long long ll; 6 typedef double qwq; 7 template<class T> 8 void Swap(T &x,T &y){ 9 T z=x; 10 x=y; 11 y=z; 12 } 13 #ifdef PairOP 14 template<class T1,class T2> 15 inline const pair<T1,T2> operator + (const pair<T1,T2> &p1,const pair<T1,T2> &p2){ 16 return pair<T1,T2>(p1.first+p2.first,p1.second+p2.second); 17 } 18 template<class T1,class T2> 19 inline const pair<T1,T2> operator - (const pair<T1,T2> &p1,const pair<T1,T2> &p2){ 20 return pair<T1,T2>(p1.first-p2.first,p1.second-p2.second); 21 } 22 #endif 23 #ifdef FastIO 24 char buf[1<<21],*p1,*p2; 25 #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 26 #endif 27 template<class T> 28 T Read(){ 29 T x=0,f=1; 30 char ch=getchar(); 31 while(ch<'0'||ch>'9'){ 32 if(ch=='-') 33 f=-1; 34 ch=getchar(); 35 } 36 while(ch>='0'&&ch<='9'){ 37 x=(x<<1)+(x<<3)+(ch^'0'); 38 ch=getchar(); 39 } 40 return x*f; 41 } 42 ll (*readll)()=Read<ll>; 43 #define read Read<int> 44 const int N=3e6+5; 45 int n,head[N],nxt[N<<1],ver[N<<1],tot; 46 int dfn[N],low[N],stk[N],top,scc[N],num,cnt; 47 bool ins[N]; 48 inline void add (rint x,rint y){ 49 ver[++tot]=y,nxt[tot]=head[x],head[x]=tot,x^=1,y^=1; 50 ver[++tot]=x,nxt[tot]=head[y],head[y]=tot; 51 } 52 class Trie{ 53 private: 54 int tr[N][2],sz,now; 55 vector<int> p[N]; 56 inline void dfs(rint x,rint pre){ 57 for(rint y:p[x]){ 58 now+=2,add(now,y); 59 if(pre) add(now,pre),add(y^1,pre); 60 pre=now; 61 } 62 (tr[x][0])&&(dfs(tr[x][0],pre),1),(tr[x][1])&&(dfs(tr[x][1],pre),1); 63 } 64 public: 65 inline void Init(){sz=0;} 66 inline void Insert(int id,char *s){ 67 rint x=0; 68 for(rint i=0;s[i];i++){ 69 if(!tr[x][s[i]-'0']) tr[x][s[i]-'0']=++sz; 70 x=tr[x][s[i]-'0']; 71 } 72 p[x].push_back(id); 73 } 74 inline int Work(){ 75 now=(n-1)<<1,dfs(0,0); 76 return now+1; 77 } 78 }t; 79 inline void tarjan(rint x){ 80 dfn[x]=low[x]=++num,stk[++top]=x,ins[x]=1; 81 for(rint i=head[x];i;i=nxt[i]){ 82 rint y=ver[i]; 83 if(!dfn[y]) tarjan(y),low[x]=min(low[x],low[y]); 84 else if(ins[y]) low[x]=min(low[x],dfn[y]); 85 } 86 if(low[x]==dfn[x]){ 87 rint y; 88 cnt++; 89 do y=stk[top--],ins[y]=0,scc[y]=cnt; while(y^x); 90 } 91 } 92 char s[N]; 93 inline int True(){ 94 #ifdef Clock 95 rint STR=clock(); 96 #endif 97 n=read(),t.Init(); 98 for(rint i=0,p;i<n;++i){ 99 scanf("%s",s),p=-1; 100 for(rint j=0;s[j];++j) if(s[j]=='?') <%p=j;break;%> 101 if(~p) s[p]='0',t.Insert(i<<1,s),s[p]='1',t.Insert(i<<1|1,s); 102 else t.Insert(i<<1,s),t.Insert(i<<1|1,s); 103 } 104 rint lim=t.Work(); 105 for(rint i=0;i<=lim;++i) if(!dfn[i]) tarjan(i); 106 for(rint i=0;i<(n<<1);i+=2) if(scc[i]==scc[i^1]) return !puts("Mosaic Roll!!"); 107 puts("DECO*27 love hotpot!!"); 108 #ifdef Clock 109 rint END=clock(); 110 printf("Time:%dms\n",int((END-STR)/(qwq)CLOCKS_PER_SEC*1000)); 111 printf("Time:%ds\n",int((END-STR)/(qwq)CLOCKS_PER_SEC)); 112 #endif 113 return (0-0); 114 } 115 int Love=True(); 116 signed main(){;}