FOJ 11月月赛题解
抽空在vjudge上做了这套题。剩下FZU 2208数论题不会。
FZU 2205
这是个想法题,每次可以在上一次基础上加上边数/2的新边。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; int f[N];
int main () {
f[]=;
for (int i=;i<=;i++) {
f[i]=f[i-]+i/;
}
int T;
cin>>T;
while (T--) {
int n;
cin>>n;
cout<<f[n]<<endl;
}
return ;
}
FZU 2206
乍看不知道什么东西,直接在机器上跑几个数字可以试出来结论。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=;
const int INF=0x3f3f3f3f; int main () {
//freopen("out.txt","r",stdin);
int T;
scanf("%d",&T);
for (int cas=;cas<=T;cas++) {
long long n;
scanf("%I64d",&n);
if (n<20150001LL) cout<<n+<<endl;
else cout<<<<endl;
}
return ;
}
FZU 2207
会用倍增算LCA的话,这题也肯定会做。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; vector<int>e[N];
int fa[N][];
int dep[N];
void dfs(int u,int f,int d) {
dep[u]=d;
for (int i=;i<e[u].size();i++) {
int v=e[u][i];
if (v==f) continue;
dfs(v,u,d+);
fa[v][]=u;
}
} void calc(int n) {
for (int j=;j<=;j++) {
for (int i=;i<=n;i++) {
fa[i][j]=fa[fa[i][j-]][j-];
}
}
} int kthA(int u,int k) {
for (int i=;i>=;i--) {
if (k>=(<<i)){
k-=(<<i);
u=fa[u][i];
}
}
return u;
} int lca(int u,int v) {
if (dep[u]<dep[v]) swap(u,v);
int d=dep[u]-dep[v];
u=kthA(u,d);
if (u==v) return u;
for (int i=;i>=;i--) {
if (fa[u][i]==fa[v][i])
continue;
u=fa[u][i];
v=fa[v][i];
}
return fa[u][];
}
int main () {
int T;
scanf("%d",&T);
while (T--) {
int n,m;
scanf("%d %d",&n,&m);
for (int i=;i<=n;i++)
e[i].clear();
for (int i=;i<n;i++) {
int u,v;
scanf("%d %d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
dfs(,-,);
calc(n);
static int cas=;
printf("Case #%d:\n",cas++);
while (m--) {
int u,v,k;
scanf("%d %d %d",&u,&v,&k);
int ans=lca(u,v);
if (k==) {
printf("%d\n",u);
continue;
}
else if (k==dep[u]-dep[ans]+dep[v]-dep[ans]+) {
printf("%d\n",v);
continue;
}
if (dep[u]-dep[ans]+>=k) {
int ret=kthA(u,k-);
printf("%d\n",ret);
}
else {
int to=dep[u]-dep[ans]+dep[v]-dep[ans]+-k;
int ret=kthA(v,to);
printf("%d\n",ret);
}
}
}
return ;
}
FZU 2208
数论题,不会
FZU 2209
分层图。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=;
const int INF=0x3f3f3f3f;
int get(int n,int u,int k) {
return k*n+u;
}
struct Edge {
int to,next,len;
Edge() {}
Edge(int _to,int _next,int _len):to(_to),next(_next),len(_len) {}
} edge[];
int idx=,head[N];
inline void addedge(int u,int v,int l) {
edge[++idx]=Edge(v,head[u],l);
head[u]=idx;
}
int dis[N][N],in[N];
bool vis[N];
bool spfa(int s,int n,int *dis) {
fill(dis,dis+N,INF);
memset(vis,false,sizeof(vis));
memset(in,,sizeof(in));
dis[s]=;
vis[s]=true;
queue<int> que;
que.push(s);
in[s]=;
while (!que.empty()) {
int u=que.front();
que.pop();
vis[u]=false;
for (int k=head[u];k;k=edge[k].next) {
int v=edge[k].to;
if (dis[v]>dis[u]+edge[k].len) {
dis[v]=dis[u]+edge[k].len;
if (!vis[v]) {
vis[v]=true;
in[v]++;
if (in[v]>n) return false;
que.push(v);
}
}
}
}
return true;
}
int main () {
//freopen("out.txt","r",stdin);
int T;
scanf("%d",&T);
for (int cas=;cas<=T;cas++) {
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
idx=;memset(head,,sizeof head);
for (int i=;i<=m;i++) {
int u,v;
scanf("%d %d",&u,&v);
int d;
for (int i=;i<;i++) {
scanf("%d",&d);
int uu=get(n,u,i);
int vv=get(n,v,(i+d)%);
addedge(uu,vv,d);
uu=get(n,v,i);
vv=get(n,u,(i+d)%);
addedge(uu,vv,d);
}
}
for (int i=;i<;i++) {
spfa(get(n,,i),n*,dis[i]);
}
printf("Case #%d:",cas);
while (k--) {
int v,s;
scanf("%d %d",&v,&s);
//cout<<"from "<<get(n,1,s)<<endl;
int ret=0x3f3f3f3f;
for (int i=;i<;i++) {
int p=get(n,v,i);
ret=min(ret,dis[s][p]);
}
if (ret==0x3f3f3f3f) ret=-;
printf(" %d",ret);
}
puts("");
}
return ;
}
FZU 2210
建立一个虚拟节点,连向所有粮仓,枚举所有禁止的城市,从虚拟节点dfs,更新答案。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; vector<int>e[N];
int in[N];
bool vis[N];
int fob;
int cnt;
void dfs(int u) {
if (u==fob||vis[u]) return;
vis[u]=true;cnt++;
for (int i=;i<e[u].size();i++) {
int v=e[u][i];
dfs(v);
}
}
int main () {
int n,m;
while (scanf("%d %d",&n,&m)!=EOF) {
for (int i=;i<=n;i++){
e[i].clear();
in[i]=;
}
for (int i=;i<=m;i++) {
int u,v;
scanf("%d %d",&u,&v);
e[u].push_back(v);
in[v]++;
}
for (int i=;i<=n;i++) {
if (in[i]==)
e[].push_back(i);
}
int ret=n+,val=;
for (int i=n;i>=;i--) {
fob=i;
memset(vis,false,sizeof vis);
cnt=;
dfs();
cnt--;
if (n-cnt>=val) {
val=n-cnt;
ret=i;
}
}
cout<<ret<<endl;
}
return ;
}
FZU 2211
费用流,把所有蘑菇拆成两个点,根据时间关系,互相连边。农田的限制在于源点出来的流的大小。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=;
const int INF=0x3f3f3f3f; struct Edge{
int to,next,f;
long long c;
Edge(){}
Edge(int _to,int _nxt,int _f,long long _c):to(_to),next(_nxt),f(_f),c(_c){}
}edge[N<<]; int head[N],idx;
bool vis[N];
long long dis[N];
int pree[N],prev[N];
void addedge(int u,int v,int flow,long long cost){
edge[++idx]=Edge(v,head[u],flow,cost);
head[u]=idx;
edge[++idx]=Edge(u,head[v],,-cost);
head[v]=idx;
}
bool spfa(int s,int e){
memset(vis,,sizeof(vis));
memset(pree,-,sizeof(pree));
memset(prev,-,sizeof(prev));
for (int i=;i<N;i++) dis[i]=~0ULL>>;
dis[s]=;
vis[s]=true;
queue<int>que;
que.push(s);
while (!que.empty()){
int cur=que.front();
que.pop();
vis[cur]=false;
for (int k=head[cur];k;k=edge[k].next){
if (edge[k].f){
int n=edge[k].to;
if (dis[n]>dis[cur]+edge[k].c){
dis[n]=dis[cur]+edge[k].c;
prev[n]=cur;
pree[n]=k;
if (!vis[n]){
vis[n]=true;
que.push(n);
}
}
}
}
}
if (dis[e]>=INF) return ;
return ;
}
long long minCostMaxFlow(int src,int sink){
long long cur,min_val;
long long ansf=,ansc=;
while (spfa(src,sink)){
cur=sink;
min_val=INF;
while (prev[cur]!=-){
if (min_val>edge[pree[cur]].f)
min_val=edge[pree[cur]].f;
cur=prev[cur];
}
cur=sink;
while (prev[cur]!=-){
edge[pree[cur]].f-=min_val;
edge[pree[cur]^].f+=min_val;
cur=prev[cur];
}
ansc+=dis[sink]*min_val;
ansf+=min_val;
}
return ansc;
} int s[N],t[N],v[N];
int main () {
int T;
scanf("%d",&T);
for (int cas=;cas<=T;cas++) {
int n,m;
scanf("%d %d",&n,&m);
for (int i=;i<=m;i++) {
scanf("%d %d %d",s+i,t+i,v+i);
}
idx=;memset(head,,sizeof head);
for (int i=;i<=m;i++) {
for (int j=;j<=m;j++) {
if (t[i]<s[j]) {
addedge(i+m,j,INF,);
}
}
}
int s=m+m+,t=m+m++;
for (int i=;i<=m;i++) {
addedge(,i,INF,);
addedge(i,i+m,,-v[i]);
addedge(i+m,t,INF,);
}
addedge(s,,n,);
long long ret=-minCostMaxFlow(s,t);
cout<<ret<<endl;
}
return ;
}
FOJ 11月月赛题解的更多相关文章
- 洛谷11月月赛题解(A-C)
心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...
- csu-2018年11月月赛Round2-div1题解
csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...
- csu-2018年11月月赛Round2-div2题解
csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...
- BZOJ5091 摘苹果 BZOJ2017年11月月赛 概率,期望
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5091 11月月赛B题 题意概括 题解 代码 #include <cstring> #i ...
- BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- LG 11 月 月赛 II T4
LG 11 月 月赛 II T4 看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子 首先看到式子可以化作, 如果 \(k = 0\) , $ f(l , ...
随机推荐
- 妙用 `package.json` 快速 `import` 文件(夹)
前言 import router from './router'; import router from '../../router'; import router from './../../../ ...
- .NET Core跨平台:.NET Core项目部署到linux(Centos7)
1.开篇说明 a 上篇博客简单的说明了一下 使用.NET Core开发的一个总结,地址是:(http://www.cnblogs.com/hanyinglong/p/6442148.html),那么这 ...
- Docker基础入门及示例
Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环 ...
- WCF请求数据:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。
通常情况下,写好WCF服务后都会用自带的WCFClient工具进行测试,在进行时数据请求的时候,如果返回数据量超过默认接收值的时候就会提示如图异常错误. 错误也提示的很清楚,无非就是修改接收值大小的问 ...
- checkSelfPermission 找不到 Android 动态权限问题
checkSelfPermission 找不到 Android 动态权限问题 最近写了一个Demo,以前好好地.后来手机更新了新系统以后,不能用总是闪退.而且我的小伙伴的是android 7.0系统 ...
- Web API框架学习——路由(一)
HttpConfiguration(ASP.NET Web API管道的配置是通过HttpConfiguration来完成) : 包括路由注册在内的对整个ASP.NET Web API管道的配置是通过 ...
- WebService从服务端到客户端的用例
1.首先编写Wsdl(基于契约优先的方式),要注意的是命名空间(若是使用include或import)最好使用一致的,代码如下: <?xml version="1.0" en ...
- iOS开发之UIApplication和delegate
1.概述 所有的移动操作系统都有个致命的缺点:app很容易受到打扰.比如一个来电或者锁屏会导致app进入后台甚至被终止. 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统 ...
- elasticsearch使用river同步mysql数据
====== mysql的river介绍====== - 什么是river?river代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法.它是以插件方式存在的一个e ...
- windows下搭建tensorflow的环境
这年头,不会点人工智能和神经网络,都不好意思跟人打招呼了.之前搞了一下sklearn,今天觉得应该要了解一下google这个传说中的人工智能开源神器. 最近终于有时间了,凡事从hello world开 ...