【NOI2013】小Q的修炼

题目链接:http://uoj.ac/problem/123



又开提答坑啦,要不是一定要讲题谁他妈要这样伤害自己

CASE 1,2

  首先可以打一个通用暴力,用于模拟操作过程,对于每一个操作随机一个选择,然后跑多次记录答案。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<cstring>
  8 #include<string>
  9 #include<ctime>
 10 using namespace std;
 11 #define maxn 1000010
 12 #define llg long long
 13 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
 14 llg n,m,dl[maxn],tail,anst,ans[maxn],val[maxn],maxl,cs;
 15 llg T=1;
 16 char ch,s[maxn];
 17
 18 llg next_x(llg x){x++; while (s[x]==‘ ‘)  x++; return x;}
 19
 20 struct node
 21 {
 22     llg type;
 23     llg t1,v1,t2,v2,fu,to1,to2;
 24 }a[maxn];
 25
 26 llg make_number(llg &x)
 27 {
 28     llg val=0,p=1;
 29     if (s[x]==‘-‘) x++,p=-1;
 30     while (s[x]>=‘0‘ && s[x]<=‘9‘)
 31     {
 32         val*=10;
 33         val+=s[x]-‘0‘;
 34         x++;
 35     }
 36     return val*p;
 37 }
 38
 39 void Decompression_(llg i)
 40 {
 41
 42     llg x=1;
 43     if (s[x]==‘v‘)
 44     {
 45         a[i].type=1;
 46         x=next_x(x);
 47         a[i].v1=make_number(x);
 48         x=next_x(x);
 49         if (s[x]==‘+‘) a[i].fu=1;else a[i].fu=-1;
 50         x=next_x(x);
 51         if (s[x]==‘c‘) a[i].t2=0; else a[i].t2=1;
 52         x=next_x(x);
 53         a[i].v2=make_number(x);
 54     }
 55     if (s[x]==‘s‘)
 56     {
 57         a[i].type=2;
 58         x=next_x(x);
 59         a[i].to1=make_number(x);
 60         x=next_x(x);
 61         a[i].to2=make_number(x);
 62     }
 63     if (s[x]==‘i‘)
 64     {
 65         a[i].type=3;
 66         x=next_x(x);
 67         if (s[x]==‘c‘) a[i].t1=0; else a[i].t1=1;
 68         x=next_x(x);
 69         a[i].v1=make_number(x);
 70         x=next_x(x);
 71         if (s[x]==‘c‘) a[i].t2=0; else a[i].t2=1;
 72         x=next_x(x);
 73         a[i].v2=make_number(x);
 74         x=next_x(x);
 75         a[i].to1=make_number(x);
 76         x=next_x(x);
 77         a[i].to2=make_number(x);
 78     }
 79 }
 80
 81 bool pd(char ch)
 82 {
 83     if (ch>=‘0‘ && ch<=‘9‘) return 1;
 84     if (ch==‘v‘ || ch==‘i‘ || ch==‘+‘ || ch==‘-‘ || ch==‘s‘ || ch==‘c‘ || ch==‘ ‘) return 1;
 85     return 0;
 86 }
 87
 88 void init()
 89 {
 90     cin>>n>>m;
 91     ch=getchar();
 92     for (llg i=1;i<=n;i++)
 93     {
 94         llg len=0;
 95         ch=getchar();
 96         while (pd(ch)) {s[++len]=ch; ch=getchar();}
 97         Decompression_(i);
 98         for (llg i=0;i<=len+1;i++) s[i]=‘\0‘;
 99     }
100 }
101
102 void work()
103 {
104     cs=0;
105     llg x=1,cho;
106     tail=0;
107     for (llg i=1;i<=m;i++) val[i]=0;
108     while (x>=1 && x<=n)
109     {
110         if (a[x].type==1)
111         {
112             if (a[x].t2) val[a[x].v1]+=val[a[x].v2]*a[x].fu;
113             else val[a[x].v1]+=a[x].v2*a[x].fu;
114             x++;
115         }
116         if (a[x].type==2)
117         {
118             cs++;
119             if (cs>1000000) {return ;}
120             cho=rand()%2+1;
121             if (cho==1) x=a[x].to1; else x=a[x].to2;
122             dl[++tail]=cho;
123         }
124         if (a[x].type==3)
125         {
126             llg val1,val2;
127             if (a[x].t1) val1=val[a[x].v1];else val1=a[x].v1;
128             if (a[x].t2) val2=val[a[x].v2];else val2=a[x].v2;
129             if (val1<val2) x=a[x].to1; else x=a[x].to2;
130         }
131     }
132 }
133
134 int main()
135 {
136     yyj("train7");
137     init();
138     srand(time(NULL));
139     fclose(stdin);
140 //    freopen("make.in","r",stdin);
141     maxl=(llg)1e16*-1;
142     T=300000000;
143     while (T--)
144     {
145 //        system("make.exe");
146         work();
147         if (val[1]>maxl && cs<=1000000)
148         {
149             maxl=val[1];
150             anst=tail;
151             for (llg i=1;i<=anst;i++) ans[i]=dl[i];
152         }
153     }
154 //    cout<<maxl<<endl;
155     for (llg i=1;i<=anst;i++) cout<<ans[i]<<endl;
156     return 0;
157 }

    这样可以过第一,二个点,然后一共有31分。。。。

Ans1:

1 1
2 1
3 1
4 1

Ans2:

 1 1
 2 1
 3 2
 4 1
 5 2
 6 1
 7 2
 8 1
 9 1
10 2
11 1
12 2
13 1
14 1
15 1
16 1
17 2
18 2
19 1
20 1
21 1
22 1
23 2
24 1
25 1



CASE 3

   可以发现有很多块,但是每一个块会根据在这个块中的所有变量的变化来修改变量1的值,每一个块中又分为10+个小块,小块中是对于变量2-m的修改,小块首有选择语句,可以选择是否跳过这个小块。

   块与块之间又互不影响,因为块尾会把除了变量1的所有变量全部清空。

   所以说,我们可以爆搜每一个块中的小块的决策,然后统计答案即可。

   

时间: 2024-11-07 18:41:28

【NOI2013】小Q的修炼的相关文章

hdu4505小Q系列故事——电梯里的爱情

小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3626    Accepted Submission(s): 2284 Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯

hdu4505 小Q系列故事——电梯里的爱情(水题)

Problem Description http://acm.hdu.edu.cn/showproblem.php?pid=4505 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q才有勇气如此近距离接近女神,虽然觉得有点不自在,但次数多了,女神也习惯了小Q的存在,甚至熟悉到仿佛不说上句话自己也都觉得不合适了.可是,他们的谈话也仅仅限于今天天气不错啊或是你吃了吗之类的,往往在对方微笑点

重庆OI2017 小 Q 的棋盘

小 Q 的棋盘 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2…,V-1,它们是连通的,也就是说棋子从任意格点出发,总能到达所有的格点.小Q在设计棋盘时,还保证棋子从一个格点移动到另外任一格点的路径是唯一的.小Q现在想知道,当棋子从格点0出发,移动N步最多能经过多少格点.格点可以重复经过多次,但不重复计数. 输入 第

HDU 4520 小Q系列故事——最佳裁判

Time Limit : 500/200ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Problem Description 过去的2012年对小Q来说是很悲催的一年,失恋了12次,每次都要郁闷1个来月. 好在小Q是个体育迷,在最痛苦的时候,他常常用观看各种体育节目来麻醉自己,比如伦敦奥运会期间,小Q就常常在周末邀上一群单身同事聚在自己的蜗居,一边畅饮啤酒,一边吹牛. 小Q最喜欢看的是跳水,主要原因也是因为这个项目有中国人参

【bzoj4972】小Q的方格纸 前缀和

题目描述 方格纸与草稿纸一样,都是算法竞赛中不可或缺的重要工具.身经百战的小Q自然也会随身带着方格纸.小Q的方格纸有n行m列,一共n*m个方格,从上到下依次标记为第1,2,...,n行,从左到右依次标记为第1,2,...,m列,方便起见,小Q称第i行第j列的方格为(i,j).小Q在方格纸中填满了数字,每个格子中都恰好有一个整数a_{i,j}.小Q不喜欢手算,因此每当他不想计算时,他就会让你帮忙计算.小Q一共会给出q个询问,每次给定一个方格(x,y)和一个整数k(1<=k<=min(x,y)),

二分图 [ZJOI2007] 小Q的矩阵游戏

[问题描述] 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: l 行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色) l 列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色) 游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色. 对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本

hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1751    Accepted Submission(s): 628 Problem Description 世界上最遥远的距离 不是生与死 而是我就站在你面前 你却不知道我爱你 世界上最遥远的距离 不是我就站在你面前你却不知道我爱你 而是明明知道彼此相爱

bzoj4814: [Cqoi2017]小Q的草稿

Description 小Q是个程序员.众所周知,程序员在写程序的时候经常需要草稿纸.小Q现在需要一张草稿纸用来画图,但是桌上 只有一张草稿纸,而且是一张被用过很多次的草稿纸.草稿纸可以看作一个二维平面,小Q甚至已经给它建立了直 角坐标系.以前每一次草稿使用过的区域,都可以近似的看作一个平面上的一个三角形,这个三角形区域的内部和 边界都不能再使用.当然了,以前的草稿也没有出现区域重叠的情况.小Q已经在草稿纸上画上了一些关键点,这 些关键点都在没使用过的区域.小Q想把这些关键点两两之间尽可能的用线

小Q系列故事——最佳裁判

Time Limit:200MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 过去的2012年对小Q来说是很悲催的一年,失恋了12次,每次都要郁闷1个来月.  好在小Q是个体育迷,在最痛苦的时候,他常常用观看各种体育节目来麻醉自己,比如伦敦奥运会期间,小Q就常常在周末邀上一群单身同事聚在自己的蜗居,一边畅饮啤酒,一边吹牛.  小Q最喜欢看的是跳水,主要原因也是因为这个项目有中国人参加,而且中国队员获