ACM国际大学生程序设计大赛(ICPC)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM国际大学生程序设计大赛(ICPC)相关的知识,希望对你有一定的参考价值。

需要以三人团队的身份报名 还是需要跟自己学校联系 也就是说 当地会有社会性质的报名处吗 这件事 一定要通过自己学校吗 那么国内什么样的学校有资格组团参赛

参考技术A 需要跟自己学校联系,一般都是通过指导老师网上报名
一、ACM/ICPC竞赛介绍

(一)有关ACM

美国计算机协会(Association of Computing Machinery, 简称ACM) 创立于1947年, 是一个世界性的计算机从业人员专业组织,也是世界上第一个科学性及教育性计算机学会,同时它也是全球历史最悠久和最大的计算机教育和科研机构。目前ACM提供的服务遍及100余国家,会员人数达80,000多位专业人士,涵盖工商业,学术界及政府单位,并有近1000个机构会员。 ACM致力于发展信息技术教育、科研和应用。全球计算机领域的专业人士将ACM 的出版物和会议记录视做最具权威和前瞻的领导者。

(二)有关ACM/ICPC

ACM/ICPC(国际大学生程序设计竞赛)是由ACM组织的年度性竞赛,始于1970年,是全球大学生计算机程序能力竞赛活动中最有影响的一项赛事,素来被冠以“程序设计的奥林匹克”的尊称,可以说是大学级别最高的脑力竞赛。它为参赛选手展示计算机才华提供了广阔的舞台,是著名大学计算机教育成果的直接体现,是信息企业与世界顶尖计算机人才对话的最好机会。
大赛开始至今已有30年历史,其涵盖的范围很广,大致划分如下:Direct(简单题),Computational Geometry(计算几何),Number Theory(数论),Combinatorics(组合数学),Search Techniques(搜索技术),Dynamic Programming(动态规划),Graph Theory(图论),Other(其他)。

大赛的比赛形式是:经过校级和地区级选拔的参赛组,于指定的时间、地点参加世界级的决赛,由3个成员组成的小组应用一台计算机解决6到10个生活中的实际问题。参赛队员必须在5小时内编完程序并进行测试和调试。此种大赛对参赛学生的逻辑分析能力、策略制定和脑力方面具有极大的挑战性。大赛提倡在压力较大的情况下,培养学生的创造力、团队合作精神以解决竞赛的问题,从而挑选和发掘世界上最优秀的程序设计人才。每届ACM/ICPC竞赛都是精英荟萃、新才辈出,因而倍受全球著名信息企业的高度关注,在过去几年中,APPLE、MICROSOFT和IBM等知名企业分别担任过竞赛的赞助商。

(三)ACM/ICPC在中国的发展情况

我国大陆高校从1996年开始参加ACM/ICPC亚洲预赛,前六届ACM/ICPC亚洲区选拔赛在上海设有赛区,由上海大学主办。2002年,第七届ACM/ICPC亚洲预赛在我国设有2个赛区:北京赛区和西安赛区。北京赛区由清华大学主办,西安赛区由西安交通大学主办。随着各高校参赛积极性的不断提高,大陆地区赛站从02年有所增加。至今,中国大陆地区2008年共设置5个赛站北京、哈尔滨、合肥、成都、杭州。

2008年4月,我校将举办2008大连理工大学 ACM/ICPC程序设计大赛(暨第二届ACM/ICPC东北地区赛大连理工大学校内选拔赛),望广大同学积极踊跃参与。

二、主办单位 学生处 校团委 创新实验学院 软件学院 三、承办单位 软件学院创新实践中心 四、协办单位 冠名/赞助企业 五、参赛队员和参赛资格

1.各参赛队员须为在校研究生一年级、本科学生。 2.以个人为单位参加比赛。3.所有参赛同学必须服从赛事组委会的统一管理。
4.报名资料应具真实性。

六、报名

(一)报名时间 2008年3月19日至2008年3月31日

(二)报名方式 登录软件学院网站http://ssdut.dlut.edu.cn或创新实验学院网站http://tianwei.dlut.edu.cn
下载《ACM/ICPC大学生程序设计大赛报名表》ACM竞赛报名表.doc

打印纸档交至如下地点(视报名情况定在现场赛前是否举行网络预选赛): 软件学院报名地点:创新实践中心(教学楼110)报名;
校部报名地点:ACM/ICPC协会( 研教楼814房间)

(三)咨询电话 0411-87571518;

(四)比赛时间 2008年4月19日 下午 13:30-17:30

(五)比赛地点 软件学院实验中心微机实验室 校部同学将在4月19日中午12:00在主楼毛主席像前发车前往软件学院参加比赛。

比赛结束后校部同学17:40在软件学院信息中心楼下坐车回校部。为了方便各参赛队员与组委会的联系,我们建立了QQ群,群号码:56867105 。希望通过即时通讯来为大家提供更多的方便的服务与帮助。

七、竞赛相关内容

(一)竞赛准备

ACM竞赛不要求使用某一种特定的语言,所以各个队伍可以根据语言的特点和自己的特长选择,如果对语言的原理语法和特点均能做到成竹于胸、滥熟于心,在比赛的过程中就可以大大缩短调试的时间,从而获得优势。
然而编程之道就如武学之道,语言只是各门各派的武功招式,算法和数据结构则好比内功心法和武学原理。内力深厚,任何招式到了手上都能够化腐朽为神奇;掌握了武学原理,更能做到无招胜有招。选手在竞赛中最重要的素质,正体现于对算法和数据结构的掌握和理解上,通过对经典问题的分析,掌握各种算法的应用范围和数据结构的作用与具体实现,是每个选手在平时学习中的重点所在。

(二)竞赛策略

临近比赛,在实力上已经难有质的提高,这时我们不妨将注意力转移到竞赛技巧方面,做不成武学道师也学个韦小宝。在ACM竞赛中,一般来说能成功解决半数或以上题目的队伍已经是相当优秀的,解决所有问题近乎天方夜潭,也就是说无论你的实力如何,都还有很大的改进余地,这其中比较重要的就是竞赛的策略。

(1)分工的问题:团队的配合十分重要,三个队员之间的合理分工可以大大改进解题的效率,根据队员的不同特点,不同的队伍可以采用不同的分配方式,其间一些细节的处理需要三个人有很好的默契。

(2)算法的选择:

在所有可行的算法当中,我们选择的应该是最可行的方法,而不是最高明的方法,这是竞赛与解决问题的一个重要区别,按照熟悉的程度由高到低选择一个算法,通过计算算法的时间和空间复杂度(在必要的情况下)和特殊的测试数据找出一切使该算法不成立的理由,如果找不到就确定该算法并选用相应的数据结构。在确定思路的时候注意比较常见的思维方式分析,比如逆向的分析,对称的分析等等。

(3)程序的编写:

最好首先编写输入和输出的部分,然后逐步细化,一个部分一个部分地填充调试,其间通过适量的注释来刻画程序的逻辑结构和特殊的技巧。在完成全部代码后用一般的测试数据验证代码的正确性,然后处理特殊的情况和边界问题,试图尽可能地找出错误的情况并加以改正。关于程序的优化主要考虑的是最坏情况下所用的时间是否满足要求,优化的程度以题目要求为准,足够即可,尽量避免使用指针和动态分配,在空间允许的情况下一律采用静态分配。

(4)调试中的问题:

调试中会遇到的许多问题需要在事前有所准备并定出总体设计,当然具体的情况还要临场分析,考虑的方面包括程序中的BUG,算法的正确性和数据结构的合理性,什么时候该放弃这个问题,什么时候该返回到先前放弃的问题,是否需要做到或已经做到足够的优化等等。所有关于调试的输入输出都不要删除,将它们注释起来即可。

(5)竞赛中的杂题处理

在竞赛中有时会出现一些新颖的题型,解决它们的算法很难归到经典的算法中去,每个这类的题都有自己鲜明的特点,对于它们根本没有一般的解法。对于这样的挑战,一个新颖的数据结构或一套特殊的循环或判断常常是必须的。解决这种问题的关键在于仔细地阅读题目的叙述,灵感经常来自于将叙述的逻辑条理整理得十分清楚之后,同样,对这类题的优化也是需要的,至少需要避免过多的循环嵌套。

(三)编程与竞赛

学习编程并不是为了参加竞赛,竞赛对于多数选手的意义还是在于参与,以及在备战过程中对自己的锻炼和提高。在这一点上,ACM竞赛和其它一系列竞赛是一样的,只是它的影响力和规模大些罢了,所以笔者希望对编程有兴趣的同学都能够关注竞赛,即使不参加,通过了解竞赛中涉及的编程知识达到课内很难达到的高度,这对每个人都是有益无害的。
ACM主页:http://www.acm.org/

ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

You are given a list of integers a0, a1, …, a2^k-1.

You need to support two types of queries:

1. Output Minx,y∈[l,r] {ax?ay}.

2. Let ax=y.

输入

The first line is an integer T, indicating the number of test cases. (1≤T≤10).

For each test case:

The first line contains an integer k (0 ≤ k ≤ 17).

The following line contains 2k integers, a0, a1, …, a2^k-1 (-2k ≤ ai < 2k).

The next line contains a integer  (1 ≤ Q < 2k), indicating the number of queries. Then next Q lines, each line is one of:

1. 1 l r: Output Minx,y∈[l,r]{ax?ay}. (0 ≤ l ≤ r < 2k)

2. 2 x y: Let ax=y. (0 ≤ x < 2k, -2k ≤ y < 2k)

输出

For each query 1, output a line contains an integer, indicating the answer.

样例输入
1
3
1 1 2 2 1 1 2 2
5
1 0 7
1 1 2
2 1 2
2 2 2
1 1 2
样例输出
1
1
4

线段树模板题,贴个模板代码。

// Asimple
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <string>
#include <cstring>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#define INF 0x3f3f3f3f
#define debug(a) cout<<#a<<" = "<<a<<endl
#define test() cout<<"============"<<endl
#define CLS(a,v) memset(a, v, sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dx[] = {-1,1,0,0,-1,-1,1,1}, dy[]={0,0,-1,1,-1,1,1,-1};
const int maxn = 140000;
const ll mod = 233;
int n, m, T, len, cnt, num, ans, Max, k;
int x, y;
pair<int, int> dat[4*maxn];

void init() {
    for (int i = 0; i < 2 * n - 1; ++i) {
        dat[i].first = INF;
        dat[i].second = -INF;
    }
}
void update(int k, int x) {
    k += n - 1;
    dat[k] = pair<int, int>(x, x);
    while (k > 0) {
        k = (k - 1) / 2;
        dat[k].first = min(dat[2 * k + 1].first, dat[2 * k + 2].first);
        dat[k].second = max(dat[2 * k + 1].second, dat[2 * k + 2].second);
    }
}

pair<int, int> query(int a, int b, int k, int l, int r) {
    if (a <= l && r <= b) return dat[k];
    if (a > r || b < l) return pair<int, int>(INF, -INF);
    pair<int, int> vl = query(a, b, 2 * k + 1, l, (l + r) / 2);
    pair<int, int> vr = query(a, b, 2 * k + 2, (l + r) / 2 + 1, r);
    return pair<int, int>(min(vl.first, vr.first), max(vl.second, vr.second));
}

void input(){
    for(scanf("%d", &T); T--; ) {
        scanf("%d", &k);
        n = (int)pow(2, k);
        init();
        for(int i=0; i<n; i++) {
            scanf("%d", &num);
            update(i, num);
        }
        for(scanf("%d", &m); m--; ) {
            scanf("%d%d%d",&k, &x, &y);
            if( k == 2 ) update(x, y);
            else {
                pair<int, int> p = query(x, y, 0, 0, n-1);
                ll ans = min((ll)p.first*p.first, min((ll)p.second*p.second, (ll)p.first*p.second));
                printf("%lld\n", ans);
            }
        }
    }
}

int main() {
    input();
    return 0;
} 

 

以上是关于ACM国际大学生程序设计大赛(ICPC)的主要内容,如果未能解决你的问题,请参考以下文章

acm、ccpc和icpc的区别是啥?

2017年ACM程序设计大赛结果出炉;SQLite 3.19.0 发布.....

《acm》竞赛有过只有一个人参加的么?

ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛

什么是ACM培训

ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛