loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划

loj2734

洛谷P3615

http://218.5.5.242:9021/problem/185

不会做...

题解(来自ditoly):

这一步更详细的解释(来自kkksc03):

还是从后面推。我们把女性设为+1,男性设为-1,然后从队伍末尾开始开始计算后缀和。一但后缀和到了-2,就说明到了两个男的商量谁去女厕的地步。所以说只要保证后缀和一直大于等于-1,那么这个就一定可以在N分钟内解决(请读者自行证明,利用数学归纳法)

F>=M-1,M<=F+1
S=F+M>=2M-1
<=2F+1

F>=(S-1)/2


S:F>=[S/2]


小串长度L,复读次数X
F在小串中的位置:A[1..6]从小到大
之前有a名女性,b个位置
第1遍
a+1,b+L-A[6]+1,2a+2,2a+2-(b+L-A[6]+1)
a+2,b+L-A[5]+1,2a+4,2a+4-(b+L-A[5]+1)
...
a+6,b+L-A[1]+1,2a+12
第k遍复读
a+6k-5,b+Lk-A[6]+1,2a+12k-10,2a+12k-10-(b+Lk-A[6]+1)

2a-10-b+A[6]-1+(12-L)k
12=2a
2a-L>0 -->

2(a+F)-(b+Lk-pos+1)


a+N(k-1)+F,b+Lk-pos,2a+2N(k-1)+2F,
(2N-L)k+2a-2N+2F-b+pos

a+N(k-1)+F,b+Lk-pos,2a+2N(k-1)+2F,
2a+(2N-L)k-2N+2F-b+j

a=0,b=2
k,k+2,k-2

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 ll n,m;
13 char dattt[400011],*st=dattt,*s[200011];
14 ll len[200011],x[200011],anss;
15 int main()
16 {
17     ll i,j,a=0,b=0,N,F,tt;
18     scanf("%lld",&n);
19     scanf("%lld",&m);
20     for(i=1;i<=m;++i)
21     {
22         s[i]=st;
23         scanf("%s%lld",st,x+i);
24         len[i]=strlen(st);
25         st+=len[i]+1;
26     }
27     tt=0;
28     for(i=1;i<=m;++i)
29     {
30         F=0;
31         for(j=0;j<len[i];++j)
32             F+=s[i][j]=='F';
33         tt+=F*x[i];
34     }
35     if(tt<n)
36     {
37         puts("-1");
38         return 0;
39     }
40     for(i=m;i>=1;--i)
41     {
42         F=0;N=0;
43         for(j=len[i]-1;j>=0;--j)
44             N+=s[i][j]=='F';
45         if(2*N-len[i]<0)
46         {
47             for(j=len[i]-1;j>=0;--j)
48             {
49                 if(s[i][j]=='F')
50                 {
51                     ++F;
52                     anss=max(anss,-((2*N-len[i])*x[i]+2*a-2*N+2*F-b+j));
53                 }
54             }
55         }
56         else
57         {
58             for(j=len[i]-1;j>=0;--j)
59             {
60                 if(s[i][j]=='F')
61                 {
62                     ++F;
63                     anss=max(anss,-(-len[i]+2*a+2*F-b+j));
64                 }
65             }
66         }
67         a+=F*x[i];
68         b+=len[i]*x[i];
69     }
70     printf("%lld",anss);
71     return 0;
72 }
View Code

 

posted @ 2019-02-21 21:34  hehe_54321  阅读(575)  评论(0编辑  收藏  举报
AmazingCounters.com