#include <cstdio>
#include <vector>
#include <algorithm>
#define MAKS 510
#define MAKSWART 10000010
#define f first
#define s second
#define mp make_pair
using namespace std;
typedef long long int lld;
typedef unsigned int uint;
typedef pair<lld,lld> para;
lld a[MAKS];
/*int f10[2][2*MAKSWART];
int f11[2][2*MAKSWART];
int f20[2][2*MAKSWART];
int f21[2][2*MAKSWART];
int f22[2][2*MAKSWART];
inline bool ok(int i)
{
return i>=0 && i<2*MAKSWART;
}*/
vector<para> v10[2];
vector<para> v11[2];
vector<para> v20[2];
vector<para> v21[2];
vector<para> v22[2];
void dedup_list(vector<para>& v)
{
sort(v.begin(), v.end());
int poprz=-1;
for(int i=0;i<int(v.size());i++)
{
if(poprz!=-1 && v[i].f==v[poprz].f)
{
v[poprz].s+=v[i].s;
}
else
{
poprz++;
v[poprz]=v[i];
}
}
v.resize(poprz+1);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
int akt=0; int poprz=1;
vector<lld> sumpref;
//lld wyn=0;
lld wyn2=0;
for(int i=0;i<n;i++)
{
for(uint j=0;j<sumpref.size();j++)sumpref[j]+=a[i];
sumpref.push_back(a[i]);
for(uint j=0;j<sumpref.size();j++)
{
//wyn+=f20[akt][-sumpref[j]+MAKSWART]+f21[akt][-sumpref[j]+MAKSWART]+f22[akt][-sumpref[j]+MAKSWART];
auto i20=lower_bound(v20[akt].begin(),v20[akt].end(),mp(-sumpref[j],0LL));
if(i20!=v20[akt].end() && (*i20).f==-sumpref[j])wyn2+=(*i20).s;
auto i21=lower_bound(v21[akt].begin(),v21[akt].end(),mp(-sumpref[j],0LL));
if(i21!=v21[akt].end() && (*i21).f==-sumpref[j])wyn2+=(*i21).s;
auto i22=lower_bound(v22[akt].begin(),v22[akt].end(),mp(-sumpref[j],0LL));
if(i22!=v22[akt].end() && (*i22).f==-sumpref[j])wyn2+=(*i22).s;
//for(uint k=j+1;k<sumpref.size();k++)
//{
//wyn+=f10[akt][-sumpref[j]-sumpref[k]+MAKSWART]+f11[akt][-sumpref[j]-sumpref[k]+MAKSWART];
//auto i10=lower_bound(v10[akt].begin(),v10[akt].end(),mp(-sumpref[j]-sumpref[k],0LL));
//if(i10!=v10[akt].end() && (*i10).f==-sumpref[j]-sumpref[k])wyn2+=(*i10).s;
//auto i11=lower_bound(v11[akt].begin(),v11[akt].end(),mp(-sumpref[j]-sumpref[k],0LL));
//if(i11!=v11[akt].end() && (*i11).f==-sumpref[j]-sumpref[k])wyn2+=(*i11).s;
//for(uint l=k+1;l<sumpref.size();l++)
//{
//if(sumpref[j]+sumpref[k]+sumpref[l]==0)wyn++;
//if(sumpref[j]+sumpref[k]+sumpref[l]==0)wyn2++;
//}
//}
}
vector<para> vspec;
for(uint j=0;j<sumpref.size();j++)
{
auto ispec=lower_bound(vspec.begin(),vspec.end(),mp(-sumpref[j],0LL));
if(ispec!=vspec.end() && (*ispec).f==-sumpref[j])wyn2+=(*ispec).s;
for(uint k=0;k<j;k++)vspec.push_back(mp(sumpref[j]+sumpref[k], 1));
dedup_list(vspec);
}
for(uint j=0;j<vspec.size();j++)
{
auto i10=lower_bound(v10[akt].begin(),v10[akt].end(),mp(-vspec[j].f,0LL));
if(i10!=v10[akt].end() && (*i10).f==-vspec[j].f)wyn2+=vspec[j].s*((*i10).s);
auto i11=lower_bound(v11[akt].begin(),v11[akt].end(),mp(-vspec[j].f,0LL));
if(i11!=v11[akt].end() && (*i11).f==-vspec[j].f)wyn2+=vspec[j].s*((*i11).s);
}
poprz=akt; akt=1-akt;
/*for(int q=0;q<2*MAKSWART;q++)
{
f10[akt][q]=f10[1-akt][q]+f11[1-akt][q];
if(ok(q-a[i]))f11[akt][q]=f11[1-akt][q-a[i]];
else f11[akt][q]=0;
}
f11[akt][a[i]+MAKSWART]++;*/
// v10 = v10' + v11'
v10[akt].clear();
v10[akt].reserve(max(v10[poprz].size(), v11[poprz].size()));
for(uint j=0;j<v10[poprz].size();j++)v10[akt].push_back(v10[poprz][j]);
for(uint j=0;j<v11[poprz].size();j++)v10[akt].push_back(v11[poprz][j]);
dedup_list(v10[akt]);
// v11 = v11'x(ai)
v11[akt].clear();
v11[akt].reserve(v11[poprz].size());
for(uint j=0;j<v11[poprz].size();j++)v11[akt].push_back(mp(v11[poprz][j].f + a[i], v11[poprz][j].s));
v11[akt].push_back(mp(a[i],1LL));
dedup_list(v11[akt]);
// v20 = v20' + v21' + v22'
v20[akt].clear();
v20[akt].reserve(max(max(v20[poprz].size(), v21[poprz].size()), v22[poprz].size()));
for(uint j=0;j<v20[poprz].size();j++)v20[akt].push_back(v20[poprz][j]);
for(uint j=0;j<v21[poprz].size();j++)v20[akt].push_back(v21[poprz][j]);
for(uint j=0;j<v22[poprz].size();j++)v20[akt].push_back(v22[poprz][j]);
dedup_list(v20[akt]);
// v21 = v21'x(ai) + v10x(ai) + 2*(v22'x(ai)) + v11'x(2i+ai ???)
v21[akt].clear();
v21[akt].reserve(max(max(v21[poprz].size(),v10[akt].size()),max(v22[poprz].size(),v11[poprz].size())));
for(uint j=0;j<v21[poprz].size();j++)v21[akt].push_back(mp(v21[poprz][j].f + a[i], v21[poprz][j].s));
for(uint j=0;j<v10[akt].size();j++)v21[akt].push_back(mp(v10[akt][j].f + a[i], v10[akt][j].s));
for(uint j=0;j<v22[poprz].size();j++)v21[akt].push_back(mp(v22[poprz][j].f + a[i], 2LL*v22[poprz][j].s));
for(uint j=0;j<v11[poprz].size();j++)v21[akt].push_back(mp(2LL*v11[poprz][j].f + a[i], v11[poprz][j].s));
dedup_list(v21[akt]);
// v22 = v22'x(2ai) + v11'x(2ai)
v22[akt].clear();
v22[akt].reserve(max(v22[poprz].size(), v11[poprz].size()));
for(uint j=0;j<v22[poprz].size();j++)v22[akt].push_back(mp(v22[poprz][j].f + 2LL*a[i], v22[poprz][j].s));
for(uint j=0;j<v11[poprz].size();j++)v22[akt].push_back(mp(v11[poprz][j].f + 2LL*a[i], v11[poprz][j].s));
dedup_list(v22[akt]);
/*for(int q=0;q<2*MAKSWART;q++)
{
f20[akt][q]=f20[1-akt][q]+f21[1-akt][q]+f22[1-akt][q];
if(ok(q-a[i]))f21[akt][q]=f21[1-akt][q-a[i]]+f10[akt][q-a[i]]+2*f22[1-akt][q-a[i]];
else f21[akt][q]=0;
if((q-MAKSWART-a[i])%2==0 && ok((q+MAKSWART-a[i])/2))
{
f21[akt][q]+=f11[1-akt][(q+MAKSWART-a[i])/2];
}
if(ok(q-2*a[i]))f22[akt][q]=f22[1-akt][q-2*a[i]]+f11[1-akt][q-2*a[i]];
else f22[akt][q]=0;
}*/
/*printf("po dodaniu i=%d [%d]:\n",i,a[i]);
printf("f10: ");
for(int q=0;q<2*MAKSWART;q++)printf("%d",f10[akt][q]);
printf("\n");
printf("f11: ");
for(int q=0;q<2*MAKSWART;q++)printf("%d",f11[akt][q]);
printf("\n");
printf("v10: ");
for(int j=0;j<v10[akt].size();j++)printf("(%d, %d) ",v10[akt][j].f,v10[akt][j].s);
puts("");
printf("v11: ");
for(int j=0;j<v11[akt].size();j++)printf("(%d, %d) ",v11[akt][j].f,v11[akt][j].s);
puts("");
printf("f20: ");
for(int q=0;q<2*MAKSWART;q++)printf("%d",f20[akt][q]);
printf("\n");
printf("f21: ");
for(int q=0;q<2*MAKSWART;q++)printf("%d",f21[akt][q]);
printf("\n");
printf("f22: ");
for(int q=0;q<2*MAKSWART;q++)printf("%d",f22[akt][q]);
printf("\n");
printf("v20: ");
for(int j=0;j<v20[akt].size();j++)printf("(%d, %d) ",v20[akt][j].f,v20[akt][j].s);
puts("");
printf("v21: ");
for(int j=0;j<v21[akt].size();j++)printf("(%d, %d) ",v21[akt][j].f,v21[akt][j].s);
puts("");
printf("v22: ");
for(int j=0;j<v22[akt].size();j++)printf("(%d, %d) ",v22[akt][j].f,v22[akt][j].s);
puts("");*/
}
/*for(int q=0;q<2*MAKSWART;q++)
{
printf("%d: %d/%d/%d -> %d\n",q-MAKSWART,f20[akt][q],f21[akt][q],f22[akt][q],f20[akt][q]+f21[akt][q]+f22[akt][q]);
}*/
//printf("%d\n",wyn);
printf("%lld\n",wyn2);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | #include <cstdio> #include <vector> #include <algorithm> #define MAKS 510 #define MAKSWART 10000010 #define f first #define s second #define mp make_pair using namespace std; typedef long long int lld; typedef unsigned int uint; typedef pair<lld,lld> para; lld a[MAKS]; /*int f10[2][2*MAKSWART]; int f11[2][2*MAKSWART]; int f20[2][2*MAKSWART]; int f21[2][2*MAKSWART]; int f22[2][2*MAKSWART]; inline bool ok(int i) { return i>=0 && i<2*MAKSWART; }*/ vector<para> v10[2]; vector<para> v11[2]; vector<para> v20[2]; vector<para> v21[2]; vector<para> v22[2]; void dedup_list(vector<para>& v) { sort(v.begin(), v.end()); int poprz=-1; for(int i=0;i<int(v.size());i++) { if(poprz!=-1 && v[i].f==v[poprz].f) { v[poprz].s+=v[i].s; } else { poprz++; v[poprz]=v[i]; } } v.resize(poprz+1); } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++)scanf("%lld",&a[i]); int akt=0; int poprz=1; vector<lld> sumpref; //lld wyn=0; lld wyn2=0; for(int i=0;i<n;i++) { for(uint j=0;j<sumpref.size();j++)sumpref[j]+=a[i]; sumpref.push_back(a[i]); for(uint j=0;j<sumpref.size();j++) { //wyn+=f20[akt][-sumpref[j]+MAKSWART]+f21[akt][-sumpref[j]+MAKSWART]+f22[akt][-sumpref[j]+MAKSWART]; auto i20=lower_bound(v20[akt].begin(),v20[akt].end(),mp(-sumpref[j],0LL)); if(i20!=v20[akt].end() && (*i20).f==-sumpref[j])wyn2+=(*i20).s; auto i21=lower_bound(v21[akt].begin(),v21[akt].end(),mp(-sumpref[j],0LL)); if(i21!=v21[akt].end() && (*i21).f==-sumpref[j])wyn2+=(*i21).s; auto i22=lower_bound(v22[akt].begin(),v22[akt].end(),mp(-sumpref[j],0LL)); if(i22!=v22[akt].end() && (*i22).f==-sumpref[j])wyn2+=(*i22).s; //for(uint k=j+1;k<sumpref.size();k++) //{ //wyn+=f10[akt][-sumpref[j]-sumpref[k]+MAKSWART]+f11[akt][-sumpref[j]-sumpref[k]+MAKSWART]; //auto i10=lower_bound(v10[akt].begin(),v10[akt].end(),mp(-sumpref[j]-sumpref[k],0LL)); //if(i10!=v10[akt].end() && (*i10).f==-sumpref[j]-sumpref[k])wyn2+=(*i10).s; //auto i11=lower_bound(v11[akt].begin(),v11[akt].end(),mp(-sumpref[j]-sumpref[k],0LL)); //if(i11!=v11[akt].end() && (*i11).f==-sumpref[j]-sumpref[k])wyn2+=(*i11).s; //for(uint l=k+1;l<sumpref.size();l++) //{ //if(sumpref[j]+sumpref[k]+sumpref[l]==0)wyn++; //if(sumpref[j]+sumpref[k]+sumpref[l]==0)wyn2++; //} //} } vector<para> vspec; for(uint j=0;j<sumpref.size();j++) { auto ispec=lower_bound(vspec.begin(),vspec.end(),mp(-sumpref[j],0LL)); if(ispec!=vspec.end() && (*ispec).f==-sumpref[j])wyn2+=(*ispec).s; for(uint k=0;k<j;k++)vspec.push_back(mp(sumpref[j]+sumpref[k], 1)); dedup_list(vspec); } for(uint j=0;j<vspec.size();j++) { auto i10=lower_bound(v10[akt].begin(),v10[akt].end(),mp(-vspec[j].f,0LL)); if(i10!=v10[akt].end() && (*i10).f==-vspec[j].f)wyn2+=vspec[j].s*((*i10).s); auto i11=lower_bound(v11[akt].begin(),v11[akt].end(),mp(-vspec[j].f,0LL)); if(i11!=v11[akt].end() && (*i11).f==-vspec[j].f)wyn2+=vspec[j].s*((*i11).s); } poprz=akt; akt=1-akt; /*for(int q=0;q<2*MAKSWART;q++) { f10[akt][q]=f10[1-akt][q]+f11[1-akt][q]; if(ok(q-a[i]))f11[akt][q]=f11[1-akt][q-a[i]]; else f11[akt][q]=0; } f11[akt][a[i]+MAKSWART]++;*/ // v10 = v10' + v11' v10[akt].clear(); v10[akt].reserve(max(v10[poprz].size(), v11[poprz].size())); for(uint j=0;j<v10[poprz].size();j++)v10[akt].push_back(v10[poprz][j]); for(uint j=0;j<v11[poprz].size();j++)v10[akt].push_back(v11[poprz][j]); dedup_list(v10[akt]); // v11 = v11'x(ai) v11[akt].clear(); v11[akt].reserve(v11[poprz].size()); for(uint j=0;j<v11[poprz].size();j++)v11[akt].push_back(mp(v11[poprz][j].f + a[i], v11[poprz][j].s)); v11[akt].push_back(mp(a[i],1LL)); dedup_list(v11[akt]); // v20 = v20' + v21' + v22' v20[akt].clear(); v20[akt].reserve(max(max(v20[poprz].size(), v21[poprz].size()), v22[poprz].size())); for(uint j=0;j<v20[poprz].size();j++)v20[akt].push_back(v20[poprz][j]); for(uint j=0;j<v21[poprz].size();j++)v20[akt].push_back(v21[poprz][j]); for(uint j=0;j<v22[poprz].size();j++)v20[akt].push_back(v22[poprz][j]); dedup_list(v20[akt]); // v21 = v21'x(ai) + v10x(ai) + 2*(v22'x(ai)) + v11'x(2i+ai ???) v21[akt].clear(); v21[akt].reserve(max(max(v21[poprz].size(),v10[akt].size()),max(v22[poprz].size(),v11[poprz].size()))); for(uint j=0;j<v21[poprz].size();j++)v21[akt].push_back(mp(v21[poprz][j].f + a[i], v21[poprz][j].s)); for(uint j=0;j<v10[akt].size();j++)v21[akt].push_back(mp(v10[akt][j].f + a[i], v10[akt][j].s)); for(uint j=0;j<v22[poprz].size();j++)v21[akt].push_back(mp(v22[poprz][j].f + a[i], 2LL*v22[poprz][j].s)); for(uint j=0;j<v11[poprz].size();j++)v21[akt].push_back(mp(2LL*v11[poprz][j].f + a[i], v11[poprz][j].s)); dedup_list(v21[akt]); // v22 = v22'x(2ai) + v11'x(2ai) v22[akt].clear(); v22[akt].reserve(max(v22[poprz].size(), v11[poprz].size())); for(uint j=0;j<v22[poprz].size();j++)v22[akt].push_back(mp(v22[poprz][j].f + 2LL*a[i], v22[poprz][j].s)); for(uint j=0;j<v11[poprz].size();j++)v22[akt].push_back(mp(v11[poprz][j].f + 2LL*a[i], v11[poprz][j].s)); dedup_list(v22[akt]); /*for(int q=0;q<2*MAKSWART;q++) { f20[akt][q]=f20[1-akt][q]+f21[1-akt][q]+f22[1-akt][q]; if(ok(q-a[i]))f21[akt][q]=f21[1-akt][q-a[i]]+f10[akt][q-a[i]]+2*f22[1-akt][q-a[i]]; else f21[akt][q]=0; if((q-MAKSWART-a[i])%2==0 && ok((q+MAKSWART-a[i])/2)) { f21[akt][q]+=f11[1-akt][(q+MAKSWART-a[i])/2]; } if(ok(q-2*a[i]))f22[akt][q]=f22[1-akt][q-2*a[i]]+f11[1-akt][q-2*a[i]]; else f22[akt][q]=0; }*/ /*printf("po dodaniu i=%d [%d]:\n",i,a[i]); printf("f10: "); for(int q=0;q<2*MAKSWART;q++)printf("%d",f10[akt][q]); printf("\n"); printf("f11: "); for(int q=0;q<2*MAKSWART;q++)printf("%d",f11[akt][q]); printf("\n"); printf("v10: "); for(int j=0;j<v10[akt].size();j++)printf("(%d, %d) ",v10[akt][j].f,v10[akt][j].s); puts(""); printf("v11: "); for(int j=0;j<v11[akt].size();j++)printf("(%d, %d) ",v11[akt][j].f,v11[akt][j].s); puts(""); printf("f20: "); for(int q=0;q<2*MAKSWART;q++)printf("%d",f20[akt][q]); printf("\n"); printf("f21: "); for(int q=0;q<2*MAKSWART;q++)printf("%d",f21[akt][q]); printf("\n"); printf("f22: "); for(int q=0;q<2*MAKSWART;q++)printf("%d",f22[akt][q]); printf("\n"); printf("v20: "); for(int j=0;j<v20[akt].size();j++)printf("(%d, %d) ",v20[akt][j].f,v20[akt][j].s); puts(""); printf("v21: "); for(int j=0;j<v21[akt].size();j++)printf("(%d, %d) ",v21[akt][j].f,v21[akt][j].s); puts(""); printf("v22: "); for(int j=0;j<v22[akt].size();j++)printf("(%d, %d) ",v22[akt][j].f,v22[akt][j].s); puts("");*/ } /*for(int q=0;q<2*MAKSWART;q++) { printf("%d: %d/%d/%d -> %d\n",q-MAKSWART,f20[akt][q],f21[akt][q],f22[akt][q],f20[akt][q]+f21[akt][q]+f22[akt][q]); }*/ //printf("%d\n",wyn); printf("%lld\n",wyn2); } |
English