2019 ICPC 南昌网络赛

比赛时间:2019.9.8

比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest

总结

// 史上排名最高一次,开场不到两小时队友各A一题加水题共四题,排名瞬间升至三四十名
// 然后后三小时就自闭了,一题都没有突破。。。最后排名211 hhhh


 

B. Fire-Fighting Hero

题意

队友做的,待补。

 

AC代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 2010;
int head[N],cnt;
struct node
{
int v,nxt,w;
}e[N*N];
void addedge(int u,int v,int w)
{
e[cnt].v= v;
e[cnt].nxt = head[u];
e[cnt].w = w;
head[u] = cnt++;
}
int dis[N];
int mp[N][N];
queue<int>q;
int vis[N];
void spfa()
{
while(!q.empty())
{
int u = q.front();
//cout<<u<<endl;
q.pop();
vis[u] = 0;
for(int i=head[u];~i;i=e[i].nxt)
{
int v = e[i].v;
//cout<<" "<<v<<endl;
if(dis[v]>dis[u]+mp[u][v])
{
dis[v] = dis[u]+mp[u][v];
if(vis[v]==0)
{
q.push(v);
vis[v] = 1;
}
}
}
}
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
memset(head,-1,sizeof(head));
cnt = 0;
int V,E,S,K,C;
scanf("%d%d%d%d%d",&V,&E,&S,&K,&C);
for(int i=1;i<=V;++i)
{
vis[i]=0;
dis[i]=(1<<30);
for(int j=1;j<=V;++j)
mp[i][j]=(1<<30);
}
for(int i=1;i<=K;++i)
{
int d;scanf("%d",&d);
dis[d] = 0;
q.push(d);
vis[d] = 1;
}
for(int i=1;i<=E;++i)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
if(mp[u][v]==(1<<30))
{
addedge(u,v,w);
addedge(v,u,w);
}
mp[u][v]=mp[v][u]=min(mp[u][v],w);
}
spfa();
int ptr = 0;
for(int i=1;i<=V;++i)
if(dis[i]!=(1<<30))
ptr = max(ptr,dis[i]);
for(int i=1;i<=V;++i)
{
vis[i] = 0;
dis[i]=(1<<30);
}
dis[S] = 0;
while(!q.empty())q.pop();
q.push(S);
vis[S] = 1;
spfa();
int hero = 0;
for(int i=1;i<=V;++i)
if(dis[i]!=(1<<30))
hero = max(hero,dis[i]);
if(hero<=ptr*C)
printf("%d\n",hero);
else
printf("%d\n",ptr);
}
return 0;
}

 

E. Magic Master

题意

桌子上有一叠 N 张扑克牌,每张牌有一个编号(1~N),按照如下两个过程取出:

  1. 取走这堆扑克牌最上面的一张牌,放到手上。手上有牌的话放到所有牌最下面。
  2. 如果桌子上还有剩余牌,就把桌上的最上面的牌插入到底部,操作 M 次。

    若最后手上牌的编号为降序,求开始桌上每张牌的编号是多少。有 Q 次询问,每次给出桌上从上到下第 k 张牌的编号。

     

思路

开始粗略一算,好像能够直接模拟算出初始编号。写完发现复杂度到达 \(O(T*N*M)\),肯定T了。

捂着代码没交,发现 Q 最大只有100,那么只处理前100次查询的结果,调了半天样例没跑出来。

printf调试发现有先算好的结果,于是加上了类似记忆化的标记。然后交了就A了。

赛后有大佬没过问我这个约瑟夫环怎么处理的,我才意识到这是约瑟夫环啊,他们为什么会T呢

可能我用的 STL 的queue很优秀吧 o( ̄▽ ̄)o

 

AC代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 40000010; int n, m;
int ans[maxn], now; queue<int> q;
void solve(int k) {
if(ans[k]!=-1) {
printf("%d\n", ans[k]);
return;
}
while(q.size()) {
int num = q.front(); q.pop();
ans[num] = ++now; bool flag = 0;
if(num==k) {
printf("%d\n", ans[k]);
flag = true;
} if(q.empty()) break;
for(int i=1;i<=m;i++) {
int num = q.front(); q.pop();
q.push(num);
} if(flag) break;
}
} int main() {
int T; cin>>T;
while(T--) {
int Q;
scanf("%d %d %d", &n, &m, &Q); memset(ans, -1, sizeof(ans));
while(q.size()) q.pop();
for(int i=1;i<=n;i++) q.push(i);
now = 0;
while(Q--) {
int k;
scanf("%d", &k);
solve(k);
}
} return 0;
}

 

把第一遍写的暴力模拟测了一下,居然也过了。。。这题好SB...

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 40000010; int n, m;
int ans[maxn], now; queue<int> q;
void solve() {
while(q.size()) q.pop();
now = 0; for(int i=1;i<=n;i++) q.push(i);
while(q.size()) {
ans[q.front()] = ++now;
q.pop(); if(q.empty()) break;
for(int i=1;i<=m;i++) {
int num = q.front(); q.pop();
q.push(num);
}
}
} int main() {
int T; cin>>T;
while(T--) {
int q;
scanf("%d %d %d", &n, &m, &q);
solve();
while(q--) {
int k;
scanf("%d", &k);
printf("%d\n", ans[k]);
}
}
return 0;
}

 

G. Pangu Separates Heaven and Earth

题意

签到题。

 

AC代码

略。

 

H. The Nth Item

题意

定义

\[F(0)=0, F(1)=1\\
F(n)=3∗F(n−1)+2∗F(n−2), (n≥2)
\]

有 \(Q\) 次询问,求 \(F(N)\) 。(\(1 \leq Q \leq 10^7, 0 \leq N \leq 10^{18}\))

 

思路

队友开始觉得BM线性递推可以做,我高高兴兴抄起板子改改一交就TLE。

然后我一看就两项完全不用线性递推啊,直接矩阵快速幂就好了。

我在一边写矩阵快速幂,并提示把中间计算结果存下来,让队友想办法优化。

然后队友构造了一组数据我T了但线性递推算出来了,于是就交了AC了。

 

AC代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
using namespace std; #define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size()) typedef long long ll;
typedef vector<ll> VLL;
const ll mod = 998244353; ll powmod(ll a, ll b) {
ll res=1;a%=mod;
for(;b;b>>=1) {
if(b&1) res=res*a%mod;
a=a*a%mod;
}
return res;
} namespace linear_seq {
const int N = 100010;
ll res[N], base[N], _c[N], _md[N]; VLL Md;
void mul(ll a[], ll b[], int k) {
for(int i=0;i<k+k;i++)
_c[i] = 0;
for(int i=0;i<k;i++)
if(a[i])
for(int j=0;j<k;j++)
_c[i+j] = (_c[i+j] + a[i]*b[j]%mod) % mod; for(int i=k+k-1;i>=k;i--)
if(_c[i])
rep(j,0,SZ(Md))
_c[i-k+Md[j]] = (_c[i-k+Md[j]] - _c[i] * _md[Md[j]]%mod) % mod; for(int i=0;i<k;i++)
a[i] = _c[i];
} ll solve(ll n, VLL a, VLL b) {
ll ans = 0, pnt = 0;
int k = SZ(a);
for(int i=0;i<k;i++)
_md[k-1-i]=-a[i];
_md[k]=1; Md.clear();
for(int i=0;i<k;i++)
if(_md[i]!=0) Md.push_back(i);
for(int i=0;i<k;i++)
res[i]=base[i]=0;
res[0]=1; while((1ll<<pnt)<=n) pnt++;
for(int p=pnt;p>=0;p--) {
mul(res, res, k);
if((n>>p)&1) {
for(int i=k-1;i>=0;i--)
res[i+1]=res[i];res[0]=0;
rep(j,0,SZ(Md))
res[Md[j]]=(res[Md[j]] - res[k]*_md[Md[j]]%mod) % mod;
}
} for(int i=0;i<k;i++)
ans = (ans + res[i]*b[i]%mod) % mod;
if(ans<0) ans += mod;
return ans;
} VLL BM(VLL s) {
VLL C(1,1), B(1,1);
int L=0,m=1,b=1;
rep(n,0,SZ(s)) {
ll d=0;
rep(i,0,L+1) d=(d+(ll)C[i]*s[n-i]%mod) % mod;
if(d==0) ++m;
else if(2*L<=n) {
VLL T=C;
ll c=mod-d*powmod(b,mod-2)%mod;
while(SZ(C)<SZ(B)+m) C.pb(0);
rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i]%mod) % mod;
L=n+1-L; B=T; b=d; m=1;
} else {
ll c = mod- d*powmod(b, mod-2)%mod;
while(SZ(C)<SZ(B)+m) C.pb(0);
rep(i,0,SZ(B))
C[i+m]=(C[i+m]+c*B[i]%mod) % mod;
++m;
}
}
return C;
}
}; VLL a, c;
ll fib[110]; void init() {
fib[1] = 1;
for(int i=2;i<110;i++) {
fib[i] = (3*fib[i-1] + 2*fib[i-2]) % mod;
} for(int i=1;i<=100;i++) {
a.pb(fib[i]);
} c = linear_seq::BM(a);
c.erase(c.begin());
rep(i,0,SZ(c))
c[i] = (mod-c[i])%mod;
} map<ll,ll>mp;
int main() {
init(); int T; ll N;
scanf("%d %lld", &T, &N);
ll RES = 0;
ll ans = 0;
while(T--) {
N = (ans*ans)^N;
if(mp[N]) ans = mp[N];
else ans = linear_seq::solve(N-1, c, VLL(a.begin(), a.begin()+SZ(c)));
mp[N]=ans;
RES ^= ans;
// printf("%lld\n", ans);
}
printf("%lld\n", RES);
return 0;
} /*
卡矩阵快速幂的数据
10000000 473844410
*/

 


 

(未完待补。。)

2019 ICPC 南昌网络赛的更多相关文章

  1. 2019 ICPC 南昌网络赛I:Yukino With Subinterval(CDQ分治)

    Yukino With Subinterval Yukino has an array a_1, a_2 \cdots a_na1,a2⋯*a**n*. As a tsundere girl, Yuk ...

  2. 2019 ICPC南昌网络赛 B题

    英雄灭火问题忽略了一点丫 一个超级源点的事情,需要考虑周全丫 2 #include<cstdio> #include<cstring> #include<queue> ...

  3. Magic Master(2019年南昌网络赛E题+约瑟夫环)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...

  4. 2019年ICPC南昌网络赛 J. Distance on the tree 树链剖分+主席树

    边权转点权,每次遍历到下一个点,把走个这条边的权值加入主席树中即可. #include<iostream> #include<algorithm> #include<st ...

  5. 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...

  6. 2019 ICPC 沈阳网络赛 J. Ghh Matin

    Problem Similar to the strange ability of Martin (the hero of Martin Martin), Ghh will random occurr ...

  7. 2019 ICPC 徐州网络赛 B.so easy (并查集)

    计蒜客链接:https://nanti.jisuanke.com/t/41384 题目大意:给定n个数,从1到n排列,其中有q次操作,操作(1) 删除一个数字 // 操作(2)求这个数字之后第一个没有 ...

  8. 2019 ICPC徐州网络赛 E. XKC's basketball team(二分)

    计蒜客题目链接:https://nanti.jisuanke.com/t/41387 题目大意:给定一组无序序列,从第一个数开始,求最远比这个数大m的数,与这个数之间相隔多少数字?如果没有输出-1,否 ...

  9. 2019 ICPC南京网络赛 F题 Greedy Sequence(贪心+递推)

    计蒜客题目链接:https://nanti.jisuanke.com/t/41303 题目:给你一个序列a,你可以从其中选取元素,构建n个串,每个串的长度为n,构造的si串要满足以下条件, 1. si ...

随机推荐

  1. 管理员技术(六): 硬盘分区及格式化、 新建一个逻辑卷、调整现有磁盘的分区、扩展逻辑卷的大小、添加一个swap分区

    一.硬盘分区及格式化 问题: 本例要求熟悉硬盘分区结构,使用fdisk分区工具在磁盘 /dev/vdb 上按以下要求建立分区: 1> 采用默认的 msdos 分区模式        2> ...

  2. Java学习之集合(List接口)

    List特有的常见方法:有一个共性特点:都可以操作角标 1.添加  void add(int index, E element); void addAll(int index, collection& ...

  3. HTML —— 表格

    复习下关于html中的表格. 基本结构: 表格由 table 标签为父标签进行包裹,可以在 table 上添加几种属性. border : 定义表格的边框. cellspacing : 间距,指单元格 ...

  4. 20140724 菜单制作:制表位(段落->制表位->)

    1.菜单制作:制表位(段落->制表位->) 叶轩楠·········· 上海大学 轩楠叶·········· 上海大学 楠轩叶·········· 上海大学 选完后要选“设置” 2.光盘制 ...

  5. script标签的defer、async属性

    之前一直对script标签的defer.async属性一知半解,直到看到了论坛上某大神发的图片,茅塞顿开!!!!!

  6. java-Day01

    什么是java语言 1995由美国SUN公司推出的高级编程语言(后2009年甲骨文公司收购SUN公司) 常用的DOS命令 盘符切换命令:盘符: 查看当前文件夹:dir 进入文件命令:cd 文件夹名 退 ...

  7. MS Sql添加描述信息 及其他信息

    --查询某个表的描述 SELECT * FROM fn_listextendedproperty (NULL, 'user', 'dbo', 'table', '(表名)',NULL, NULL) - ...

  8. 关于py中lxml模块的cssselect的小问题

    今天在使用lxml进行解析页面的时候遇到了不能解析空格的问题,就是类似于: <div class="aa bb"></div> 使用cssselect('. ...

  9. [Code+#3]博弈论与概率统计

    题目 记得曾经和稳稳比谁后抄这个题的题解,看来是我输了 不难发现\(p\)是给着玩的,只需要求一个总情况数除以\(\binom{n+m}{n}\)就好了 记\(i\)为无效的失败次数,即\(\rm A ...

  10. WebServer Project-02-XML解析

    XML:Extensible Markup Language,可扩展标记语言,左卫门数据的一种存储格式或用于存储软件的参数,程序解析此配置文件,就可以达到不修改代码就能更改程序的目的. <?xm ...