2019 Multi-University Training Contest 7
Final Exam

题意:一共有n道题,需要做对k道题,每个题有一个分数,要想做对这道题,需要准备的时间是这道题的分数加1,给出n道题的总分数m,问你做对k道题花费的最少时间,还有就是,你学了哪儿道题,出题人就会想办法阻止你,比如你学一道题1分钟,他会把这道题目的分数提高到>=1分,但是满足最后的总分数是m。

题解:他阻止我分数最小的n-k+1个,然后把剩下的k-1个变成前面n-k个里面“最大的数(相等或者加一)”(正好整除,就是前面的数加1,不整除就是前面的向下取整加一,然后把多于的平均分到前面的上面就好),然后前面的数再加1(正好整除随便分到前面任意一个数,不整除可以加到前面的没有平均分到的那个位置),这样保证前面n-k+1个的总和>m,这样总时间会更小.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k,k2,k1;
int main()
{
int _;
scanf("%d",&_);
while (_--)
{
scanf("%lld%lld%lld",&n,&m,&k);
printf("%lld\n",m+1+(m/(n-k+1)+1)*(k-1));
}
}
Kejin Player


E[i]+a[i]=E[i+1]*p[i]+E[x[i]]*(1-p[i])
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
const int maxn=500010;
ll n,q,r[maxn],s[maxn],x[maxn],a[maxn],p[maxn],f[maxn];
ll pow_mod(ll a,ll b)
{
ll res=1;
while (b)
{
if (b&1)
{
res=res*a%mod;
}
a=a*a%mod;
b>>=1;
}
return res;
}
ll inv(ll x)
{
return pow_mod(x,mod-2);
}
inline ll read()
{
ll res=0,f=1;
char ch=getchar();
while (!isdigit(ch))
{
if (ch=='-')
{
f=-f;
}
ch=getchar();
}
while (isdigit(ch))
{
res=(res<<3)+(res<<1)+ch-'0';
ch=getchar();
}
return f*res;
}
int main()
{
int _;
scanf("%d",&_);
while (_--)
{
scanf("%lld%lld",&n,&q);
for (int i=1; i<=n; i++)
{
r[i]=read();s[i]=read();x[i]=read();a[i]=read();
p[i]=r[i]*inv(s[i])%mod;
}
for (int i=2; i<=n+1; i++)
{
f[i]=(f[i-1]+a[i-1]%mod+f[x[i-1]]*(mod-(1-p[i-1]+mod))%mod)*inv(p[i-1])%mod;
}
while (q--)
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",(f[r]-f[l]+mod)%mod);
}
}
}
A + B = C


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 10,limit = 3e5 + 6;
int dis[maxn];
int solve(int c[],int lenc,int a[],int lena,int b[],int lenb)
{
for (int i=0; i<limit; i++)
{
if (c[i]!=a[i])
{
if (c[i]<a[i])
{
return -1;
}
break;
}
}
for (int i=0; i<limit; i++)
{
dis[i]=c[i]-a[i];
}
for (int i=limit-1; i; i--)
{
if (dis[i]<0)
{
dis[i-1]--;
dis[i]+=10;
}
}
int cur=0;
while (dis[cur]==0&&cur<limit)
{
cur++;
}
if (cur==limit)
{
return -1;
}
for (int i=0; i<lenb; i++)
{
if (dis[cur+i]!=b[i])
{
return -1;
}
}
for (int i=lenb; i<limit; i++)
{
if (dis[i+cur])
{
return -1;
}
}
return limit-cur-lenb;
}
int a[maxn], b[maxn], c[maxn];
char s[maxn];
int main()
{
int lena,lenb,lenc,_;
scanf("%d",&_);
while (_--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",s);
for (int i=0; s[i]; i++,lena=i)
{
a[i+1]=s[i]-'0';
}
scanf("%s",s);
for (int i=0; s[i]; i++,lenb=i)
{
b[i+1]=s[i]-'0';
}
scanf("%s",s);
for (int i=0; s[i]; i++,lenc=i)
{
c[i+1]=s[i]-'0';
}
int res;
if ((res=solve(c+1,lenc,a+1,lena,b+1,lenb))!=-1)
{
printf("%d %d %d\n",limit-lena,res,limit-lenc);
continue;
}
if ((res=solve(c+1,lenc,a,lena+1,b+1,lenb))!=-1)
{
printf("%d %d %d\n",limit-lena-1,res,limit-lenc);
continue;
}
if ((res=solve(c+1,lenc,b+1,lenb,a+1,lena))!=-1)
{
printf("%d %d %d\n",res,limit-lenb,limit-lenc);
continue;
}
if ((res=solve(c+1,lenc,b,lenb+1,a+1,lena))!=-1)
{
printf("%d %d %d\n",res,limit-lenb-1,limit-lenc);
continue;
}
printf("-1\n");
}
return 0;
}
Just Repeat




#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
unsigned long long k1, k2, mod;
int n,m;
const int maxn=1e5+5;
int a[maxn],b[maxn],p,cnt,suma,sumb;
unsigned long long rng()
{
unsigned long long k3 = k1, k4 = k2;
k1 = k4;
k3 ^= k3 << 23;
k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
return k2 + k4;
}
struct node
{
int num,a,b;
bool operator<(const node &b)const
{
return num>b.num;
}
} c[maxn];
inline int read()
{
int res=0,f=1;
char ch=getchar();
while (!isdigit(ch))
{
if (ch=='-')
{
f=-f;
}
ch=getchar();
}
while (isdigit(ch))
{
res=(res<<3)+(res<<1)+ch-'0';
ch=getchar();
}
return f*res;
}
int main()
{
int _;
scanf("%d",&_);
while (_--)
{
unordered_map <int,int> m1,m2;
suma=sumb=cnt=0;
scanf("%d%d%d",&n,&m,&p);
if (p==1)
{
for (register int i=0; i<n; ++i)
{
a[i]=read();
}
for (register int i=0; i<m; ++i)
{
b[i]=read();
}
}
else
{
scanf("%llu%llu%llu",&k1,&k2,&mod);
for (int i = 0; i < n; ++i)
a[i] = rng() % mod;
scanf("%llu%llu%llu",&k1,&k2,&mod);
for (int i = 0; i < m; ++i)
b[i] = rng() % mod;
}
for (int i=0; i<n; i++)
{
m1[a[i]]++;
}
for (int i=0; i<m; i++)
{
m2[b[i]]++;
}
for (register int i=0; i<m; ++i)
{
if (m1[b[i]]>0)
{
++cnt;
c[cnt].num=m1[b[i]]+m2[b[i]];
c[cnt].a=m1[b[i]];
c[cnt].b=m2[b[i]];
m1[b[i]]=-1;
}
else if (m1[b[i]]!=-1&&m2[b[i]]!=-1)
{
sumb+=m2[b[i]];
m2[b[i]]=-1;
}
}
for (register int i=0; i<n; i++)
{
if (m2[a[i]]==0)
{
suma+=m1[a[i]];
m2[a[i]]=-1;
}
}
sort(c+1,c+cnt+1);
for (register int i=1; i<=cnt; ++i)
{
if (i&1)
{
suma+=c[i].a;
}
else
{
sumb+=c[i].b;
}
}
if (suma>sumb)
{
printf("Cuber QQ\n");
}
else
{
printf("Quber CC\n");
}
}
return 0;
}
Getting Your Money Back


Halt Hater

浙公网安备 33010602011771号