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. unity常见问题之20题

    1:天空盒有接缝怎么解决? 答:在贴图导入设置里设置Wrap Mode为"Clamp". 2: DDS格式怎么不显示? 答:Unity不支持DDS格式,Unity会将除DDS外的其 ...

  2. Android Studio代码自己主动检測错误提示

    Android Studio的代码自己主动检測的错误提示方式感觉有点奇葩.和Eclipse区别非常大,Eclipse检測到某个资源文件找不到或者错误,都会在Project中相应的文件前面打叉.可是An ...

  3. 信雅达面试题atoi函数实现

    atoi函数: 功 能: 把字符串转换成整型数. 名字来源:ASCII to integer 的缩写. 原型: int atoi(const char *nptr); 函数说明 参数nptr字符串,如 ...

  4. HDU 3639 Hawk-and-Chicken

    Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. 【2】按照Django官网,创建一个web app 创建app/创建相应的数据库表

    1. Creating app $ python manage.py startapp polls That'll create a directory polls, which is laid ou ...

  6. SSM整理笔记3——配置解析

    github:https://github.com/lakeslove/SSM 项目的目录结构如下 首先,配置web.xml <?xml version="1.0" enco ...

  7. gRPC错误码 http状态码 provide your APIs in both gRPC and RESTful style at the same time

    How gRPC error codes map to HTTP status codes in the response https://github.com/grpc-ecosystem/grpc ...

  8. GNU Makeflie

    简介 Gnu Make主要用于构建和管理程序包.Makefile文件描述了整个工程的编译.连接等规则. 其中包括: 工程中的哪些源文件需要编译以及如何编译: 需要创建那些库文件以及如何创建这些库文件: ...

  9. vue2-editor富文本基础使用方法

    vue2-editor的入门使用准备工作: 使用 npm install vue2-editor --save 安装到项目中去: 使用 在需要的单文件内引入 import { VueEditor } ...

  10. POJ3984 迷宫问题 —— BFS

    题目链接:http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...