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=3B=AC=C。表示将变量修改为右侧的值。
  • 加法语句:由变量、+=、值构成,例如 A+=9B+=B。表示将变量额外加上右侧的值。
  • 语句:赋值语句、加法语句或者循环语句。
  • 循环语句:由 for(、变量、,、值、,、值、)、语句构成,例如 for(I,0,9)A+=Ifor(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的更多相关文章

  1. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

  2. NOI.ac #31 MST DP、哈希

    题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...

  3. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  4. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  5. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  6. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  7. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  8. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  9. NOI.AC WC模拟赛

    4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...

随机推荐

  1. GTK入门学习:布局容器之水平布局

    假设我们希望窗体里多放加入几个控件,直接加入是不成功的.由于窗体仅仅能容纳一个控件的容器. 这时候.我们须要借助布局容器,我们先把布局容器加入到窗体里.然后再把所须要加入的控件放在布局容器里. 布局容 ...

  2. mac下Tomcat的安装

    转自:http://blog.csdn.net/liuyuyefz/article/details/8072485 对于Apache Tomcat 估计很多童鞋都会,那么今天就简单说下在mac上进行t ...

  3. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  4. C++ HOJ 火车进站

    [问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入:   有多组 ...

  5. Parallels Desktop 设置win网络连接

    目的: 1 虚拟机中的win系统技能访问外网 2 可以和Mac系统互联 首先来实现1,很简单: 打开控制中心对应系统的设置 选择[硬件]->[网络] 源:设置共享网络 到此就达到1目的了: 现在 ...

  6. HDU 5627Clarke and MST

    Clarke and MST Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  7. 深入浅出Oracle学习笔记:Buffer Cache 和Shared pool

    Buffer cache 和 share pool 是sga中最重要最复杂的部分. 一.Buffer Cache 通常数据的读取.修改都是通过buffer cache 来完成的.buffer cach ...

  8. Opencv函数setMouseCallback鼠标事件响应

    用户通过鼠标对图像视窗最常见的操作有: 1. 左键单击按下 2. 左键单击抬起 3. 左键按下拖动 4. 鼠标指针位置移动 单次单击操作响应事件及顺序 Opencv中setMouseCallback( ...

  9. python 高性能web框架 gunicorn+gevent

    参考链接: http://rfyiamcool.blog.51cto.com/1030776/1276364/ http://www.cnblogs.com/nanrou/p/7026789.html ...

  10. 【旧文章搬运】如何从EPROCESS辨别一个进程是否已退出

    原文发表于百度空间,2008-7-31========================================================================== 前面已经通过 ...