noi.ac 邀请赛1 By cellur925
A. array
考场:上来就想暴力,首先第一个子任务肯定没问题,怎么搞都行。然后第二个子任务用个数组记下新修的值就行了。第三个子任务用一下等差数列求和公式帮助求解,每次都重新算(因为每次改变全部元素)。期望得分80分,实际得分40分。原因有2:快速乘不仅没快,而且反而把我4个点搞TLE了....我再也不用手写大整数乘法了;5~8测试点,说好的只有A类型,结果考后改了一个多小时都过不了子任务,后来在辰哥的指导下发现数据有锅,5~8数据点藏着B类型的修改。我无fa♂可说。
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; ll n,m;
ll x,y;
ll ans;
char op[];
int seq[];
int a[];
bool vis[]; void re(ll &x)
{
x=;
char ch=getchar();
bool flag=false;
while(ch<''||ch>'') flag|=(ch=='-'),ch=getchar();
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
x=flag ? -x : x;
} ll mul(ll a,ll b)
{
ll res=;
while(b)
{
if(b&) res=(res+a);
b>>=;
a=a*;
}
return res;
} void work1()
{
ll sta=n*(+n)/;
ans=x*sta+y*n;
printf("%lld\n",ans);
for(int i=;i<=m;i++)
{
scanf("%s",op+);
re(x);re(y);
ans=x*sta+y*n;
printf("%lld\n",ans);
}
} void work2()
{
ll sta=mul(n,+n);
sta>>=;
ans=sta;
if(!vis[x])
{
vis[x]=;
ans-=x;
ans+=y;
a[x]=y;
}
printf("%lld\n",ans);
for(int i=;i<=m;i++)
{
scanf("%s",op+);
re(x);re(y);
if(!vis[x])
{
vis[x]=;
ans-=x;
ans+=y;
a[x]=y;
}
else
{
ans-=a[x];
ans+=y;
a[x]=y;
}
printf("%lld\n",ans);
}
} int main()
{
re(n);re(m);
if(n<=)
{
for(int i=;i<=n;i++) seq[i]=i,ans+=i;
for(int i=;i<=m;i++)
{
scanf("%s",op+);
re(x);re(y);
if(op[]=='A')
{
ans=;
for(int j=;j<=n;j++)
seq[j]=j*x+y,ans+=seq[j];
printf("%lld\n",ans);
}
else if(op[]=='B')
{
ans-=seq[x];
seq[x]=y;
ans+=y;
printf("%lld\n",ans);
}
}
return ;
}
scanf("%s",op+);
re(x);re(y);
if(op[]=='A') work1();
else if(op[]=='B') work2();
return ;
}
期望的80
正解:其实我想的很贴近了==。两个操作杂糅一起的情况时,A操作不会受到B操作的影响,而B操作可能会受到A操作的影响。于是我们需要记录一下之前的状态。如果在这个B操作与上一个B操作之间存在一个A操作,那么我们就不能无脑改值。记一个存新值的$seq$数组,再记一个时间戳记录状态的$mar$数组,我们就可以维护了。
#include<cstdio>
#include<algorithm>
#include<map> using namespace std;
typedef long long ll; int pos=;//注意初始值为1!!!!
ll n,m;
ll x,y,px=,py;
ll ans,sta;
char op[];
int seq[];
int mar[]; int main()
{
scanf("%lld%lld",&n,&m);
sta=(+n)*n/;ans=sta;
for(int i=;i<=m;i++)
{
scanf("%s",op+);
scanf("%lld%lld",&x,&y);
if(op[]=='A')
{
pos++;
px=x,py=y;
ans=sta*x+y*n;
printf("%lld\n",ans);
}
else if(op[]=='B')
{
if(mar[x]!=pos) ans=ans-(px*x+py)+y,mar[x]=pos;
else ans=ans-seq[x]+y;
seq[x]=y;
printf("%lld\n",ans);
}
}
return ;
}
AC
B. computer
考场:开始感觉题面晦涩难懂...手算了一下样例也对“随机选取”感到一头雾水...。于是跑去做了大模拟·T3。快结束的时候感觉不要挂题啊...于是逼着自己写了一个奇怪的暴力,因为是重复上述过程直到稳定,所以可以乱搞一个“随机算法”,让他跑2000次,目测能通过50%的数据,本来不抱希望的,结果我乱搞搞了最高的分数???
#include<cstdio>
#include<algorithm> using namespace std; int n,m;
int val[];
struct node{
int id,f,t;
}edge[]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&edge[i].f,&edge[i].t),edge[i].id=i;
for(int i=;i<=n;i++) val[i]=1e9;
val[]=;
for(int T=;T<=;T++)
{
for(int i=;i<=m;i++)
{
int x=edge[i].f;int y=edge[i].t;
int t=max(i,val[x]);
if(t<val[y]) val[y]=t; x=edge[i].t;y=edge[i].f;
t=max(i,val[x]);
if(t<val[y]) val[y]=t;
}
}
for(int i=;i<=n;i++) printf("%d\n",val[i]);
return ;
}
50
正解:裸的最短路嘤嘤嘤。我们再来看这台计算机的计算过程:
- 1号CPU值为0,其他CPU值为1e9--各个点的CPU值为dis数组,即起点1到各个点的距离
- 如果t比y号CPU上的值更小,就把y号CPU上的值改为t--这不就是松弛过程嘛。于是我们发现各边的边权即为边的编号。
所以我们直接跑一遍dij就行了,但是要注意,这里更新就不是累加了,而是取最大值。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define maxn 100090
#define maxm 300090 using namespace std; int n,m,tot;
int head[maxn],dis[maxn],vis[maxn];
struct node{
int to,next,val;
}edge[maxm*]; void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
edge[tot].val=z;
} void dijkstra()
{
priority_queue<pair<int,int> >q;
q.push(make_pair(,));
for(int i=;i<=n;i++) dis[i]=1e9;
dis[]=;
while(!q.empty())
{
int u=q.top().second;q.pop();
if(vis[u]) continue;
vis[u]=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
int tmp=max(dis[u],edge[i].val);
if(dis[v]>tmp)
{
dis[v]=tmp;
q.push(make_pair(-dis[v],v));
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y,i);add(y,x,i);
}
dijkstra();
for(int i=;i<=n;i++) printf("%d\n",dis[i]);
return ;
}
AC
小结:自己没看出来是最短路,还是太菜了...其实这个算法按这个描述还是很显然的啊(嘤)。还是要认真体会题目意思啊QAQ。
C. eval
题目描述
或许这道题比经典的“表达式求值”还是要简单一点的。
有一种简单的编程语言,我们如下定义其中的概念:
- 常数:单个数字,即
0
到9
。注意不会出现多位数字的情况。 - 变量:单个大写字母,即
A
到Z
。每个变量可以存储一个整数,所有变量的初始值为0
。 - 值:常数或者变量。
- 赋值语句:由变量、
=
、值构成,例如A=3
,B=A
,C=C
。表示将变量修改为右侧的值。 - 加法语句:由变量、
+=
、值构成,例如A+=9
,B+=B
。表示将变量额外加上右侧的值。 - 语句:赋值语句、加法语句或者循环语句。
- 循环语句:由
for(
、变量、,
、值、,
、值、)
、语句构成,例如for(I,0,9)A+=I
,for(I,0,9)for(J,0,I)A+=J
。设两个值在此时依次为 a 和 b,则:- 所有的输入数据保证此时 a≤b。
- 依次令变量取 a,a+1,a+2,…,b,计算右侧的语句。
- 整个循环语句结束后,变量的值取 b。
- 右侧的语句中,保证不会对循环变量进行修改(即不会出现在赋值语句和加法语句的左侧,也不会成为另一个循环语句的变量),并且如果 a 和 b 是变量,也不会对其进行修改。
考场:模拟啊...辰哥最强。感觉还是比较可做的,最后就是循环嵌套不会处理了,于是期望得分60分。结果考后发现循环语句中的初值与末值也有可能是变量,于是跑了20分...难受。稽不如人肝败下风而且最后的时候还好检查了,少讨论了一种变量为字母/数字的情况。而且还检查出来挂文件了qwq。
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
#include<cctype> using namespace std; int len,num[],vis[];
char fac[];
map<char,int>od; int ksm(int a,int b)
{
int tmp=;
while(b)
{
if(b&) tmp=tmp*a;
b>>=;
a=a*a;
}
return tmp;
} int chang(int pos)
{
int tmp=,lc=;
for(int i=pos;i<=len;i++) num[i]=fac[i]-'';
for(int i=len;i>=pos;i--)
tmp+=ksm(,lc)*num[i],lc++;
return tmp;
} void output()
{
if(od['A']!=) printf("A=%d\n",od['A']);
if(od['B']!=) printf("B=%d\n",od['B']);
if(od['C']!=) printf("C=%d\n",od['C']);
if(od['D']!=) printf("D=%d\n",od['D']);
if(od['E']!=) printf("E=%d\n",od['E']);
if(od['F']!=) printf("F=%d\n",od['F']);
if(od['G']!=) printf("G=%d\n",od['G']);
if(od['H']!=) printf("H=%d\n",od['H']);
if(od['I']!=) printf("I=%d\n",od['I']);
if(od['J']!=) printf("J=%d\n",od['J']);
if(od['K']!=) printf("K=%d\n",od['K']);
if(od['L']!=) printf("L=%d\n",od['L']);
if(od['M']!=) printf("M=%d\n",od['M']);
if(od['N']!=) printf("N=%d\n",od['N']);
if(od['O']!=) printf("O=%d\n",od['O']);
if(od['P']!=) printf("P=%d\n",od['P']);
if(od['Q']!=) printf("Q=%d\n",od['Q']);
if(od['R']!=) printf("R=%d\n",od['R']);
if(od['S']!=) printf("S=%d\n",od['S']);
if(od['T']!=) printf("T=%d\n",od['T']);
if(od['U']!=) printf("U=%d\n",od['U']);
if(od['V']!=) printf("V=%d\n",od['V']);
if(od['W']!=) printf("W=%d\n",od['W']);
if(od['X']!=) printf("X=%d\n",od['X']);
if(od['Y']!=) printf("Y=%d\n",od['Y']);
if(od['Z']!=) printf("Z=%d\n",od['Z']);
} int main()
{
while(scanf("%s",fac+)!=EOF)
{
len=strlen(fac+);
if(fac[]!='f')// no cycle structures
{
if(fac[]=='+') // add structures
{
char qwq=fac[],qaq=fac[];
if(isdigit(fac[])) od[qwq]+=chang();// add digit
else od[qwq]+=od[qaq];// add alpha
}
else // assignment structures
{
char qwq=fac[];
if(isdigit(fac[])) od[qwq]=chang();
else od[qwq]=od[fac[]];
}
continue;
}
char qwq=fac[];
char qaq=fac[];
if(fac[]=='+') // add with cycle
{
int cnt=(fac[]-'')-(fac[]-'')+;
if(fac[len]==qwq) // add the same with cycle
{
int to=fac[]-'';
int be=fac[]-'';
od[qaq]+=(be+to)*cnt/;
}
else
{
/*digit*/ if(isdigit(fac[len])) od[qaq]+=cnt*(fac[len]-'');
/*different*/ else od[qaq]+=cnt*od[fac[len]];
}
}
else// assignment with cycle
{
if(fac[len]==qwq)
od[qaq]=fac[]-'';
else
{
if(isdigit(fac[len])) od[qaq]=fac[len]-'';
else od[qaq]=od[fac[len]];
}
}
od[qwq]=fac[]-'';// announce change
}
output();
return ;
}
40
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<iostream> using namespace std;
typedef long long ll;
ll sjt=;
ll cmp=; char tmp[];
ll tong[];
char fac[]; void spj(int pos)
{
cout<<(char)(pos+'A')<<"="<<"...";
ll st=tong[pos];
for(int i=;i>=;i--)
tmp[i]=st%+'',st/=;
for(int i=;i<=;i++) cout<<tmp[i];
printf("\n");
} void output()
{
for(int i=;i<=;i++)
if(tong[i])
{
if(tong[i]>=) spj(i);
else cout<<(char)(i+'A')<<"="<<tong[i]<<endl;
}
} void cycle(ll pos); void work(ll pos)
{
if(fac[pos]=='f') cycle(pos);
else
{
ll ch=fac[pos]-'A';
if(fac[pos+]=='+')
{
if(isdigit(fac[pos+])) tong[ch]+=fac[pos+]-'';
else tong[ch]+=tong[fac[pos+]-'A'];
while(tong[ch]>cmp) tong[ch]-=sjt;
}
else
{
if(isdigit(fac[pos+])) tong[ch]=fac[pos+]-'';
else tong[ch]=tong[fac[pos+]-'A'];
}
}
} void cycle(ll pos)
{
ll ch=fac[pos+]-'A';
ll posl=pos+,posr=pos+,l=,r=;
if(isdigit(fac[posl])) l=fac[posl]-'';
else l=tong[fac[posl]-'A'];
if(isdigit(fac[posr])) r=fac[posr]-'';
else r=tong[fac[posr]-'A'];
for(ll i=l;i<=r;i++)
tong[ch]=i,work(pos+);
while(tong[ch]>cmp) tong[ch]-=sjt;
} int main()
{
while(scanf("%s",fac+)!=EOF)
work();
output();
return ;
}
AC
小结:还是模拟考虑的细节不够&码力太弱了嘤嘤嘤。
正解在博客园上显示不出来,我也很难受啊,贴链接
今天感觉海星..比前两天正睿考试的状态好些了...还会继续恢复的(本来就弱啊),今天题还是比较简单的,我分还是低啊(菜)。T3锅了20分就很难受了,还是细节真·重要啊qwq.而且最近好像一直没有在考场上A题了,是在专业打暴力233。其实有的时候思路和正解已经很贴近了,就差最后一步了,还是要多思考a(光速逃
noi.ac 邀请赛1 By cellur925的更多相关文章
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
随机推荐
- 理解CSS中的BFC(块级可视化上下文)[译]
开篇 一些元素,如float元素,如position为absolute,inline-block,table-cell或table-caption的元素,以及overflow属性不为visible的元 ...
- 图像处理之 opencv 学习---opencv 中的常用算法
http://blog.csdn.net/lindazhou2005/article/details/1534234 文中有提到鲁棒性 http://blog.csdn.net/chary8088/a ...
- 【项目发起】千元组装一台大型3D打印机全教程(一)前言
前言 最近又碰到了大尺寸模型打样的需求,我这台17cm直径的kossel mini就捉襟见肘了.怎么办呢,这个时候kossel的好就体现出来了,随意扩展,那么就自己做个kossel-max吧.为了向前 ...
- C# XML序列化与反序列化与XML格式详解
1.https://www.cnblogs.com/sandyliu1999/p/4844664.html XML是有层次结构的,序列化实际就是内存化,用连续的结构化的内存来存储表示一个对象,那么这两 ...
- eureka-注册中心使用密码验证
spring cloud 1.1 版本之后可以使用 配置文件: bootstrap.yml server.port: 9000 spring.application.name: registry eu ...
- chan
第一单元:分型.笔.线段 ?1 分型 一.分型.笔和线段所属范畴 缠师在<教你炒股票72:本ID已有课程的再梳理>中对缠论做过这样的说明“本ID的理论,本质上分两部分,一是形态学,二是动 ...
- maven安装的详细步骤
1.下载maven的bin,在apache官方网站下载.window系统下的下载红色方框的 2.解压后, 把bin的位置设在环境变量里,新建环境变量 MAVEN_HOME.这个配置是方便以后更换mav ...
- 一步一步学Silverlight 2系列(24):与浏览器交互相关辅助方法
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Oracle:ORA-01790: expression must have same datatype as corresponding expression
今天有现场报sql错误,错误sql语句 类似 select * from tableA where (exists 条件A or exists 条件B), 单独执行 select * f ...
- hdu 4300 Clairewd’s message(kmp/扩展kmp)
题意:真难懂.. 给出26个英文字母的加密表,明文中的'a'会转为加密表中的第一个字母,'b'转为第二个,...依次类推. 然后第二行是一个字符串(str1),形式是密文+明文,其中密文一定完整,而明 ...