int main ()
{
	scanf ("%d", &n); memset(ne, ~0, sizeof ne); memset(he, ~0, sizeof he);
	for (int i = 1, j = 0; i <= n * 2; i++) {
		while((1 << j) <= i)j++;
		log2[i] = j - 1;
	}
	for (int i = 1, x, y, z; i < n; i++)
	{
		scanf("%d", &x); x--; y = i; z = 1;
		e[nn] = y; w[nn] = z;
		ne[nn] = he[x]; he[x] = nn++;
	}
	dfs(0);
	init_st();
	for (int i = mm - 1; i >= 0; i--)
		f[list[i]] = i;
	ans = (1 << 30);
	for (int i = 0; i < n; i++) {
		int s = 0;
		for (int j = 0; j < n; j++) {
			s = max(s, dist[i] + dist[j] - 2 * dist[lca(i, j)]);
		}
		if (s < ans) {
			ans = s;
			mmm = 0;
		}
		if (s == ans)
			Ans[mmm++] = i + 1;
	}
	for (int i = 0; i < mmm; i++)
		printf("%d ", Ans[i]);
	return 0;
}
Beispiel #2
0
/////////////////////////////////////////////////
// 主函数
/////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    // 初始化绘图窗口及颜色
    setinitmode(0x005, 0, 0);
    if (argc < 2)
    {
        MessageBoxW(NULL, L"本屏幕保护程序无配置", L"JuliaSet", MB_OK);
        return 0;
    }
    else if (stricmp(argv[1], "/p") == 0)
    {
        HWND hwnd;
        sscanf(argv[2], "%d", &hwnd);
        attachHWND(hwnd);
        setinitmode(0x107, 0, 0);
    }
    else if (stricmp(argv[1], "/s"))
    {
        MessageBoxW(NULL, L"本屏幕保护程序无配置", L"JuliaSet", MB_OK);
        return 0;
    }

    //initgraph(320, 240);
    initgraph(-1, -1);

    randomize();
    showmouse(0);
    FlushMouseMsgBuffer();
    while(kbhit()) getch();

    //InitColor();
    InitLog();
    g_w = getwidth(NULL);
    g_h = getheight(NULL);
    g_st = (state*)malloc(g_w * g_h * sizeof(state));
    COMPLEX c = {0.262, 0.002}, z = {0, 0};
    double r = 1.5, d = g_w / (double)g_h, rotate = 0, sr = sin(rotate), cr = cos(rotate);
    init_st(g_w, g_h);
    int n_update = 0;
    double ftime = fclock();
    {
        double dc = 64, dca = 128, db = 16;
        col_r = randomf() * dc + db;
        col_g = randomf() * dc + db;
        col_b = randomf() * dc + db;
        col_ar = randomf() * dca;
        col_ag = randomf() * dca;
        col_ab = randomf() * dca;
        rotate = randomf() * 360;
        sr = sin(rotate), cr = cos(rotate);
    }
    setrendermode(RENDER_MANUAL);
    for (int loop = 1; kbmouhit() == 0; ++loop)
    {
        int ret;
        if (loop <= 4)
        {
            ret = JDraw(c, z.re - r * d, z.im - r, z.re + r * d, z.im + r, sr, cr);
            if (loop == 4)
            {
                g_udlist.swap();
                for(int y=0; y<g_h; y++)
                {
                    for(int x=0; x<g_w; x++)
                    {
                        if (g_st[y * g_w + x].ed == 0)
                        {
                            g_udlist.push(x, y);
                        }
                    }
                }
                g_udlist.swap();
            }
        }
        else
        {
            static int t = 0;
            ret = JDrawA(c, z.re - r * d, z.im - r, z.re + r * d, z.im + r);
            if (clock() - t > 30)
            {
                delay(1);
                t = clock();
            }
        }
        if (g_updatepoint == 0)
        {
            n_update++;
        }
        else
        {
            n_update = 0;
        }
        if (0)
        {
            char str[500];
            sprintf(str, "%d %d %f %f", g_w, g_h, r, d);
            outtextxy(0, 0, str);
        }
        if (ret == 0 || n_update > 8 || loop > 1000)
        {
            loop = 0;
            if (g_mi[0][0] == 0)
            {
                delay(1);
                memset(pMap, 0, BF_W * BF_H * sizeof(state));
                g_udlist.clear();
                for (int i = 0; i < BF_W; ++i)
                {
                    addpoint(i, 0);
                    addpoint(i, BF_H - 1);
                }
                for (int i = 0; i < 4; )
                {
                    if (MDraw(-1.9, -1.2, 0.5, 1.2) == 0)
                    {
                        ++i;
                    }
                    else
                    {
                        i = 0;
                    }
                    if (kbmouhit()) return 0;
                }
            }
            double dc = 64, dca = 128, db = 16;
            col_r = randomf() * dc + db;
            col_g = randomf() * dc + db;
            col_b = randomf() * dc + db;
            col_ar = randomf() * dca;
            col_ag = randomf() * dca;
            col_ab = randomf() * dca;
            rotate = randomf() * 360;
            sr = sin(rotate), cr = cos(rotate);
            do
            {
                c.re = randomf() * 2.4 - 1.9;
                c.im = randomf() * 2.4 - 1.2;
                int ir = (int)((c.re - (-1.9)) / (0.5 - (-1.9)) * BF_W);
                int im = (int)((c.im - (-1.2)) / (1.2 - (-1.2)) * BF_H);
                if (g_mi[im][ir] >= 16)
                {
                    break;
                }
            } while (1);
            init_st(g_w, g_h);
            n_update = 0;
            if (fclock() - ftime < 3)
            {
                delay_ms((int)((3 - (fclock() - ftime)) * 1000));
            }
            else
            {
                delay(1);
            }
            ftime = fclock();
        }
    }

    closegraph();
    return 0;
}
Beispiel #3
0
int tracing_start(uint32_t pid, const char *filename)
{
  /* Copy trace filename to global variable */
  strncpy(tracename, filename, 128);

  /* Set name for functions file */
  snprintf(functionsname, 128, "%s.functions", filename);

  /* If previous trace did not close properly, close files now */
  if (tracelog)
    close_trace(tracelog);
  if (tracenetlog)
    fclose(tracenetlog);

  /* Initialize trace file */
  tracelog = fopen(filename, "w");
  if (0 == tracelog) {
    perror("tracing_start");
    tracepid = 0;
    tracecr3 = 0;
    return -1;
  }
  setvbuf(tracelog, filebuf, _IOFBF, FILEBUFSIZE);

  /* Initialize netlog file */
  char netname[128];
  snprintf(netname, 128, "%s.netlog", filename);
  tracenetlog = fopen(netname, "w");
  if (0 == tracenetlog) {
    perror("tracing_start");
    tracepid = 0;
    tracecr3 = 0;
    return -1;
  }
  else {
    fprintf(tracenetlog, "Flow       Off  Data\n");
    fflush(tracenetlog);
  }

  /* Set PID and CR3 of the process to be traced */
  tracecr3 = find_cr3(pid);
  if (0 == tracecr3) {
    monitor_printf(default_mon, 
                  "CR3 for PID %d not found. Tracing all processes!\n",pid);
    tracepid = -1;
  }
  else {
    tracepid = pid;
  }
  monitor_printf(default_mon, "PID: %d CR3: 0x%08x\n", tracepid, tracecr3);

  /* Initialize disassembler */
  xed2_init();

  /* Clear trace statistics */
  clear_trace_stats();

  /* Clear skip taint flags */
  init_st();

  /* Initialize hooks only for this process */
  decaf_plugin->monitored_cr3 = tracecr3;

  /* Get system start usage */
  if (getrusage(RUSAGE_SELF, &startUsage) != 0)
    monitor_printf (default_mon, "Could not get start usage\n");

  // If tracing child, load process tracking hooks
  if (tracing_child) {
    trackproc_start(pid);
    load_hooks_in_plugin(&tracecr3, "group_process.so", hook_dirname);
  }

  /* Register block and instruction callbacks */
  block_begin_cb_handle =
    DECAF_register_callback(DECAF_BLOCK_BEGIN_CB, tracing_block_begin, NULL);

  insn_begin_cb_handle =
    DECAF_register_callback(DECAF_INSN_BEGIN_CB,
                            tracing_insn_begin, &should_monitor);
  insn_end_cb_handle =
    DECAF_register_callback(DECAF_INSN_END_CB,
                        tracing_insn_end, &should_monitor);

  return 0;
}