2017 8 4 得分:110
一句话:江南皮革厂倒闭了!会的东西全带着他们的小姨子跑了!成绩统统二十分!统统二十分!
A、聪明的质检员
链接:http://cogs.pro/cogs/problem/problem.php?pid=631
题意:找到一个式子:Y_i = \sum_j 1 \times \sum_j v_j , j \in [L_i, R_i] \text{且} w_j \ge W, j \text{是矿石编号}与标准差绝对值最小的情况。
吐槽:二分写成三分……少写一个库……心里苦啊……考试时就这么……100分飞了……(╯‵□′)╯︵┻━┻/(ㄒoㄒ)/~~/(ㄒoㄒ)/~~
题解:不要被那个该死的绝对值吓到而投奔三分!去掉绝对值,我们就会发现,这个狗比函数是单调下降的!于是我们改用二分!二分时要注意,函数值大于标准差测一个,小于标准差再测一个!还有就是,验证答案的时候不要XJB用什么数据结构!(数据结构学傻了---$ysf$)一个前缀和足够!恭喜成为优化加$log$成员!给这位仁兄让个地方……唉不说了说多了都是泪啊啊……
还有就是:多用$long long$!
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 const int maxn=200005; 8 int n,m,l[maxn],r[maxn],w[maxn],v[maxn]; 9 long long sumt[maxn],sumn[maxn],s; 10 long long check(int vall) 11 { 12 for(int i=1;i<=n;i++) 13 { 14 sumt[i]=sumt[i-1],sumn[i]=sumn[i-1]; 15 if(w[i]>=vall)sumt[i]++,sumn[i]+=v[i]; 16 } 17 long long ans=0; 18 for(int i=1;i<=m;i++) 19 { 20 ans+=(sumn[r[i]]-sumn[l[i]-1])*(sumt[r[i]]-sumt[l[i]-1]); 21 } 22 return ans-s; 23 } 24 int haha() 25 { 26 freopen("qc.in","r",stdin); 27 freopen("qc.out","w",stdout); 28 scanf("%d%d%lld",&n,&m,&s); 29 int maxx=0,minn=1000001; 30 for(int i=1;i<=n;i++) 31 { 32 scanf("%d%d",&w[i],&v[i]); 33 maxx=max(maxx,w[i]); 34 minn=min(minn,w[i]); 35 } 36 for(int i=1;i<=m;i++)scanf("%d%d",&l[i],&r[i]); 37 int L=minn,R=maxx,mid; 38 long long ans=(long long)1e12; 39 while(L<=R) 40 { 41 mid=(L+R)>>1;long long t=check(mid); 42 if(t>=0)L=mid+1; 43 else R=mid-1; 44 ans=min(ans,abs(t)); 45 } 46 printf("%lld\n",ans); 47 } 48 int sb=haha(); 49 int main(){;}
cogs631
B、lucky
听说是tyvj上有但是我怎么没找到呢……不管了直接描述题意:只含有4、7的数是幸运数,不含有出现两次及以上元素序列就是不幸运的。现在给出一个序列,问长度为k的不幸运序列有几种情况。
吐槽:表打小了……(╯‵□′)╯︵┻━┻吔屎……
题解:首先我们找出来最大值范围内所有的幸运数(打表或暴搜),然后,我们处理数列中每一个数字,计算出不是幸运数的个数和幸运数的种数。
对于每一个不是幸运数的数,我们可以看出这是个简单的组合问题,而对于是幸运数的,我们直接作为0-1背包处理,因为每个幸运数最多出现一次。因此,总的公式就是:
ans=\sum_{i=1}^k {\binom{d}{k-i} \times f_i}
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const long long mod=(long long)1e9+7; 7 long long c[100005],con[100025],f[100025];long long n,k; 8 long long qpow(long long q,long long tim) 9 { 10 long long tmp=q,l=1; 11 for(;tim;tim>>=1,tmp=tmp*tmp%mod) 12 if(tim&1)l=l*tmp%mod; 13 return l; 14 } 15 long long lucky_num[2050],cnt; 16 void dfs(long long val) 17 { 18 lucky_num[++cnt]=val; 19 if(1ll*val*10+4<=1e10)dfs(val*10+4); 20 if(1ll*val*10+7<=1e10)dfs(val*10+7); 21 } 22 long long ans; 23 long long tot; 24 int haha() 25 { 26 //freopen("lucky8.in","r",stdin); 27 //freopen("lucky.out","w",stdout); 28 dfs(4);dfs(7); 29 sort(lucky_num+1,lucky_num+cnt+1); 30 scanf("%lld%lld",&n,&k); 31 long long n2=n; 32 for(long long i=1;i<=n2;i++) 33 { 34 long long x;scanf("%lld",&x); 35 long long K=lower_bound(lucky_num+1,lucky_num+2046,x)-lucky_num; 36 if(lucky_num[K]==x) 37 { 38 con[K]++; 39 if(con[K]==2){n-=2;tot++;} 40 else if(con[K]>2)n--; 41 } 42 } 43 sort(con+1,con+2046,greater<long long>()); 44 c[0]=1; 45 for(long long i=1;i<=n;i++) 46 { 47 c[i]=(n-i+1)*c[i-1]%mod*qpow(i,mod-2)%mod; 48 } 49 f[0]=1; 50 for(long long i=1;i<=tot;i++) 51 for(long long j=i+1;j;j--) 52 f[j]=(f[j]%mod+f[j-1]*con[i]%mod)%mod; 53 long long tim=min(tot,k); 54 for(long long i=0;i<=tim;i++) 55 ans=(ans+c[k-i]*f[i]%mod)%mod; 56 printf("%lld\n",ans); 57 //while(1); 58 } 59 int sb=haha(); 60 signed main(){;}
C、兔农
链接:http://cogs.pro/cogs/problem/problem.php?pid=1374
题意:一个数列,与$Fibonacci$数列唯一的不同就在于如果$f[i]mod n=1$,$f[i]--$。求出这个数列对于一个模数取膜后的某一项。
吐槽:暴力答不对啊……死了得了……
题解:暴力好打,然而正解至今没有看懂(明明是你太蒻了好不好),只能丢链接加%dalao了……
$vfk$的:http://vfleaking.blog.163.com/blog/static/174807634201341721051604/
鏼的:http://jcvb.is-programmer.com/posts/39528.html
回来再填坑吧……(逃