memset()函数只是稍稍常数小一些而已,其复杂度任然是O(n)的。这一点需要稍稍注意。
代码
#include
#include
#include
#define Mod 1000000007 #define maxn 200005 //#define mmm 1000000005 using namespace std; int n; int num; long long to[maxn]; long long use[maxn]; long long vis[maxn]; long long po[maxn]; long long ans = 1; void get(int x){ int whe = to[x]; int now = 1; while(whe != x){ now++; whe = to[whe]; } if(now <= 1) return; ans *= (po[now] - 2); ans %= Mod; num -= now; } void update(int x){ int whe = x; while(vis[whe] && !use[whe]){ use[whe] = 1; whe = to[whe]; // vis[whe] = 0; // cout << whe << " "; } //cout << endl; } void deal(int x){ //memset(vis,0,sizeof(vis)); int whe = x; while(!vis[whe] && !use[whe]) { vis[whe] = 1; whe = to[whe]; } if(!use[whe]) { get(whe); } update(x); } void work(){ for(int i = 1; i <= n; i++) if(!use[i]) { deal(i); } ans *= po[num]; ans %= Mod; cout << ans << endl; } void pre_work(){ po[0] = 1; for(int i = 1; i <= 200000; i ++) { po[i] = po[i-1] * 2; po[i] %= Mod; } } /*void show(){ for(int i = 1; i <= n; i++) cout << ci[i] << " "; cout << endl; }*/ int main(){ //freopen("main.in","r",stdin); ios::sync_with_stdio(false); pre_work(); cin >> n; num = n; for(int i = 1; i <= n; i++) cin >> to[i]; work(); // show(); return 0; }
这里如果加入了memset()就会tle的飞起。
题目:codeforces round_369 - D