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 |
理论最高复杂度是假的,实际算出来每次转移最多只有377*377=.=我感觉加了一堆set和map试图剪枝反而增加了复杂度,纯暴力能跑得快很多 打precal表的时间比实际跑算法都长,打出来一看只有377个元素。。。 第一次没对结果取模,改后 63MS 800K AC 代码 #define _CRT_SECURE_NO_WARNINGS #pragma _attribute_((optimize("-O2"))) #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <map> #include <list> #include <set> #include <cstdio> #include <bitset> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <string> #include <sstream> #include <ctime> #include <complex> #include <iomanip> //#define Endl endl //#define int long long //#define Local using namespace std; set<int> precal; int now; const int md = 1e8; void pre(int p, int l) { if (p == 12) { precal.insert(now); return; } if (l) { now <<= 1; pre(p + 1, 0); now >>= 1; } else { now <<= 1; pre(p + 1, 0); now >>= 1; now <<= 1; now++; pre(p + 1, 1); now >>= 1; } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); //freopen("input1.txt", "r", stdin); //freopen("output1.txt", "w", stdout); int n, m; cin >> n >> m; map<int, int> cal[4100]; pre(0, 0); pre(0, 1); now = 0; for (int i = 0; i < m; i++) { now <<= 1; int tmp; cin >> tmp; now += tmp; } for (set<int>::iterator it = precal.begin(); it != precal.end(); ++it) { if ((*it | now) == now) cal[0].insert({ *it,1 }); } for (int i = 1; i < n; i++) { now = 0; for (int j = 0; j < m; j++) { now <<= 1; int tmp; cin >> tmp; now += tmp; } for (set<int>::iterator it = precal.begin(); it != precal.end(); ++it) { if (*it > now) break; if ((*it | now) == now) for (map<int, int>::iterator j = cal[i - 1].begin(); j != cal[i - 1].end(); ++j) if ((j->first&*it) == 0) cal[i][*it] += j->second, cal[i][*it] %= md; } } int cont = 0; for (map<int, int>::iterator j = cal[n - 1].begin(); j != cal[n - 1].end(); ++j) cont += j->second, cont %= md; cout << cont << endl; #ifdef Local cout << "time: " << (long long)clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl; #endif return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator