Contest_6 0619 By lhq

来源:互联网 发布:java类的定义格式 编辑:程序博客网 时间:2024/06/01 20:37

转载请注明出处:http://blog.csdn.net/lhq_er/article/details/73611080

想看改编的题目的请移步文章末尾。

solution

T1 灰色的果实 来源:poj2152 原题

30%:暴搜+状压
100%:我们设dp[i][ j]表示第i 个点选第j 号点为保护点的时候的最小代价,
best[i]为第i 个点及其子树全部被保护所需最小代价。那么,我们就可以考
虑从叶节点向上DP。对于当前的决策节点u,我们可以枚举在lim[u]范围之
内的节点w为保护点。
那么有dp[u][w]=time[w]+sum(min(dp[v][w]-time[w],best[v]))。
(其中v为u的子节点)
这样的意思是v以w做保护点(dp[v][w]-time[w])或是v以其它点作为
保护点(best[v])中的最小值。
至于best[u]的更新,则是取min(dp[u][w])。
非常不错的树形DP,可以打开某些僵化的思维。

Tips: 这道题目在“国家集训队2006论文集-陈启峰.ppt”或者“算法合集之《“约制、放宽”方法在解题中的应用》.ppt”中单独讲解了,大家如果想要更深入的了解这道题目可以去看看,还有一篇文章“算法合集之《“约制、放宽”方法在解题中的应用》.doc”也提到了这题,这两篇文章还讲到了解决这道题目的一些方法,或者说是怎么想到这么做这道题目的。

给几个现在链接吧,其实就是百度文库里的,不要下载券
https://wenku.baidu.com/view/8e81cac789eb172ded63b7ae.html?from=search
https://wenku.baidu.com/view/d2c80e1c59eef8c75fbfb3ae.html?from=search&isbtn=2

T2 星空的记忆 来源: poj2912原题

一道并查集+暴力枚举,感觉暴力枚举才是最难想到的(汗),还有比较难的就是在第几轮发现rainbow star(也就是judge),枚举其他星星(人)时会有一个发现错误的时间,这些时间中的最大值就是判断出正解的时间,因为需要这些时间来否定别的解。

T3 失去的记忆 来源:BZOJ3439原题

trie树+线段树 表示我还不会,等我回了再来更新

总结:

T1的树形DP为我们介绍了一种新的思维,PPT论文中提到的“约制”“放宽”是一种很重要的OI方法,很多地方我们都可以这种方法化繁为简或者找出头绪,建议去看一下论文。T2这道并查集在练习中有过,只是当时没做(尴尬),这告诉我们平时题目要多做啊。。T3的trie树曾经做到过题目,只是没有系统地学过,这次要好好学一下,顺便学一下可持久化线段树(主席树)。

CODE

T1

#include<bits/stdc++.h>using namespace std;const int MAXN=2005;int Head[MAXN],Next[MAXN*2],To[MAXN*2],Key[MAXN*2],tot=0,n;int dis[MAXN][MAXN],dp[MAXN][MAXN],cost[MAXN],lim[MAXN],ans[MAXN];bool vis[MAXN];void add(int x,int y,int z){    tot++;    Next[tot]=Head[x];    Head[x]=tot;    To[tot]=y;    Key[tot]=z;}void GetDis(int s,int dis[]){    queue<int>Q;    memset(vis,false,sizeof(vis));    vis[s]=true; Q.push(s); dis[s]=0;    while (!Q.empty())    {        int u=Q.front(); Q.pop();         for (int i=Head[u];i;i=Next[i])        {            int v=To[i],w=Key[i];            if (!vis[v]) dis[v]=dis[u]+w,Q.push(v),vis[v]=true;        }    }}void dfs(int u,int pre){    for (int i=Head[u];i;i=Next[i])    {        int v=To[i],w=Key[i];        if (v!=pre) dfs(v,u);    }    for (int i=1;i<=n;i++)    {        if (dis[u][i]>lim[u]) continue;        dp[u][i]=cost[i];        for (int j=Head[u];j;j=Next[j])        {            int v=To[j];            if (v==pre) continue;            dp[u][i]+=min(dp[v][i]-cost[i],ans[v]);        }        ans[u]=min(ans[u],dp[u][i]);    }}void Solve(){    for (int i=1;i<=n;i++)        GetDis(i,dis[i]);    dfs(1,0);    cout<<ans[1];   }void ReadInfo(){    scanf("%d",&n);    for (int i=1;i<=n;i++)        scanf("%d",&cost[i]);    for (int i=1;i<=n;i++)        scanf("%d",&lim[i]);    for (int i=1;i<=n-1;i++)    {        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        add(x,y,z); add(y,x,z);    }    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            dp[i][j]=0x3f3f3f3f;    for (int i=1;i<=n;i++) ans[i]=0x3f3f3f3f;}int main(){    ReadInfo();    Solve();        return 0;}

T2

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;#define ll long longconst int MAXN=1000,MAXM=10000;int fa[MAXN],rank[MAXN],val[MAXN],ans[MAXN];int a[MAXM],b[MAXM],c[MAXM];int T,n,m,Round,tot;int getfa(int x){    if (x==fa[x]) return x;    int fx=fa[x];    fa[x]=getfa(fa[x]);    val[x]=(val[fx]+val[x])%3;    return fa[x];}void case_0(){    if(n==0) printf("Baka stars!\n");    else if(n==1) printf("Found rainbow star 0 after 0 rounds.\n");    else    {        printf("These stars can be rainbow stars:");        for(int i=0;i<n-1;i++)            printf("%d ",i);        printf("%d.\n",n-1);    }}bool Union(int x,int y,int z){    int fx=getfa(x),fy=getfa(y);    if (fx==fy)    {        int r=(val[y]-val[x]+3)%3;        if (r!=z) return false;         else return true;    }    else    {        if (rank[fx]<rank[fy]) //merge x to y;        {            fa[fx]=fy;            val[fx]=(val[y]-z-val[x]+6)%3;        }        else // merge y to x;        {            fa[fy]=fx;            val[fy]=(val[x]+z-val[y]+3)%3;            if (rank[fx]==rank[fy]) rank[fx]++;        }        return true;    }}void solve(){    if (m==0) {case_0(); return;}    tot=0,Round=0;    for (int i=0;i<n;i++)    {        bool flag=true;        for (int j=0;j<n;j++) fa[j]=j,rank[j]=0,val[j]=0;        for (int j=1;j<=m;j++)        {            int x=a[j],y=b[j],z=c[j];            if (x==i || y==i) continue;            else             {                if (!Union(x,y,z))                {                    Round=max(Round,j);                    flag=false;                    break;                }            }        }        if (flag) ans[++tot]=i;    }    if (tot==0) printf("Baka stars!\n");    else if (tot==1)          printf("Found rainbow star %d after %d rounds.\n",ans[1],Round);    else    {        printf("These stars can be rainbow stars:");        for(int i=1;i<tot;i++)            printf("%d ",ans[i]);        printf("%d.\n",ans[tot]);    }}int main(){    scanf("%d",&T);    while (T--)    {        scanf("%d%d",&n,&m);        for (int i=1;i<=m;i++)        {            char ch;            scanf("%d%c%d",&a[i],&ch,&b[i]);            if (ch=='=') c[i]=0;            else if (ch=='<') c[i]=1;            else if (ch=='>') c[i]=2;        }        solve();    }    return 0;}

Problem(题目有点长)

MEMORIA Ⅱ

——NOIP暴力模拟赛

By EverNebula

这些都是经历过便会刻骨铭心的记忆,年轻人啊,愿你们珍惜这最懵懂无知的时
刻,当真正经历了这一切后,或许会有恍然大悟之感,也或许会有对于哲学的若有所
思,可不管怎样,你的思想已不如以前那般纯粹,也再也无法回到那个纯真年代了。
注意事项:
1) 评测环境为win8 32位,评测软件:lemon,使用%I64d、%I64u。
2) 所有文件名均为小写,且文件名均以此页面为准。
3) C/C++中函数main()的返回值类型必须是int,程序正常结束时的
返回值必须是0。
4) 对于所有源程序文件,均放置在选手的工作目录下,无子目录。
5) 题目限制有可能更改,若有更改,以公布为准。
6) 题目难度不一定随序号增加。
7) 题目最大难点为题意的理解。
8) 注意事项有按序增加的可能。
9) 标程使用读入优化,请在读入时斟酌时间限制,卡时概不负责。
10) 不保证数据正确性。
11) 不保证源程正确性。
12) 不保证出题人会做。

题目名称 灰色的果实 星空的记忆 失去的未来
源程序文件名 gurizaia.cpp/c/pas hoshi.cpp/c/pas mirai.cpp/c/pas
输入文件名 input.txt input.txt input.txt
输出文件名 output.txt output.txt output.txt
测试点个数 20 20 10
每个测试点分值 5 5 10
每个测试点时限 1 s 1 s 1 s
结果比较方式 忽略行尾空格和文件尾换行
题目类型 传统 传统 传统
建议算法 树链剖分 网络流 后缀自动机
内存限制 256M 256M 256M
考试时间 4 h

~序~ 启程
你是一个平凡的学生,在平凡的小镇长大,有着一对平凡的父母,自然也过
着平凡的生活,直到有一天……
Nebula历2011年一天,在你发呆时,偶然“看见”了发生在你自己身上
的故事,而第二天,它灵验了。从此以后,你便拥有了“未来视”这项看似莫名
其妙但实则存在的荒诞能力。
也许也不能叫做荒诞吧,你通过它救下了你的至亲,也成功地在各种场合或
多或少地帮助了他人。
Nebula历2014年冬日夜,投宿于山间的温泉旅馆。你本想闲适地度过冬
假的,可一切,都因为昨夜的鬼魅女子的造访而破坏了。“要看一下这个吗?要
看一下你所窥视不到的世界吗?”她这样说了,说罢,便留下了一个奇特万华镜。
透过“未来视”,你看到了对面美丽得妖艳的异世界,之后的命运,甚至连“未
来视”也无法看透。本能的好奇心,催使着你去探寻真相。
随后,你通过你的机智破解了万华镜的谜题,前往了那个前途未知,却同时
也让人心跳不已的异世界。
身体漂浮在穿梭的通道内,无瑕观赏周围的流光溢彩。你知道一点,这条路,
既然选择了就无法返回,但不过你也坚定了你的决心,作为一个冒险者,以一个
冒险者的姿态,探索这个世界,最终活下来,向你的家人、朋友乃至全世界的人
类共享你的奇特经历。
连“未来视”也无法看穿的异世界的前途,是福,还是祸呢?
冒险,进一步深入了……

~壹~ 灰色的果实 (gurizaia.cpp/c/pas)
Time Limit: 1 s Memory Limit: 256 M
问题描述
「即使世界全是灰色的,你也能用自身添上一道微不足道的色彩」
——摘自Ever语录
Nebula历2014年12月17日,欢迎来到异世界。
面对截然不同的新世界,你决定采取最普通但最为有效的方式来探索,那便
是徒步。准备好营地的一切,你开始了探索的旅程。
步行大约10分钟的路程,穿过森林,你来到了一个悬崖,极目远眺,你看
见了梦幻般的光景。一棵高大的无法用言语描述的数耸立于悬崖的对岸,其冠直
冲云天,其根深入地下。而这棵大树,最引人瞩目的就是结于其枝上的两颗灰色
的果实。
忽然,古老而悠远的声音传入你的脑海之中:“掌握未来之人必先经过命运
的磨练。拥有‘未来视’受命运牵引前来的人类啊,在这个万华镜的世界,一共
有三个关卡,逐一通过考验之后,前进之道路将会展现于你的面前。第一个考验
规则写于旁边的牌子,详情请参阅。”
你将目光转向一旁的木牌。上书道:
此树为灰色果实之树,不定时会长出灰色果实。贸然接近果实只会使得自己受其迷惑最后神经错乱而
浑浑噩噩不得终日,与死人无异。你的目标是成功到达树的顶端,砍下灰色果实的灵脉。
为了能够免除灰色果实的影响,你需要在灰色果实力量微弱时在树的各个点
设置若干个保护点,保护点内燃烧着镇定人心的香,以此来抵御灰色果实的精神
袭击。一个点必须在lim[i]距离以内有保护点才能收到保护。而且,由于在树上
作业,地形十分崎岖,使得不同点设置保护点的作业时间time[i]不同。
谋求最大的效率,请求出保护点笼罩整棵树所需的最短作业时间。

输入格式
第一行一个整数 n 表示树的初始节点数。
第二行n个整数 time[i] ,表示此点设置保护点的作业时间。
第三行n个整数 lim[i] ,表示点受到保护的限制距离。
第四行到第 n+3 行为树的初始边,有三个整数x,y,z,代表x到y有一
条长度为z的枝条。

输出格式
一个数为保护点笼罩整棵树所需的最短作业时间。

样例输入(input.txt)
Sample1 Sample2
5
1 1 1 1 1
1 1 1 1 1
1 2 1
2 3 1
3 4 1
4 5 1
4
2 1 1 1
3 4 3 2
1 2 3
1 3 3
1 4 2

样例输出(output.txt)
Sample1 Sample2
2 2

数据范围
30% n≤20
70% n≤100
100% n≤2000
边权≤150
保护所修建费用≤1000 (这些都不重要 )

注:[题意] 若有不懂的,可以理解为在n个点中设置若干个特殊点,使得特殊点保护
整棵树。
[答案] 答案保证在 int 范围之内。

~贰~ 星空的记忆(hoshi.cpp/c/pas)
Time Limit: 1 s Memory Limit: 256 M
问题描述
「你永远数不完所有的星星,即使是自己的星空」
——摘自Ever语录
“Nebula历2014年12月21日晚8时,‘灰色的果实’破关成功。“,
随着这一声天之音,你结束了第一关的挑战,藤蔓搭成了一座桥让你通过了这个
悬崖,你连夜向前走去……
一个小时过去,你走到了一个石柱广场,皎洁的月光照射着你的面庞,月亮
周围的星星也不示弱地放出其光芒。漫天的繁星构成了一条银河,从远方来,向
远方去。或大或小的光芒,让你回忆起了,童稚之时在流星下的记忆……
回过神来,你决定先做正事,将目光投向右边被藤蔓掩盖的石碑:
这片天空的n颗星星分为三个属性,分别为水、火、草。水克火,火克草,草克水。当你决定开始挑
战时,接下来天空会出现m轮星星的相互碰撞,每轮天空会随即出现两颗星星进行碰撞,同时会告诉你星
星的编号。根据碰撞之后光亮值的变化你会很容易看出碰撞的结果,光亮值大者克制小者,若光亮值相同
则同为一种属性。在这n颗星星中,有一颗是rainbow star,它在每次碰撞之前会随即变换一种属性,请
求出rainbow star的编号。
你将m轮的对局后的光亮值情况记录了下来,之后就靠你通过这些既知的
信息求出rainbow star了。当然,你有可能记录错误,或是对局场数不足以让
你求出答案,这些场合请详见输出格式。
注:[题意] 若有不懂的,可以对照样例进行推敲。
[rainbow star] rainbow star 的变换是不确定的,有可能胜,也有可能负。
输入格式
本题含有多组数据,第一行一个整数T代表数据组数。
对于每一组数据,第一行有两个整数n,m分别代表人数与回合数。
之后m行,每行形为“x> y”“x< y”“x=y”,分别表示x光亮值大于y,
x小于y,x等于y。(x 、y均为编号)

输出格式
对于每一组数据:
若能确定哪一个星星为rainbow star,则输出“Found rainbow star x
after y rounds.”,表示编号为x的星星为rainbow star,且最早在第y回合
之后可以判明。
若rainbow star的可能性有2个及其以上,则输出“These stars can be
rainbow stars:x1 x2 x3.”,x1~xn为可能为rainbow star的星星编号。
若绝对不存在任何一个rainbow star,则输出“Baka stars!”

样例输入(input.txt)
Sample 1 Sample 2 Sample 3
1
3 3
0<1
1<2
2<0

1
3 5
0<1
0>1
1<2
1>2
0<2
1
4 4
0<1
0>1
2<3
2>3
样例输出(output.txt)
Sample 1
These stars can be rainbow stars:0 1 2.
Sample 2
Found rainbow star 1 after 4 rounds.
Sample 3
Baka stars!

数据范围
10% n=4;m=10
30% n≤10;m≤35
50% n≤500;m≤2000
100% n≤800;m≤4000
T=10
不会出现重复的对局

~叁~ 失去的未来(mirai.cpp/c/pas)
Time Limit: 1 s Memory Limit: 256 M
问题描述
「失去了,就有机会得到更好的」
——摘自Ever语录
Nebula历2014年12月24日,继续向前方迈进。
既然到这了,已经没有什么好害怕的了。目标,夺回失去的未来!
站在暂时被封锁的回到现实世界的门前,你阅读着最后一个考验的规则。
这扇门需要一串密码才可以打开,而这串密码的提示就在手中的一本魔法书里。我们首先来认识一下
魔法咒语的组成,为了方便元素的驱动,魔法咒语的吟唱只有两个音节组成,分别为 Ine(I) 和 Zwei(Z)。
若干个音节可以组成一个音组,例如音组 IIZ 音组 IZI。一串魔法咒语,则是由若干个音组构成的。若一
条魔法咒语x的语尾包含另一个魔法咒语y,称x为y的高阶魔法。例如 Z-IZ-IIZ 是 IZ-IIZ 的一个高阶魔
法。注意,y也是y本身的一个高阶魔法。
那么,问题来了,在这本魔法书中,有n个魔法咒语,请对于第i个魔法咒
语,求出它的第f[i]个高阶魔法的编号,答案便是开门的密码了。
注:[编号] 编号由1到n,第f[i]个高阶魔法表示从第一个魔法开始数,第f[i]个满足条件
的魔法。
[音组] 一个音组的组成最多不超过四个音节,音组之间用符号“-”相连。

输入格式
第一行一个整数n,代表魔法咒语总数。
第二行n个整数,代表f[i]。
第三行到第n+2行共有n个字符串,形式为多个音组,音组之间用符号“-”
相连。
保证行末无多余空格。
输出格式
输出文件有n行,输出第i个魔法咒语的第f[i]个高阶魔法的编号。
若不存在则输出 -1 。
样例输入(input.txt)
Sample
3
1 2 3
Z
IZ-Z
IIZ-IZ-Z
样例输出(output.txt)
Sample
1
3
-1
数据范围
数据点 限制
20% n≤500;魔法咒语 音组个数≤1000
100% n≤100000;魔法咒语 音组个数≤300000

~终~ 冬日的落幕
经过了异世界的数天旅程,你总算成功在平安夜之前回到了现实世界。
异世界的荒唐旅行让你明白了一点,纵然能够通过“未来视”模糊地知晓未
来,也无法看透一切。因为,未来,一直都掌握在自己的手中啊。一边在心中默
念道,一边看着在节日里洋溢着喜悦的伙伴们。
明天,会好吗?答案是肯定的吧。

~后记~
我到底在写些什么(扶额)……我的未来会怎么样我一点都不知道,我也不
想知道;未来掌握在手中?笑,好像少了“少部分”三个字;和小伙伴们过圣诞?
说不定明年就只能哭着说当年自己太渣……最后,明天会好吗?我很肯定地告诉
你答案:不会。
最后再次怒跪各位准AK爷。爷,轻点虐……
By EverNebula

提示:暴力可AC
~fin~

原创粉丝点击