T1:
题解:
考试的时候60pts背包+方案输出。。。(期望得分50?
打稳了还是挺好
100pts:
求出前缀和,先模n出来,扫一遍看看有没有前缀和是0哒,如果有前缀和为0,那就直接输出1~x(前缀和是0的情况)
如果没有前缀和是0,有N个前缀和,取值范围是1~N-1,也就是说至少有两个前缀和是一样的
这有什么重要意义呢?假如说
sum[a]=sum[b](a<=b)
那么
sum[b]−sum[a]=0
这是什么意思啊!这不就是指a+1~b凑出来个n嘛~,直接输出就好咯
这个尿性。。很像CF的C题啊
代码:
60pts
#include <cstdio>
#define N 1000005
using namespace std;
struct hh{int x,id;}a[N];
bool f[N];int tot,ans[N];
inline int in()
{
char ch=getchar();int x=0,f=1;
while (ch>'9'|| ch<'0') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
void find(int z,int up)
{
if (z==0) return;
for (int i=up;i>=1;i--)
if (f[z-a[i].x])
{
ans[++tot]=a[i].id;
find(z-a[i].x,i-1);
break;
}
}
int main()
{
freopen("set.in","r",stdin);
freopen("set.out","w",stdout);
int n,i,j;
n=in();
for (i=1;i<=n;i++) {a[i].x=in(); a[i].id=i;}
for (i=1;i<=n;i++)
{
a[i].x%=n;
if (a[i].x==0) {printf("1\n%d",a[i].id);return 0;}
}
bool vv=0;f[0]=1;
for (i=1;i<=n;i++)
{
for (j=n;j>=a[i].x;j--)
{
f[j]=f[j] || f[j-a[i].x];
if (f[n]){vv=1;break;}
}
if (vv) break;
}
if (!vv){printf("-1");return 0;}
else
{
find(n,i);
printf("%d\n",tot);
for (i=1;i<tot;i++) printf("%d ",ans[i]);
printf("%d",ans[tot]);
}
}
100pts
#include <cstdio>
#include <algorithm>
#define N 1000005
using namespace std;
int sum[N],a[N],c[N];
inline int in()
{
char ch=getchar();int x=0,f=1;
while (ch>'9'|| ch<'0') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main()
{
freopen("set.in","r",stdin);
freopen("set.out","w",stdout);
int n,i,j;
n=in();
for (i=1;i<=n;i++)
{
a[i]=in();
a[i]%=n;sum[i]=(a[i]+sum[i-1])%n;
}
for (i=1;i<=n;i++)
if (!sum[i])
{
printf("%d\n",i);
for (j=1;j<=i;j++)
printf("%d ",j);
return 0;
}
for (i=1;i<=n;i++)
{
if (c[sum[i]])
{
printf("%d\n",i-c[sum[i]]);
for (j=c[sum[i]]+1;j<=i;j++)
printf("%d ",j);
return 0;
}
c[sum[i]]=i;
}
printf("%d",-1);
}
T2:
题解:
这个题是原题。。。
就是求n个数中的众数,如果没有众数就是0啦
有众数就是众数*2-总个数-1
因为就是把众数插在其他的数字中间,可以配对的数是2*num(众数的个数)-n(总个数)-1就是啦,这个-1?就是在第一位上再放一个众数啊
代码:
#include <cstdio>
#include <algorithm>
#define N 10005
using namespace std;
int cont[N],x[N],y[N],z[N],stack[N],cnt;
inline int in()
{
char ch=getchar();int x=0,f=1;
while (ch>'9'|| ch<'0') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main()
{
freopen("read.in","r",stdin);
freopen("read.out","w",stdout);
int n=0,i,j,m,k;
m=in();k=in();
for (i=1;i<=m;i++) cont[i]=in();
for (i=1;i<=m;i++) x[i]=in();
for (i=1;i<=m;i++) y[i]=in();
for (i=1;i<=m;i++) z[i]=in();
int s=(1<<k)-1;int a=-1,now=0;
for (i=1;i<=m;i++)
{
if (!now) a=x[i];
if (x[i]!=a) now--;else now++;
long long last=x[i];
for (int j=1;j<cont[i];j++)
{
last=(last*y[i]+z[i])&s;
if (!now) a=last;
if (last!=a) now--;else now++;
}
}
now=0;
for (i=1;i<=m;i++)
{
++n;
if (x[i]==a) now++;
long long last=x[i];
for (int j=1;j<cont[i];j++)
{
last=(last*y[i]+z[i])&s;
++n;
if (last==a) now++;
}
}
now=now*2-n;
if (now<0) printf("0");else printf("%d",now-1);
}
吐槽:
刚考完,loser:哎呀T2原题
喵喵喵:哪道题啊
loser:bzoj2456
喵喵喵(兴奋地进入bzoj):2~4~5~6
喵喵喵:。。。。。。
喵喵喵:这道题。。。我做过啊。。。。
然后仔细一看。woc竟然真的是原题。。只不过变了形形形形而已。。
。。。。。再见.jpg
T1的spj写挂了??
然后T1四种做法:
输出-1;期望得分10;实际得分0
n^2dp;期望得分50;实际得分60
科学的题解;期望得分100;实际得分100
什么都不输出;期望得分0;实际得分100
hahaha