暑假训练场

A(UVAL6182)、

凯神看了敲掉的题目,还没有看过

 #include <iostream>
#include <memory.h> using namespace std; const int MAX = ; bool Solve(int x, int y);
bool Check(int m, int n, int p, int q); int main()
{
ios::sync_with_stdio(false);
int N, x, y;
while(cin >> N)
{
for(int i = ; i <= N; i++)
{
cin >> x >> y;
if((x * x + y * y != ) && Solve(x, y)) { cout << "P" << endl; }
else { cout << "C" << endl; }
}
}
return ;
} bool Solve(int x, int y)
{
int ans = ;
for(int i = -MAX; i <= MAX; i++)
{
for(int j = -MAX; j <= MAX; j++)
{
if(i * i + j * j == ) { continue; }
if(Check(i, j, x, y))
{ ans++; }
}
}
return ans == ;
} bool Check(int m, int n, int p, int q)
{
int x = m * m + n * n;
int y = m * p + n * q, z = m * q - n * p;
int a = y / x, b = z / x;
int c = a * a + b * b, d = p * p + q * q;
if(y % x != || z % x != ) { return false; }
return x * c == d;
}

B(UVAL6183)、

一道关于三元线性方程组求解的问题,对于给定的文本,每一行前导点'.'由之前的文本中未匹配的大中小括号决定,是关于三个括号的线性关系,因此可以由给定的文本情况列出一系列线性方程,获取三个系数的信息,再由此判断给定的文本每行分别需要加上多少个前导点。

一开始由于前面先做的D题,我研究了高斯消元,队友看完这题就告诉我这题也是高消,于是我就按高消的做法做,然而在测试各种样例的时候发现了各种问题,然后重新确定了做法,由于三个系数都已经固定了范围是1到20间的正整数,所以完全可以20*20*20的循环枚举每一组解,去匹配所有<=10个方程,记录下所有可行解,然后再用这些解依次对需要输出的每一行计算一次需要输出的点数,如果所有可行解求出的点数都是一样的,那么这个式子的点数就是确定的,可以输出,否则就输出-1.

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define eps 1e-5 const int maxn=; int num[];
int x[],y[],z[],ansx[],ansy[],ansz[],ans[];
char s[];
int anss[][]; int main(){
int p,q;
while(scanf("%d%d",&p,&q)!=EOF&&(p+q)){
int i,j,k;
memset(ans,,sizeof(ans));
memset(num,,sizeof(num));
for(i=;i<p+q;i++){
x[i+]=x[i];
y[i+]=y[i];
z[i+]=z[i];
scanf("%s",s);
bool f=;
for(j=;j<strlen(s);j++){
if(f&&s[j]=='.'){
num[i]++;
}
else f=;
if(s[j]=='(')x[i+]++;
if(s[j]==')')x[i+]--;
if(s[j]=='[')y[i+]++;
if(s[j]==']')y[i+]--;
if(s[j]=='{')z[i+]++;
if(s[j]=='}')z[i+]--;
}
}
// for(i=0;i<p+q;i++)printf("%d %d %d %d\n",x[i],y[i],z[i],num[i]);
memset(ansx,,sizeof(ansx));
memset(ansy,,sizeof(ansy));
memset(ansz,,sizeof(ansz));
int c=;
for(i=;i<=;i++){
for(j=;j<=;j++){
for(k=;k<=;k++){
bool f=;
for(int o=;o<p&&f;o++){
if(x[o]*i+y[o]*j+z[o]*k!=num[o])f=;
}
if(f){
++c;
anss[c][]=i;
anss[c][]=j;
anss[c][]=k; ansx[i]=;
ansy[j]=;
ansz[k]=;
}
}
}
}
int cnt=;
for(i=;i<=;i++){
if(ansx[i]){
cnt++;
ans[]=i;
}
}
if(cnt!=)ans[]=;
cnt=;
for(i=;i<=;i++){
if(ansy[i]){
cnt++;
ans[]=i;
}
}
if(cnt!=)ans[]=;
cnt=;
for(i=;i<=;i++){
if(ansz[i]){
cnt++;
ans[]=i;
}
}
if(cnt!=)ans[]=;
/* for(i=0;i<=2;i++)printf("%d ",ans[i]);
printf("\n");
*/ for(i=p;i<p+q;i++){
if((x[i]&&ans[]==)||(y[i]&&ans[]==)||(z[i]&&ans[]==)){
bool f=;
int res=;
for(j=;j<=c&&f;j++){
if(j==)res=x[i]*anss[j][]+y[i]*anss[j][]+z[i]*anss[j][];
else if(res!=x[i]*anss[j][]+y[i]*anss[j][]+z[i]*anss[j][]){
f=;
}
}
if(f)printf("%d",res);
else printf("-1");
}
else printf("%d",x[i]*(int)ans[]+y[i]*(int)ans[]+z[i]*(int)ans[]);
if(i==p+q-)printf("\n");
else printf(" ");
}
}
return ;
}

C(UVAL6184)、

凯神刻盘做的矩阵快速幂,并没有看,貌似T了好几发,结果把longlong改int就过了

 #include <stdio.h>
#include <memory.h> const int MAX = ; struct Matrix
{
Matrix() { } Matrix(int R, int C, int M) : R(R), C(C), M(M) { } void Clear()
{ memset(pData, , sizeof(pData)); } void Init(int A, int B, int C)
{
for(int i = ; i < MAX; i++)
{
pData[i][i - ] = A;
pData[i][i] = B;
pData[i][i + ] = C;
}
} Matrix operator + (Matrix& x) const
{
Matrix ans(R, C, M);
for(int i = ; i <= R; i++)
{
for(int j = ; j <= C; j++)
{
ans.pData[i][j] = (pData[i][j] + x.pData[i][j]) % M;
}
}
return ans;
} Matrix operator * (Matrix& x) const
{
Matrix Tmp(R, x.C, M);
Tmp.Clear();
for(int k = ; k <= C; k++)
{
for(int i = ; i <= Tmp.R; i++)
{
for(int j = ; j <= Tmp.C; j++)
{
Tmp.pData[i][j] = (Tmp.pData[i][j] + (pData[i][k] * x.pData[k][j]) % M) % M;
}
}
}
return Tmp;
} Matrix operator ^ (int x) const
{
Matrix ans(R, R, M), Tmp(R, R, M);
memcpy(Tmp.pData, pData, sizeof(Tmp.pData));
ans.Clear();
for(int i = ; i <= ans.R; i++)
{ ans.pData[i][i] = ; }
while(x)
{
if(x & ) { ans = ans * Tmp; }
x >>= ;
Tmp = Tmp * Tmp;
}
return ans;
} int R, C, M;
int pData[MAX][MAX];
}; int S[MAX];
int N, M, A, B, C, T; int main()
{
while(scanf("%d%d%d%d%d%d", &N, &M, &A, &B, &C, &T) != EOF)
{
if(N == && M == && A == && B == && C == && T == ) { break; }
Matrix X(N, N, M);
X.Clear();
X.Init(A, B, C);
X = X ^ T;
for(int i = ; i <= N; i++)
{ scanf("%d", &S[i]); }
for(int i = ; i <= N; i++)
{
int ans = ;
for(int j = ; j <= N; j++)
{
ans += X.pData[i][j] * S[j];
ans %= M;
}
printf("%d", ans);
if(i != N) { printf(" "); }
}
printf("\n");
}
return ;
}

D(UVAL6185)、

高斯消元,做的时候还不会高消,拿了本红书看高消模板,然后就敲了,纠结了好久。这题就是有d个未知量的d+3个线性方程的解,其中有一个是错误的,要求出是哪一个解,明白高消模板后,由于方程最多只有7个,所以我就准备直接暴力枚举,选两个作为备选方程,其余的式子可以解出一组解,由于系数分别是0~d+2的幂次,所以所有的方程都不可能出现系数成比例的情况,所以一定能解出一组特解而不是通解,然后用求出的解判断剩下两组方程是否正确,如果一个正确一个错误,那么错误的那个方程就是要求的。

虽然方向正确,但是卡在了精度上,我一开始按题意定1e-6,发现后面的解被舍去了,于是一步步加大精度,一度开到1e-13都并没有成功,最后换成1e-5就过了,过大的精度把误差正好1e-6的解卡掉了```

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define eps 1e-5 const int maxn=; int n;
double ans[];
bool l[];
double num[]; inline void solve(double a[][maxn]){
int res=,r=;
for(int i=;i<n;i++){
l[i]=;
}
for(int i=;i<n;i++){
for(int j=r;j<n;j++){
if(fabs(a[j][i])>eps){
for(int k=i;k<=n;k++){
swap(a[j][k],a[r][k]);
}
break;
}
}
if(fabs(a[r][i])<eps){
res++;
continue;
}
for(int j=;j<n;j++){
if(j!=r&&fabs(a[j][i])>eps){
double tmp=a[j][i]/a[r][i];
for(int k=i;k<=n;k++){
a[j][k]-=tmp*a[r][k];
}
}
}
l[i]=,++r;
}
for(int i=;i<n;i++){
if(l[i]){
for(int j=;j<n;j++){
if(fabs(a[j][i])>){
ans[i]=a[j][n]/a[j][i];
}
}
}
}
}
int d; bool judge(int x){
double ans1=,ans2=num[x];
double tmp=;
for(int i=d;i>=;i--){
ans1+=ans[i]*tmp;
tmp*=x;
}
// if(x==0)printf("0 %lf %lf\n",ans1,ans2);
if(fabs(ans1-ans2)<eps)return ;
else return ;
} double a[][maxn]; int main(){
while(scanf("%d",&d)!=EOF&&d){
n=d+;
int i,j;
bool f=;
for(i=;i<=d+;i++){
scanf("%lf",&num[i]);
}
int k;
for(i=;i<d+&&f;i++){
for(j=i+;j<=d+&&f;j++){
int cnt=;
for(k=;k<=d+;k++){
if(k!=i&&k!=j){
a[cnt][d+]=num[k];
double num1=k;
a[cnt][d]=;
for(int p=d-;p>=;p--){
a[cnt][p]=num1;
num1*=k;
}
cnt++;
}
}
/* if(i==0&&j==1){
for(int q=0;q<=n;q++){
for(int w=0;w<=n;w++){
printf("%lf ",a[q][w]);
}
printf("\n");
}
}
*/ solve(a);
bool f1=judge(i),f2=judge(j);
/* if(i==0&&j==1){
printf("%d %d\n",judge(0),f2);
for(int q=0;q<=n;q++)printf("%lf ",ans[q]);
printf("\n");
}
*/ if(f1!=f2){
if(f1)printf("%d\n",j);
else printf("%d\n",i);
f=;
}
}
}
}
return ;
}

E(UVAL6186)、

刻盘说是BFS套BFS,然而并没有敲掉就是这样```

F(UVAL6187)、

刻盘开场看的水题,就是给出两个数的差值,或者询问两个数的差值,裸的带权并查集

 #include<stdio.h>
#include<string.h>
using namespace std;
typedef long long ll; int fa[];
ll num[];
char s[]; void init(int n){
for(int i=;i<n;i++){fa[i]=i;num[i]=;}
} int find(int x){
ll r=x,t1,t2,c=;
while(r!=fa[r]){
c+=num[r];
r=fa[r];
}
while(x!=r){
t1=fa[x];
t2=c-num[x];
num[x]=c;
fa[x]=r;
c=t2;
x=t1;
}
return r;
} int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&(n+m)){
int i,j,a,b,c;
init(n+);
for(i=;i<=m;i++){
scanf("%s",s);
if(s[]=='!'){
scanf("%d%d%d",&a,&b,&c);
int x=find(a),y=find(b);
if(x!=y){
fa[x]=y;
num[x]=num[b]+c-num[a];
}
}
else if(s[]=='?'){
scanf("%d%d",&a,&b);
int x=find(a),y=find(b);
if(x!=y){
printf("UNKNOWN\n");
}
else printf("%lld\n",num[a]-num[b]);
} }
}
return ;
}

G(UVAL6188)、

据说是一道计算几何,然而比赛的时候并没有人看这题```估计相对较难吧```

H(UVAL6189)、

并没有看过```

I(UVAL6190)、

一道关于排版的题目,一段文本,每个单词有分别的字母数,然后每个字母占一格,一行固定格数,要求保证单词依次放入,行首行末单词顶格,单词之间必须要用空格隔开,问词间空格数的最大值最小是多少。

我开始看这题的时候凯神和刻盘已经讨论挺久了,意见倾向于二分答案,但是如何判断答案是否可行还没有想法,贪心据说不行,于是我觉得是dp来判定,但是的普通来说这里dp就会是O(n2)的算法,显然会T。补题的时候才听指点说是单调性优化成O(n)。我的做法是,对于每个可行的作为行开头的单词,拓展出下一个可行的开头单词,就是如果以这个单词为行首,那么到后面某个单词如果中间的空格平均下来 >=1 又 <= 枚举的答案,那么那个单词的就可以做为行末,也就是再之后的一个单词就可以作为行首。  ①由于是可行性dp,所以如果这个单词被判断可行,那么之后显然就不需要再判断了,  ②而如果这个单词作为行末和行首单词之间需要的空格数比答案大,那么下一次枚举的行首单词一定更靠近该单词,那么中间的空格显然会更大,一定不可行,所以也不需要判断,   ③而如果这个单词和行首单词之间需要的空格数平均下来<=1 ,那么对于这个行首单词就已经不需要再判断更后面的但是是否可以作为行末,因为放在同一行的话空格数会更小,就可以直接break出循环,所以总体就是类似两个指针分别从1到n的判断,即O(2n)。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; int x[],s[];
bool vis[];
int w,n; bool judge(int l){
int i,j;
memset(vis,,sizeof(vis));
vis[]=;
int pos=;
for(i=;i<=n;i++){
if(vis[i]){
int sum2=s[n]-s[i-],cnt2=n-i;
if(sum2+cnt2<=w){
return ;
}
bool f=;
for(j=pos;j<=n;j++){
int sum=s[j]-s[i-],cnt=j-i;
if(sum+cnt>w)break;
if(sum+l*cnt>=w){
vis[j+]=;
}
pos=j+;
}
}
}
return ;
} int main(){
while(scanf("%d%d",&w,&n)!=EOF&&(w+n)){
int i,j;
memset(s,,sizeof(s));
for(i=;i<=n;i++){
scanf("%d",&x[i]);
s[i]=s[i-]+x[i];
}
// for(i=1;i<=n;i++)printf("%d ",s[i]);
// printf("\n");
int l=,r=w;
while(l<=r){
int mid=l+((r-l)>>);
// printf("%d %d %d %d\n",l,r,mid,judge(mid));
// if(mid==2)printf("%d\n",judge(mid));
if(judge(mid)){
r=mid-;
}
else l=mid+;
}
printf("%d\n",l);
}
return ;
}

J(UVAL6191)、

开场我从后往前看的题,所以一开始就看的这题,题目看到一半就取敲题目了,然后基本一路敲题调试到结束,所以这道题也就没有看了,貌似是个神题,总之是没有几个队做出来昂,然后就没有然后了```

2012年东京区域赛 UVAlive6182~6191的更多相关文章

  1. HDU 4438 Hunters 区域赛水题

    本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数 ...

  2. HDU5558 Alice's Classified Message(合肥区域赛 后缀数组)

    当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下. i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i] ...

  3. 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)

    这题是某年成都区域赛网络赛的一题. 这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星. 採用线上查询.利用map对字符串编号,由于非常方便.要推荐的朋友,事实上就是朋友的朋 ...

  4. 【2013南京区域赛】部分题解 hdu4802—4812

    上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...

  5. hdu5080:几何+polya计数(鞍山区域赛K题)

    /* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...

  6. 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

  7. 【转】2014区域赛小结(牡丹江&&鞍山)by kuangbin

    Posted on 2014年10月20日 by kuangbin 最后的两场区域赛结束了! ICPC生涯的最后两场区域赛,选择了前两个赛区——牡丹江和鞍山,主要是时间比较靠前,而且我向来对东北赛区有 ...

  8. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

  9. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

随机推荐

  1. WPF 的 数据源属性 和 数据源

    (一)数据源(数据对象)属性 :path 或  path的值(path=VM.Property或M.Property),通常具有通知功能(特例除外). (二)path不能孤立而存在,它一定具有所归属的 ...

  2. 关于c#除法运算的问题

    https://blog.csdn.net/yxt1522916229/article/details/51107569/ 下面的示例可以验证一下问题: 例如: int m = 2;         ...

  3. 『科学计算』通过代码理解SoftMax多分类

    SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...

  4. bootstrap滑动开关插件使用

    下载和演示插件地址 需要引入的css和js <link rel="stylesheet" type="text/css" href="/css/ ...

  5. 蓝桥杯—ALGO-18 单词接龙(DFS)

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, 要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ,在两个单词相连时,其 ...

  6. 使用Messenger 从Activity发送数据到service 通过后台计算结果Log输出;

    package com.lixu.messenger; import android.app.Activity; import android.app.Service; import android. ...

  7. POJ 1504 Adding Reversed Numbers

    /*Sample Input 3 24 1 4358 754 305 Sample Output 34 1998 */ 值得总结的几点就是: 1.atoi函数将字符串转化为整型数字(类似于强制转换) ...

  8. const关键字的详解

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...

  9. 玩转X-CTR100 l STM32F4 l PS2无线手柄-4WD智能小车

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 前面已介绍X-CTR100控制器解码PS2无线手 ...

  10. VS2003在win7 64位的调试

    win7 64位下安装了VS2003 ,在调试时,一直加载不了W3P.解决方案是.打开VS时,右键已管理员身份打开,即可调试.