#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); } |