标签:
【题意】
给定一个长度为n(n<=100000)的正整数序列,给出m(m<=100000)个子集合和的记录,问哪些一定比正确的记录多了
【题解】
对正整数序列求和,记录比和大的一定记录多了
HackPoint:sum要开long long
int v[100005]; int main(){ int T=gi; while(T--){ int n,m;n=gi,m=gi;ll sum=0; FOR1(i,n)v[i]=gi,sum+=v[i]; FOR1(i,m){ ll p;scanf("%I64d",&p); if(p>sum)printf("1"); else printf("0"); }puts(""); } }
【题意】
给定一个长度为n(n<=100000)的序列,选择一个数并删除它。每个数被选中的概率相等,求删数后相邻两数差值绝对值最大值的期望*n的值
【题解】
一眼看上去个multiset????
然后在开黑组里问了下10*100000*6*multiset能不能过
然后zzq:
然后写了个multiset过来pretest
int a[100005]; int b[100005]; #define era(x) s.erase(s.lower_bound(x)) int main(){ int T=gi; while(T--){ int n=gi; FOR1(i,n)a[i]=gi; ll ans=0; multiset<int,greater<int> >s; FOR1(i,n-1)s.insert(abs(a[i+1]-a[i])); for(int i=2;i<n;i++){ era(abs(a[i]-a[i-1])); era(abs(a[i+1]-a[i])); s.insert(abs(a[i+1]-a[i-1])); ans+=*s.begin(); s.insert(abs(a[i]-a[i-1])); s.insert(abs(a[i+1]-a[i])); era(abs(a[i+1]-a[i-1])); } era(abs(a[2]-a[1])); ans+=*s.begin(); s.insert(abs(a[2]-a[1])); era(abs(a[n]-a[n-1])); ans+=*s.begin(); printf("%I64d",ans); } }
f**k y*u
后来冷静想了下,好像是个傻逼题
求出前ii个数里相邻差值的最大值,ii到nn里相邻差值的最大值,那么
int f[200005],g[200005],a[200005]; int main(){ int T=gi; while(T--){ int n=gi; FOR1(i,n)a[i]=gi; for(int i=2;i<=n;i++)f[i]=max(f[i-1],abs(a[i]-a[i-1])); for(int i=n-1;i>=1;i--)g[i]=max(g[i+1],abs(a[i+1]-a[i])); //FOR1(i,n-1)printf("%d ",f[i]);puts(""); ll ans=0; FOR1(i,n){ if(i==1)ans+=g[2];//printf("%I64d\n",ans); else if(i==n)ans+=f[n-1];//printf("%I64d\n",ans); else{ //printf("%d %d\n",f[i-1],g[i+1]); ans+=max(f[i-1],max(g[i+1],abs(a[i+1]-a[i-1]))); //printf("%I64d\n",ans); } } printf("%I64d\n",ans); } }
【题意】
给定一个和前两题差不多长的序列,给定一组m,k的值,求多少个区间里的第 k 大的数不小于 m
【题解】
xjb尺取一下就行了
int a[233333]; int main(){ int T=gi; while(T--){ int n,m,k; n=gi;m=gi;k=gi; FOR1(i,n)a[i]=gi; int st=1,ed=0,cnt=0;ll ans=0; while(st<=n){ while(cnt<k&&ed+1<=n)cnt+=(a[++ed]>=m); if(cnt==k)ans=ans+n-ed+1; cnt-=(a[st++]>=m); } printf("%I64d\n",ans); } }
【SystemTest】
1002果然T辣qwq
由于手速慢一个人都没hack到
单调递减的排名=。=大沙茶的第一次BC到此结束。
标签:
原文地址:http://www.cnblogs.com/chouti/p/5746096.html