WHU校赛2019(网络赛) 解题报告

CCNU_你们好强啊我们都是面包手(xzc zx lj)


战况: 比赛时3题,排名57,现在5题了

题目链接: WHU校赛2019 <-戳这里


以下题目按难度顺序递增叙述


B.DrunkHamster
求两点之间距离的平方,签到题

/*
Apr/07/2019 13:49UTC+8
CCNU_你们好强啊我们都是面包手
B - DrunkHamster
GNU C++17 Accepted    30 ms   0 KB
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
#define LL long long
#define MP make_pair
#define pb push_back
using namespace std;
const int maxn = 1e5+100;
void solve(int x,int y)
{LL ans = (1ll*x*x+1ll*y*y);cout<<ans<<endl;
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);LL x,y,z;int T,n;cin>>T;int ca = 0;while(T--){x = y = 0;scanf("%d",&n);For(i,0,n-1){scanf("%I64d",&z);  if(i%4==0) y += z;else if(i%4==1) x+=z;else if(i%4==2) y-=z;else x-=z;} printf("Case #%d:",++ca);solve(x,y);} return 0;
}

E.Egnima
简单模拟,搞个map或者数组对应,比较字符串即可

/*
Apr/07/2019 14:03UTC+8
CCNU_你们好强啊我们都是面包手
E - Egnima
GNU C++17 Accepted    31 ms   2100 KB
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
#define LL long long
#define MP make_pair
#define pb push_back
using namespace std;
const int maxn = 1e6+100;
char a[] = "abcdefghijklmnopqrstuvwxyz";
char b[] = "22233344455566677778889999";
map<char,char> mp;
char num[maxn],str[maxn];
int LenNum;
bool ok()
{int len = strlen(str)-1;if(len!=LenNum) return false;For(i,0,len){if(mp[str[i]]!=num[i]) return false;}return true;
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int len = strlen(a)-1;For(i,0,len){mp[a[i]] = b[i];}int T,n;cin>>T;int ca = 0;while(T--){printf("Case #%d:\n",++ca);scanf("%s",num);LenNum = strlen(num)-1;scanf("%d",&n);For(ca,1,n){scanf("%s",str);if(ok()){printf("Maybe..\n");}else{printf("How could that be possible?\n");}}} return 0;
}

D.Dandelion

卡特兰数 C(m+n-1,n-1)-C(m+n-1,m-1))
预处理阶乘以及阶乘的逆元即可
打比赛的前一天我在牛客上写了道类似的题
感谢lj正确的公式,是我写呲了,忘记%mod+mod%mod,wa了一发,我的锅

/*
Apr/07/2019 14:44 UTC+8
CCNU_你们好强啊我们都是面包手
D - Dandelion
GNU C++17  Accepted 62ms 31300 KB
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
#define LL long long
#define MP make_pair
#define pb push_back
using namespace std;
const int maxn = 2e6+100;
const int mod = 1e9+7;
LL r[maxn];
LL fac[maxn];
LL fast_pow(LL a,LL b);
void init();
LL C(int n,int m);
int main()
{// freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int T,m,n;init();cin>>T;while(T--){scanf("%d%d",&m,&n);LL ans = ((C(m+n-1,max(m,n)-1)-C(m+n-1,min(m,n)-1))%mod+mod)%mod;printf("%I64d\n",abs(ans));}return 0;
}LL fast_pow(LL a,LL b)
{LL ans = 1;while(b){if(b&1) ans = ans*a%mod;a = a*a%mod;b>>=1;   }return ans;
}
void init()
{fac[0] = 1;r[0] = 1;For(i,1,2000000) fac[i] = fac[i-1]*i%mod;r[2000000] = fast_pow(fac[2000000],mod-2);Rep(i,1999999,1)r[i] = r[i+1]*(i+1)%mod;}
LL C(int n,int m)
{if(n<m||m<0) return 0;return fac[n]*r[m]%mod*r[n-m]%mod;
}

C.Store

题意:
n种货物
M x y:在第x天买了第y种货物
D x y: 查询在之前比x小的天数中卖过的货物>=y的最小值
1<=y<=n<=1e5 x<=1e9

思路:

  • 线段树,把x离散化,按x建立线段树,线段树每个节点开一个set,存这个区间里已经卖出去的y(货物种类)
  • 单点更新,区间查询
  • 这题还不难,但比赛的时候作为数据结构手的我去搞没做过的主席树了… 还是我的锅,不过今天上算法课写了一发,补出来了

/*
Apr/08/2019 15:43UTC+8
CCNU_你们好强啊我们都是面包手
C - Store
GNU C++17  Accepted   794 ms  61900 KB
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
#define LL long long
#define MP make_pair
#define pb push_back
using namespace std;
const int maxn = 2e5+3;
int a[maxn],p[maxn];
set<int>::iterator it;
struct SegmentTree{set<int> s;
}tree[maxn<<2];
struct Question{char tp[2];int x,y;
}qu[maxn];
void update(int left,int right,int tx,int ty,int pos=1)
{tree[pos].s.insert(ty);if(left==right) return;int mid = (left+right)>>1;if(tx<=mid) update(left,mid,tx,ty,pos<<1);else update(mid+1,right,tx,ty,pos<<1|1);
}
int query(int left,int right,int qx,int qy,int ty,int pos=1)
{if(left>qy || right<qx) {return -1;  }if(qx<=left && right<= qy){it = tree[pos].s.lower_bound(ty);if(it==tree[pos].s.end()) return -1;return *it;}int mid = (left+right)>>1; int ansL = query(left,   mid,qx,qy,ty,pos<<1);int ansR = query(mid+1,right,qx,qy,ty,pos<<1|1);if(ansL==-1&&ansR==-1) return -1;else if(ansL==-1) return ansR;else if(ansR==-1) return ansL;return min(ansL,ansR);
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int n,Q;scanf("%d%d",&n,&Q); For(i,1,Q){scanf("%s%d%d",qu[i].tp,&qu[i].x,&qu[i].y);p[i] = qu[i].x;}sort(p+1,p+1+Q);int Maxx = 0;For(i,1,Q){qu[i].x = lower_bound(p+1,p+1+Q,qu[i].x)-p;Maxx = max(Maxx,qu[i].x);}For(i,1,Q){if(qu[i].tp[0]=='M') update(1,Maxx,qu[i].x,qu[i].y);else printf("%d\n",query(1,Maxx,1,qu[i].x,qu[i].y));}return 0;
}

F. Climb

  • 树上第K小板子题(不过这是第K大)
  • 今天学了一下,过了poj-2104,spoj-10628,学会了
  • LCA是我上上周学的,dfs+RMQ
  • 今天看卿爷和Y_Cl区间第K大的板子,感觉很好用
  • 于是根据主席树的原理,写出了树上第K大~
  • 这是我最近写的最长,开的数组最多的代码了
/*
Apr/08/2019 22:10UTC+8
CCNU_你们好强啊我们都是面包手
F - Climb
GNU C++17 Accepted    1294 ms 59200 KB
*/
Apr/09/2019 06:22UTC+8 CCNU_你们好强啊我们都是面包手   F - Climb   GNU C++17 Accepted    1294 ms 59200 KB
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Mst(a,b) memset(a,(b),sizeof(a))
using namespace std;
const int maxn = 1e5+20;
int a[maxn],p[maxn],n,cnt;//p离散化
struct Edge{int to,Next;
}edge[maxn<<1];
int head[maxn],totEdge;//邻接表
int First[maxn],sequence[maxn<<1],deep[maxn<<1];
int father[maxn];
bool vis[maxn]; //dfs
int Min[maxn<<1][20];
int Log2[maxn<<1]={-1};
struct Node{Node * Lchild, * Rchild;int sum;
}node[maxn*20],*root[maxn*20];
Node * update(int,int,int,Node*);
void build(); //建第一课空树(爷爷节点)
void initG(); //初始化邻接表
void addedge(int u,int v);
void dfs(int x,int fa,int deep,int&);
void getST(int n);
int LCA(int x,int y);
int query(int,int,int,Node*,Node*,Node*,Node*);
int main()
{//freopen("in.txt","r",stdin);For(i,1,maxn*2-15) Log2[i] = Log2[i>>1]+1;int T,m;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);For(i,1,n) scanf("%d",a+i), p[i] = a[i];sort(p+1,p+1+n);For(i,1,n) a[i] = lower_bound(p+1,p+1+n,a[i])-p;int u,v;initG();For(i,2,n){scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}  build(); //先建一棵空树Mst(vis,0); int cntOfSequence = 0;dfs(1,0,1,cntOfSequence); //dfs生成树的同时,在父节点基础上建立新的线段树 int k,lca;getST(2*n-1); //线性预处理(nlogn) while(m--){scanf("%d%d%d",&u,&v,&k); lca = LCA(u,v);int totNum = deep[First[u]]+deep[First[v]]-deep[First[lca]]-deep[First[father[lca]]];if(k>totNum) //询问的K大于这条路径上所有顶点的个数 {printf("-1\n");continue;}k = totNum - k+1;printf("%d\n",p[query(1,n,k,root[u],root[v],root[lca],root[father[lca]])]);} } return 0;
}void initG()
{Mst(head,-1);totEdge = 0;
}
void addedge(int u,int v)
{edge[totEdge].to = v;edge[totEdge].Next = head[u];head[u] = totEdge++;
}
void dfs(int x,int fa,int dep,int &cntOfSeq)
{father[x] = fa;vis[x] = true;root[x] = update(1,n,a[x],root[fa]);sequence[++cntOfSeq] = x;deep[cntOfSeq] = dep;First[x] = cntOfSeq;for(int i=head[x];i!=-1;i=edge[i].Next){int to = edge[i].to;if(vis[to]) continue;vis[to] = true;dfs(to,x,dep+1,cntOfSeq);sequence[++cntOfSeq] = x;deep[cntOfSeq] = dep;}
}
void getST(int n)
{For(i,1,n) Min[i][0] = i;for(int j=1;(1<<j)<=n;++j){for(int i=1;i+(1<<j)-1<=n;++i){int a = Min[i][j-1];int b = Min[i+(1<<(j-1))][j-1];Min[i][j] = deep[a]>deep[b]?b:a;}}
}
int LCA(int x,int y)
{x = First[x];y = First[y];if(x>y) swap(x,y);int j = Log2[y-x+1];int a = Min[x][j];int b = Min[y-(1<<j)+1][j];return deep[a]>deep[b]?sequence[b]:sequence[a];
}
Node * update(int left,int right,int v,Node * p)
{if(v<left||v>right) return p;Node * t = &node[cnt++];t->Lchild = p->Lchild;t->Rchild = p->Rchild;t->sum = p->sum + 1; if(left==right) return t;int mid = (left+right)>>1;t -> Lchild = update(left,mid,v,p->Lchild);t -> Rchild = update(mid+1,right,v,p->Rchild);return t;
}
void build()
{cnt = 0;root[0] = &node[cnt++];root[0]->Lchild = root[0]->Rchild = root[0];root[0]->sum = 0;
}
int query(int left,int right,int k,Node*ru,Node*rv,Node *rlca,Node*rfalca)
{if(left==right) return left;int tot = ru->Lchild->sum + rv->Lchild->sum - rlca->Lchild->sum - rfalca->Lchild->sum;int mid = (left+right)>>1;if(k<=tot) return query(left,mid,k,ru->Lchild,rv->Lchild,rlca->Lchild,rfalca->Lchild);else return query(mid+1,right,k-tot,ru->Rchild,rv->Rchild,rlca->Rchild,rfalca->Rchild);
}

队友们,我们一起加油叭!
好好训练,备战湘潭赛!
fighting!


WHU校赛2019(网络赛) 解题报告(CCNU_你们好强啊我们都是面包手) Apare_xzc相关推荐

  1. 无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告

    题目2(下面的太抓 我重新写了个背景 其他都一样) 无聊的活动 JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是 ...

  2. “光庭杯”第五届华中北区程序设计邀请赛 暨 WHU第八届程序设计竞赛(部分解题报告)

    这次做的比较郁闷,比赛的时候老是出这样那样的问题,卡题卡的要死.最终只做出三道,赛后静下心来我和队友一共又做出4道,要是比赛有这种状态我们的排名就好多了. 现在说说题目: 1001(hdu3361): ...

  3. XTU新生赛B题 ABK 解题报告

    题目描述 ABK是一个比A+B还要简单的题目,给出两个整数A,B,求出A和B的第K大公约数. 输入 第一行是一个整数N(N ≤ 10000),表示样例的个数. 以后每行一个样例,为3个整数A,B,K ...

  4. 2019ICPC亚洲区域赛南京网络赛

    Problem F Greedy Sequence 题目链接:https://nanti.jisuanke.com/t/41303 题意: 给出n个整数,构造s1,s2,s3-sns1,s2,s3-s ...

  5. [HDU5873] [2016亚洲区域赛大连网络赛] Football Games [构造][兰道定理]

    Link HDU - http://acm.hdu.edu.cn/showproblem.php?pid=5873 Description 有 mmm 个组,每一组有 nnn 支队伍. 每一组队伍中, ...

  6. 2019ICPC亚洲区域赛南昌网络赛

    Problem B Fire-Fighting Hero 题目链接:https://nanti.jisuanke.com/t/41349 题意: 判断消防英雄去其他消防点的最短路径的最大值与消防队去其 ...

  7. 华为杯大学生计算机软件大赛,关于举办2018年西安电子科技大学程序设计网络赛暨第十六届“华为杯”大学生程序设计竞赛的通知...

    各学院: 程序设计是大学生运用计算机充分展示自己分析问题和解决问题能力的一个重要途径,对于培养大学生实践能力.团队意识.创新意识.顽强意志和综合素质具有显著作用和效果.为了推动这项创新性素质教育活动的 ...

  8. 人生第一场CTF的解题报告(部分)

    解题报告 濮元杰部分: 王者归来: 120 场景 小王入职了一段时间,最近有点无聊.Web安全项目不多,白天看着其他项目组的同事忙得热火朝天,小王有点坐不住了,这也许是新人都会有的想法,乐于助人.想到 ...

  9. Codeforces round 654 赛后解题报告

    Codeforces round 654 赛后解题报告 先吐槽一下怎么 A-D 都是结论题啊啊 A. Magical Sticks 我们可以先确定下来,我们一定只对于未进行过拼接的木棍拼接. 学过等差 ...

最新文章

  1. mysql latid1_【转】mysql触发器的实战经验(触发器执行失败,sql会回滚吗) | 学步园...
  2. python交互式命令_在python中运行交互式命令
  3. 存储型xss_web安全测试--XSS(跨站脚本)与CSRF
  4. 那些年Android黑科技①:只要活着,就有希望
  5. 数据基本类型以及相关举例
  6. 大学计算机思维导图_【21计算机考研】改考408+1!上海电力大学翻倍扩招,仍考数据结构!...
  7. 虚拟机克隆后如何修复网络、主机名等问题
  8. 同一个页面多个ajax提交,速度缓慢
  9. js获取本地时间与网络时间
  10. 如何通过经纬度粗略计算地球两点之间的距离?直接上代码
  11. java cutline_利用JFreeChart生成饼形图
  12. UGUI源码分析:开关组件Toggle与ToggleGroup
  13. [含论文+源码等]微信小程序电影购票+后台管理系统源码
  14. 自顶向下和自底向上的估算方式
  15. “网络连接正常,但百度的链接无法打开”解决方案
  16. 还在自建代码仓库?阿里云 云效 的这款企业级代码管理工具免费、还香!
  17. UDP和TCP(Java版)
  18. 小程序参数二维码自动生成
  19. 如何动态获得view的大小
  20. RSU路测单元,你知道多少?

热门文章

  1. Fat-tree:A Scalable, Commodity Data Center Network Architecture 解读
  2. 多元数字阅读:看书、听书、视频讲书
  3. 一个外企白领的自白,让我们惊慌不已:猪和母鸡合资
  4. python判断lt中是否包含数字0_python中用for判断alt;b-女性时尚流行美容健康娱乐mv-ida网...
  5. 选择代理IP时需要注意的三大问题
  6. 微信公众号客服接口给指定用户openid发送消息
  7. UI设计中网页的设计规范总结
  8. eHR案例|融信:人力资源数字化转型实践
  9. 加湿器(雾化器)+小风扇 方案
  10. 题目0013-航天器