| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
这个题见了鬼了。在苯地跑得龟速的程序能AC,秒出的TLE下面第一个程序,苯地随便来一组大一点的数据就至少1s以上,但是能过,4079ms:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int k[7] = {1,1,1,1,1,1,1}, p[7] = {1,1,1,1,1,1,1};
int powerVal[151][31];
bool powerCal[151][31] = {false};
int ans = 0;
int M,n;
int num1 = 0, num2 = 0;
int power(int a, int b){
//a^b
if(powerCal[a][b]) return powerVal[a][b];
if(a==1 || b==0) return 1;
if(b==1) return a;
int tmp = power(a, b/2);
powerCal[a][b] = true;
if(b%2){
int res = tmp*tmp*a;
powerVal[a][b] = res;
return res;
}
int rs = tmp*tmp;
powerVal[a][b] = rs;
return rs;
}
int bb[150*150*150];
int aa[150*150*150];
void addToList(int n, int &num, int *list){
list[num] = n;
num++;
}
void add(int start, int end, int &num, int *list, int sign){
int gs = end - start;
switch(gs){
case 1:
for(int i = 1; i <= M; i++) addToList(sign*k[start] * power(i, p[start]), num, list);
break;
case 2:
for(int i = 1; i <= M; i++){
int tmp = sign*k[start] * power(i, p[start]);
for(int j = 1; j <= M; j++){
addToList(sign*k[start+1] * power(j, p[start+1]) + tmp, num, list);
}
}
break;
case 3:
for(int i = 1; i <= M; i++){
int tmp1 = sign*k[start] * power(i, p[start]);
for(int j = 1; j <= M; j++){
int tmp2 = tmp1 + sign* k[start+1] * power(j, p[start+1]);
for(int q = 1; q <= M; q++){
addToList(sign*k[start+2] * power(q, p[start+2]) + tmp2, num, list);
}
}
}
break;
default:
break;
}
}
int main() {
scanf("%d%d", &n, &M);
for(int i = 0; i < n; i++){
scanf("%d%d", &k[i], &p[i]);
}
if(n == 1){
if(!k[0]) cout << M << endl;
else cout << 0 << endl;
}
else{
bool hasZ = false, hasF = false;
for(int i = 0; i < n; i++){
if(k[i] > 0) hasZ = true;
if(k[i] < 0) hasF = true;
}
if(hasZ ^ hasF) cout << 0 << endl;
else{
add(0, n/2, num1, aa, 1);
add(n/2, n, num2, bb, -1);
sort(aa, aa+num1);
sort(bb, bb+num2);
int pa = 0, pb = 0;
while(pa < num1 && pb < num2){
if(aa[pa] < bb[pb]) pa++;
else if(aa[pa] > bb[pb]) pb++;
else{
int cur = aa[pa];
int cntA = 0, cntB = 0;
while(pa < num1 && aa[pa] == cur){
cntA++;
pa++;
}
while(pb < num2 && bb[pb] == cur){
cntB++;
pb++;
}
ans += cntA * cntB;
}
}
cout << ans << endl;
}
}
return 0;
}
第二个,苯地飞快,交上去TLE:
#include <iostream>
#include <stdio.h>
using namespace std;
int k[7], p[7];
int powerVal[151][31];
bool powerCal[151][31] = {false};
int ans = 0;
int power(int a, int b){
//a^b
if(powerCal[a][b]) return powerVal[a][b];
if(a==1 || b==0) return 1;
if(b==1) return a;
int tmp = power(a, b/2);
powerCal[a][b] = true;
if(b%2){
int res = tmp*tmp*a;
powerVal[a][b] = res;
return res;
}
int rs = tmp*tmp;
powerVal[a][b] = rs;
return rs;
}
struct info{
int res;
int cs;
info *next;
info(): res(0), cs(0), next(NULL){}
info(int res, int cs): res(res), cs(cs), next(NULL){}
};
const int HASH = 2333333;
info* hash[HASH] = {NULL};
int mod(int n, int modVal){
int m = n%modVal;
if(m>=0) return m;
return m+modVal;
}
void addToHash(int n){
int pos = mod(n, HASH);//pos2 = mod(n, HASH2);
if(!hash[pos]){
hash[pos] = new info(n, 1);
}
else{
info *cur = hash[pos];
while(cur != NULL){
if(cur->res == n) break;
cur = cur->next;
}
if(cur){
cur->cs ++;
}
else{
info *tmp = new info(n,1);
info *laoHead = hash[pos];
tmp->next = laoHead;
hash[pos] = tmp;
}
}
}
int getHash(int n){
int pos = mod(n, HASH);//pos2 = mod(n, HASH2);
if(!hash[pos]) return 0;
info *cur = hash[pos];
while(cur != NULL){
if(cur->res == n) return cur->cs;
cur = cur->next;
}
return 0;
}
void addToHash(int start, int end, int M){
int gs = end - start;
switch(gs){
case 1:
for(int i = 1; i <= M; i++) addToHash(-k[start] * power(i, p[start]));
break;
case 2:
for(int i = 1; i <= M; i++){
int tmp = -k[start] * power(i, p[start]);
for(int j = 1; j <= M; j++){
addToHash(-k[start+1] * power(j, p[start+1]) + tmp);
}
}
break;
case 3:
for(int i = 1; i <= M; i++){
int tmp1 = -k[start] * power(i, p[start]);
for(int j = 1; j <= M; j++){
int tmp2 = tmp1 - k[start+1] * power(j, p[start+1]);
for(int q = 1; q <= M; q++){
addToHash(-k[start+2] * power(q, p[start+2]) + tmp2);
}
}
}
break;
default:
break;
}
}
void searchHash(int start, int end, int M){
int gs = end - start;
switch(gs){
case 1:
for(int i = 1; i <= M; i++) ans += getHash(k[start] * power(i, p[start]));
break;
case 2:
for(int i = 1; i <= M; i++){
int tmp = k[start] * power(i, p[start]);
for(int j = 1; j <= M; j++){
ans += getHash(k[start+1] * power(j, p[start+1]) + tmp);
}
}
break;
case 3:
for(int i = 1; i <= M; i++){
int tmp1 = k[start] * power(i, p[start]);
for(int j = 1; j <= M; j++){
int tmp2 = tmp1 + k[start+1] * power(j, p[start+1]);
for(int q = 1; q <= M; q++){
ans += getHash(k[start+2] * power(q, p[start+2]) + tmp2);
}
}
}
break;
default:
break;
}
}
int main() {
int n,M;
scanf("%d%d", &n, &M);
for(int i = 0; i < n; i++){
scanf("%d%d", &k[i], &p[i]);
}
if(n == 1){
if(!k[0]) cout << M << endl;
else cout << 0 << endl;
}
else{
addToHash(n/2, n, M);
ans = 0;
searchHash(0, n/2, M);
cout << ans << endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator