只能把补了的题目放这儿了,先留个坑,怕忘记。

Problem G URAL 1806 Mobile Telegraphs

题意是:给定n个电话号码,每个号码是一个长度为10的仅含'0'~'9'的字符串,每两个电话号码a,b之间能通信,需要满足一下条件之一:

1.b能通过改变a中某一个数字的值获得;

2.b能通过交换a中两个数字获得。

n个电话号码不相同,且相互通信的费用由之间的最长公共前缀长度决定。

分析:

对于一个电话号码逐位判断改变某一位的值得到哪些号码,或者交换某两个数字的得到哪些号码,由此判断该号码能与哪些号码通信,通信费用也可以很快求出。

然后就是dijkstra 或者spfa了。注意map存储LL判断的时候,前导0 可能会被忽略。

另外在spfa或dij里面进行边的转移,而不事先把边求出来可以加速过程。

 #include <bits/stdc++.h>
#define esp 1e-6
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define pb push_back
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(x) (x&(-x))
#define mp(a, b) make_pair((a), (b))
#define bit(k) (1<<(k))
#define iin freopen("pow.in", "r", stdin);
#define oout freopen("pow.out", "w", stdout);
#define in freopen("solve_in.txt", "r", stdin);
#define out freopen("solve_out.txt", "w", stdout);
#define bug puts("********))))))");
#define Inout iin oout
#define inout in out #define SET(a, v) memset(a, (v), sizeof(a))
#define SORT(a) sort((a).begin(), (a).end())
#define REV(a) reverse((a).begin(), (a).end())
#define READ(a, n) {REP(i, n) cin>>(a)[i];}
#define REP(i, n) for(int i = 0; i < (n); i++)
#define VREP(i, n, base) for(int i = (n); i >= (base); i--)
#define Rep(i, base, n) for(int i = (base); i < (n); i++)
#define REPS(s, i) for(int i = 0; (s)[i]; i++)
#define pf(x) ((x)*(x))
#define mod(n) ((n))
#define Log(a, b) (log((double)b)/log((double)a))
#define Srand() srand((int)time(0))
#define random(number) (rand()%number)
#define random_range(a, b) (int)(((double)rand()/RAND_MAX)*(b-a) + a) using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<unsigned short> VI;
typedef pair<unsigned short,unsigned short> PII;
typedef vector<PII> VII;
typedef vector<PII, int> VIII;
typedef VI:: iterator IT;
typedef map<string, int> Mps;
typedef map<LL, int> Mpi;
typedef map<int, PII> Mpii;
typedef map<PII, int> Mpiii;
Mpi mps;
const int maxn = ;
const int maxm = + ; unsigned short co[maxn];
unsigned short pa[maxm];
LL a[]; LL s[maxm];
int n;
int d[maxm];
bool inq[maxm]; VII g[maxm];
struct HeapNode
{
int d;
unsigned short u;
HeapNode() {}
HeapNode(int d, unsigned short u):d(d), u(u) {}
bool operator < (const HeapNode &rhs)const
{
return d > rhs.d;
}
};
unsigned short cmp1(LL x, LL y)
{
char ss[][];
sprintf(ss[], "%010I64d", x);
sprintf(ss[] ,"%010I64d", y);
int i = ;
for(i = ; i <= ; i++)
{
if(ss[][i] != ss[][i])
break;
}
return co[i];
}
void bfs(int src)
{
priority_queue<HeapNode> q;
q.push(HeapNode(, src));
d[src] = ;
inq[src] = false;
while(!q.empty())
{
HeapNode u = q.top();
int x = u.u;
int dd = u.d;
q.pop();
if(inq[x])
continue;
inq[x] = true;
char ss[];
sprintf(ss+, "%010I64d", s[x]);
Rep(j, , )
{
int c = ss[-j]-'';
REP(k, )
{
if(k == c)
continue;
LL tmp = s[x] + (k-c)*a[j-];
if(mps.count(tmp))
{
int y = mps[tmp];
int l = cmp1(s[x], s[y]);
if(d[y] > dd + l)
{
pa[y] = x;
d[y] = dd + l;
q.push(HeapNode(d[y], y));
}
}
}
}
Rep(j, , ) for(int k = j+; k <= ; k++)
{
int c1 = ss[-j]-'';
int c2 = ss[-k]-'';
if(c1 == c2)
continue;
LL tmp = s[x] + (c2-c1)*a[j-] + (c1-c2)*a[k-];
if(mps.count(tmp))
{
int y = mps[tmp];
int l = cmp1(s[x], s[y]);
if(d[y] >dd + l)
{
pa[y] = x;
d[y] = dd + l;
q.push(HeapNode(d[y], y));
}
}
}
}
}
VI ans; void print(int s)
{
ans.pb(s);
while()
{
s = pa[s];
ans.pb(s);
if(s == )
break;
}
printf("%d\n", ans.size());
VREP(i, ans.size()-, )
{
printf("%hu%c", ans[i], i == ? '\n' : ' ');
}
}
int main()
{ a[] = ;
Rep(i, , )
a[i] = a[i-]*;
scanf("%d", &n);
REP(i, )
scanf("%hu", co+i);
Rep(i, , n+)
{
scanf("%I64d", s+i);
mps[s[i]] = i;
d[i] = inf;
inq[i] = false;
} bfs();
if(d[n] >= inf)
puts("-1");
else
{
printf("%d\n", d[n]);
print(n);
}
return ;
}

Problem D URAL 1803 The Czechs' Rifles

题意:实际上就是要你求出前n个斐波那契数的k进制表示下,各个位数之和,然后再排序输出。

分析首先可以证明的是,fn <= 2*fn-1,所以fn <= 2^n,所以可以这样求每个斐波那契数的k进制表示下各数位之和,将其表示成cnt进制的数,cnt为不超过n的k的最大次幂,

然后预处理出来小于cnt的各个数的k进制下数位之和。接下来就是通过前两项酸算出当前的斐波那契数,然后并将其k进制下各位加起来。这个过程其实就是模拟的一个大数加法的过程。

 #include <bits/stdc++.h>
#define in freopen("solve_in.txt", "r", stdin);
using namespace std;
const int maxn = + ;
struct Node
{
int id, su;
bool operator < (const Node &rhs)const
{
if(su == rhs.su)
return id < rhs.id;
return su < rhs.su;
}
} ans[maxn];
int sum[maxn];
int dp[][maxn]; int n, k;
int main()
{ scanf("%d%d", &k, &n);
int cnt = ;
while(cnt * k < maxn)
cnt *= k;
for(int i = ; i < maxn; i++)
{
int tmp = i;
while(tmp)
{
sum[i] += tmp%k;
tmp /= k;
}
}
dp[][] = dp[][] = ;
ans[].id = , ans[].id = ;
ans[].su = ans[].su = ;
int st = ;
for(int i = ; i <= n; i++)
{
int delta = ;
int now = i&;
int pre = now^;
ans[i].id = i;
for(int k = ; k < st; k++)
{
dp[now][k] += dp[pre][k] + delta;
if(dp[now][k] >= cnt)
{
delta = dp[now][k]/cnt;
dp[now][k] %= cnt;
}
else delta = ;
ans[i].su += sum[dp[now][k]];
}
if(delta)
dp[now][st++] = delta;
ans[i].su += sum[delta];
}
std::sort(ans+, ans++n);
for(int i = ; i <= n; i++)
printf("%d%c", ans[i].id, i == n ? '\n' : ' ');
return ;
}

NEERC 2010, Eastern subregional contest的更多相关文章

  1. NEERC 2013, Eastern subregional contest

    I. The old Padawan Time limit: 0.5 secondMemory limit: 64 MB Yoda: Use the Force. Yes. Now, the ston ...

  2. NEERC 2014, Eastern subregional contest

    最近做的一场比赛,把自己负责过的题目记一下好了. Problem B URAL 2013 Neither shaken nor stirred 题意:一个有向图,每个结点一个非负值,可以转移到其他结点 ...

  3. 2013-2014 ACM-ICPC, NEERC, Eastern Subregional Contest PART (8/10)

    $$2013-2014\ ACM-ICPC,\ NEERC,\ Eastern\ Subregional\ Contest$$ \(A.Podracing\) 首先枚举各个折现上的点,找出最小宽度,然 ...

  4. 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem G. The Debut Album

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定n,a,b的值 求一个长度为n的 ...

  5. 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal

    题目链接:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定一个长度为2n,由n个大写字母和 ...

  6. Round 0: Regionals 2010 :: NEERC Eastern Subregional

    Round 0: Regionals 2010 :: NEERC Eastern Subregional 贴吧题解(官方)? 网上的题解 水 A Murphy's Law 题意:Anka拿着一块涂着黄 ...

  7. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

  8. 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...

  9. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

随机推荐

  1. 【转】Myeclipse8.5 反编译插件 jad 安装

    [转]Myeclipse8.5 反编译插件 jad 安装 准备工作 下载jad.exe文件下载window版本:http://varaneckas.com/jad/ 下载jadeclipse插件:ht ...

  2. 第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题

    如图1代码所示,初始化一个NSURLSession临时实例对象并由它发起一个网络请求.我们通过Instruments的Leaks工具会发现其存在内存泄漏和循环引用的地方,如图2所示. 通过NSURLS ...

  3. javascript 第27节 jQuery选择器

    下面的html需要以下2个文件: 1.style.css div,span,p { width:140px; height:140px; margin:5px; background:#aaa; bo ...

  4. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

    本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...

  5. HttpWatch网络抓包工具的使用

    HttpWatch网络抓包工具是专为IE浏览器集成的一款网络拽包工具.   是一款强大的网页数据分析软件,是最好用的抓包工具,httpwatch可以抓到上传视屏图片的包,一般的抓包软件是抓不到的.打开 ...

  6. ThinkPHP3.2 加载过程(一)

    加载过程(官方介绍) : 用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导 ...

  7. Sharepoint 2010 Workflow 发布

    1.首先需要有一个已经创建好的WorkFlow 2.然后在Sharepoint中打开这个WorkFlow,点击Save as Template,系统会自动将这个Workflow保存在Site Asse ...

  8. sql执行超时处理

    首先设置数据库的配置文件  看看效果 如果程序还是超时则在连接字符串中做出处理 不然程序会自动kind的连接进程   程序和数据库方面都要配置缺一不可

  9. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  10. leetcode Insert Interval 区间插入

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...