Alice’s mooncake shop
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iomanip>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<sstream>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
#define MAXN (100000+10)
#define MEM2(a,i) memset(a,i,sizeof(a));
class SegmentTree
{
ll a[MAXN*4],minv[MAXN*4],sumv[MAXN*4],maxv[MAXN*4],addv[MAXN*4],setv[MAXN*4];
int n;
public:
SegmentTree(){MEM(a) MEM(minv) MEM(sumv) MEM(maxv) MEM(addv) MEM2(setv,-1) }
SegmentTree(int _n):n(_n){MEM(a) MEM(minv) MEM(sumv) MEM(maxv) MEM(addv) MEM2(setv,-1) }
void mem(int _n)
{
n=_n;
MEM(a) MEM(minv) MEM(sumv) MEM(maxv) MEM(addv) MEM2(setv,-1)
}
void maintain(int o,int L,int R)
{
sumv[o]=maxv[o]=minv[o]=0;
if (L<R)
{
sumv[o]=sumv[Lson]+sumv[Rson];
minv[o]=min(minv[Lson],minv[Rson]);
maxv[o]=max(maxv[Lson],maxv[Rson]);
}
if (setv[o]>=0) sumv[o]=setv[o]*(R-L+1),minv[o]=maxv[o]=setv[o];
minv[o]+=addv[o];maxv[o]+=addv[o];sumv[o]+=addv[o]*(R-L+1);
}
int y1,y2,v;
void update(int o,int L,int R)
{
if (y1<=L&&R<=y2) {
addv[o]+=v;
}
else{
pushdown(o);
int M=(R+L)>>1;
if (y1<=M) update(Lson,L,M); else maintain(Lson,L,M);
if (M< y2) update(Rson,M+1,R); else maintain(Rson,M+1,R);
}
maintain(o,L,R);
}
void update2(int o,int L,int R)
{
if (y1<=L&&R<=y2) {
setv[o]=v;addv[o]=0;
}
else{
pushdown(o);
int M=(R+L)>>1;
if (y1<=M) update2(Lson,L,M); else maintain(Lson,L,M);
if (M< y2) update2(Rson,M+1,R); else maintain(Rson,M+1,R);
}
maintain(o,L,R);
}
void pushdown(int o)
{
if (setv[o]>=0)
{
setv[Lson]=setv[Rson]=setv[o];
addv[Lson]=addv[Rson]=0;
setv[o]=-1;
}
if (addv[o])
{
addv[Lson]+=addv[o];
addv[Rson]+=addv[o];
addv[o]=0;
}
}
ll _min,_max,_sum;
void query2(int o,int L,int R,ll add)
{
if (setv[o]>=0)
{
_sum+=(setv[o]+addv[o]+add)*(min(R,y2)-max(L,y1)+1);
_min=min(_min,setv[o]+addv[o]+add);
_max=max(_max,setv[o]+addv[o]+add);
} else if (y1<=L&&R<=y2)
{
_sum+=sumv[o]+add*(R-L+1);
_min=min(_min,minv[o]+add);
_max=max(_max,maxv[o]+add);
} else {
int M=(L+R)>>1;
if (y1<=M) query2(Lson,L,M,add+addv[o]);
if (M< y2) query2(Rson,M+1,R,add+addv[o]);
}
}
void query(int o,int L,int R,ll add)
{
if (y1<=L&&R<=y2)
{
_sum+=sumv[o]+add*(R-L+1);
_min=min(_min,minv[o]+add);
_max=max(_max,maxv[o]+add);
}
else{
int M=(R+L)>>1;
if (y1<=M) query(Lson,L,M,add+addv[o]);
if (M< y2) query(Rson,M+1,R,add+addv[o]);
}
}
void add(int l,int r,ll v)
{
y1=l,y2=r;this->v=v;
update(1,1,n);
}
void set(int l,int r,ll v)
{
y1=l,y2=r;this->v=v;
update2(1,1,n);
}
ll ask(int l,int r,int b=0)
{
_sum=0,_min=INF,_max=-1;
y1=l,y2=r;
query2(1,1,n,0);
switch(b)
{
case 1:return _sum;
case 2:return _min;
case 3:return _max;
default:break;
}
}
void print()
{
For(i,n)
cout<<ask(i,i,1)<<' ';
cout<<endl;
}
}S;
char h[13][10]={"","Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov" , "Dec"};
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_r(int y)
{
if ((y%4==0&&y%100!=0)||y%400==0) return 1;
return 0;
}
ll get_t() {
char s[10];
int d,y,m;
scanf("%s%d%d",s,&d,&y);
For(i,12) if (strcmp(s,h[i])==0) m=i;
ll tot=0;
Fork(i,2000,y-1) tot+=is_r(i)+365;
For(i,m-1) tot+=mon[i];
if (is_r(y)&&m>2) tot++;
tot+=d;
tot=(tot-1)*24+read()+1;
return tot;
}
#define MAXM (210000+10)
ll c[MAXM];
ll q[MAXM],r[MAXM];
int main()
{
int n,m;
while(cin>>n>>m&&n&&m) {
ll maxt=0;
For(i,n) {
q[i]=get_t();
maxt=max(maxt,q[i]);
scanf("%I64d",&r[i]);
}
int t=read(); ll s=read();
S.mem(m);
For(i,m) {
S.add(i,i,read());
if (i>1) S.add(max(1,i-t),i-1,s);
c[i]=S.ask(max(1,i-t),i,2);
}
Fork(i,m+1,maxt) {
if (i>1) S.add(max(1,i-t),m,s);
c[i]=S.ask(max(1,i-t),m,2);
}
ll ans=0;
For(i,n) {
ans+=c[(int)q[i]]*r[i];
}
cout<<ans<<endl;
}
return 0;
}
My World Cup
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iomanip>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<sstream>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
double shoot[20];
void prework() {
shoot[0]=0;
shoot[1]=2.0/3.;
Fork(i,2,15) shoot[i]=shoot[i-1]*2/3;
For(i,15) shoot[i]=1-shoot[i];
}
typedef vector<pair<double,int> > vpdi;
void shoot_k(int k,vpdi & pro) {
if (k==0) pro.pb(mp(1,0));
else {pro.pb(mp(shoot[k],1)); pro.pb(mp(1-shoot[k],0));}
}
struct card{
int t,s,p,pl;
card(int _t,int _s,int _p,int _pl):t(_t),s(_s),p(_p),pl(_pl){}
card(){}
friend bool operator<(card a,card b) {
if (a.s^b.s) return a.s<b.s;
return a.pl<b.pl;
}
inline friend void bet(card a,card b,vpdi & pro) {
if (a.t==0) {
if (b.t==3) {
pro.pb(mp(1,0));
} else {
if (b.t==1) {
a.p=max(a.p-b.p,0);
}
shoot_k(a.p,pro);
}
}
if (a.t==1) {
if (b.t==2) {
a.p=max(a.p-b.p,0);
shoot_k(a.p,pro);
}
else pro.pb(mp(1,0));
}
if (a.t==2) {
if (b.t==3) {
pro.pb(mp(1,0));
} else if (b.t==1) pro.pb(mp(1,max(a.p-b.p,0)));
else pro.pb(mp(1,a.p));
}
if (a.t==3) {
double p=1.0/3.0*shoot[3];
pro.pb(mp(p,-1));
pro.pb(mp(1-p,0));
}
}
}a[11];
double calc_2_card(card c,card d) {
vpdi pro1,pro2;
bet(c,d,pro1);
bet(d,c,pro2);
double now=0;
Rep(k,SI(pro1)) Rep(l,SI(pro2)) {
double p=pro1[k].fi*pro2[l].fi;
if (pro1[k].se>pro2[l].se) now+=p;
else if (pro1[k].se==pro2[l].se) now+=p*0.5;
}
return now;
}
card c,d;
double rul;
typedef vector<card> vc;
struct State {
card a[5],b[5];
int sz;
int sca,scb;
void mem() {
sz=4; sca=scb=0;
}
State child(int i,int j,int k,int l) {
State s;
memcpy(&s,this,sizeof(s));
swap(s.a[i],s.a[sz-1]);
swap(s.b[j],s.b[sz-1]);
s.sca+=k;
s.scb+=l;
s.sz--;
return s;
}
double dfs() {
if (sz>0) {
int p1=0,p2=0;
Rep(i,sz) {
if (a[p1]<a[i]) p1=i;
if (b[p2]<b[i]) p2=i;
}
double mi=INF,ma=-INF;
if (a[p1]<b[p2]) {
Rep(i,sz) {
Rep(j,sz) if (b[p2].s==b[j].s) {
vpdi pro1,pro2;
bet(a[i],b[j],pro1);
bet(b[j],a[i],pro2);
double now=0;
Rep(k,SI(pro1)) Rep(l,SI(pro2)) {
double p=pro1[k].fi*pro2[l].fi;
State st2=child(i,j,pro1[k].se,pro2[l].se);
now+=p*st2.dfs();
}
mi=min (mi,now);
ma=max (ma,now);
}
}
return mi;
}
else {
Rep(i,sz) {
Rep(j,sz) if (a[p1].s==a[i].s) {
vpdi pro1,pro2;
bet(a[i],b[j],pro1);
bet(b[j],a[i],pro2);
double now=0;
Rep(k,SI(pro1)) Rep(l,SI(pro2)) {
pair<double ,int> now1=pro1[k],now2=pro2[l];
double p=pro1[k].fi*pro2[l].fi;
State st2=child(i,j,pro1[k].se,pro2[l].se);
now+=p*st2.dfs();
}
mi=min (mi,now);
ma=max (ma,now);
}
}
return ma;
}
}
if (sz==0) {
if(sca!=scb) return (sca>scb)?1:0;
return rul;
}
}
}S;
int main()
{
int T=read();
prework();
while(T--) {
S.mem();
int ta=0,tb=0;
For(i,10) {
int pl=(i<=5);
int t=read(),s=read(),p=read();
t=(t+3)%4;
a[i]=card(t,s,p,pl);
if (i==5) c=a[i];
else if (i==10) d=a[i];
else if (pl==1) S.a[ta++]=a[i];
else S.b[tb++]=a[i];
}
rul=calc_2_card(c,d);
printf("%.0lf\n",S.dfs()*100);
}
return 0;
}