C题:http://codeforces.com/problemset/problem/407/A
#include<stdio.h>
#include<math.h>
int main()
{
int a, b, ax, ay, bx, by;
while(~scanf("%d%d",&a, &b))
{
int flag = 0;
for(ax = 1; ax < a; ax++) //枚举a的横坐标
{
for(bx = 1; bx < b; bx++) //枚举b的横坐标
{
ay = (int)sqrt(a*a - ax*ax); //a的纵坐标
by = (int)sqrt(b*b - bx*bx); //b的纵坐标
if(ax*ax + ay*ay == a*a && bx*bx + by*by == b*b) //两个都是直角三角形
{
if(ax*bx == ay*by) //两个三角形相似
{
if(ax != bx) //保证三角形的边与坐标轴不平行
{
flag = 1;
break;
}
}
}
}
if(flag)
break;
}
if(!flag)
printf("NO\n");
else
{
printf("YES\n");
printf("0 0\n");
printf("%d %d\n",ax, -ay);
printf("%d %d\n",bx, by);
}
}
return 0;
}
J题:http://codeforces.com/problemset/problem/405/E
暂时没有彻底弄懂这个题。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
struct node
{
int x, y, z;
node(int x, int y, int z) : x(x), y(y), z(z) {}
};
vector <int> adj[N];
vector <node> ans;
int vis[N];
int tot;
int dfs(int u, int fa)
{
vis[u] = ++tot;
//printf("$-> u = %d, fa = %d, vis[%d] = %d\n",u, fa, u, vis[u]);
int a = 0;
int s = adj[u].size();
for(int i = 0; i < s; i++)
{
int v = adj[u][i];
if(v == fa) continue;
if(!vis[v])
{
if(dfs(v, u))
{
// printf("return 1;\n");
continue;
}
if(!a) a = v;
else
{
ans.push_back(node(v, u, a));
// printf("****%d %d %d\n",v,u, a);
a = 0;
}
}
else if(vis[v] < vis[u]) //判断v是不是在u之前出现
{
if(!a) a = v;
else
{
ans.push_back(node(v, u, a));
// printf("--->%d %d %d\n",v, u, a);
a = 0;
}
}
}
if(a)
{
ans.push_back(node(a, u, fa));
// printf("####%d %d %d\n",a, u, fa);
return 1;
}
return 0;
}
int main()
{
//freopen("a.txt","r",stdin);
int n, m, u, v, i, j;
while(~scanf("%d%d",&n,&m))
{
memset(vis, 0, sizeof(vis));
memset(adj, 0, sizeof(adj));
ans.clear();
for(i = 0; i < m; i++)
{
scanf("%d%d",&u,&v);
adj[u].push_back(v);
adj[v].push_back(u);
}
if(m&1)
{
printf("No solution\n");
continue;
}
tot = 0;
dfs(1, -1);
int k = ans.size();
for(i = 0; i < k; i++)
{
node tmp = ans[i];
printf("%d %d %d\n", tmp.x, tmp.y, tmp.z);
}
printf("\n");
}
return 0;
}
//vis[i]表示第i个点是第几次访问到的