zoukankan      html  css  js  c++  java
  • CF1534D Lost Tree

    比赛当时降智了,没有想出来。

    我们询问一个点,与它距离为 (1) 的所有点都跟它有边。

    所以,我们想知道树的所有边只需查询所有深度为奇数的点,或所有深度为偶数的点就可以了。

    这样我们就可以先查询任意一个节点,把它拉出来作根,然后再比较深度为奇数的点的个数和深度为偶数的点的个数(注意不要把根节点算进去),然后取小的那个去查询就好了。

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2010;
    int h[2];
    vector<int> v[2], ans[N];
    int main() {
    	int n;
    	cin >> n;
    	cout << "? " << 1 << endl;
    	fflush (stdout);
    	for (int i = 1;  i <= n; i++) {
    		int dep;
    		cin >> dep;
    		if (dep == 1) ans[1].push_back(i);
    		if (dep != 0) {
    			h[dep&1]++;
    			v[dep&1].push_back(i);
    		}
    	}
    	int k=0;
    	if (h[0] > h[1]) k = 1;
    	for (int i : v[k]) {
    		cout << "? " << i << endl;
    		fflush (stdout);
    		for (int j = 1; j <= n; j++) {
    			int dep;
    			cin >> dep;
    			if (dep == 1)ans[i].push_back(j);
    		}
    	}
    	cout << "!" << endl;
    	for (int i = 1; i <= n; i++)
    		for (int j : ans[i])
    			if (j != 1)
    				cout<<i<<" "<<j<<endl;
    	return 0;
    }
    
  • 相关阅读:
    C#引用类型详细剖析(转)
    wcf问题集锦
    Emgu CV 初试
    C#语言使用习惯
    多线程和消息机制
    ArrayAdapter
    SimpleAdapter
    删除对话框
    HTML制作个人简历
    冒泡排序
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/14898454.html
Copyright © 2011-2022 走看看