抽空在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月月赛题解的更多相关文章

  1. 洛谷11月月赛题解(A-C)

    心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...

  2. csu-2018年11月月赛Round2-div1题解

    csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...

  3. csu-2018年11月月赛Round2-div2题解

    csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...

  4. BZOJ5091 摘苹果 BZOJ2017年11月月赛 概率,期望

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5091 11月月赛B题 题意概括 题解 代码 #include <cstring> #i ...

  5. BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...

  6. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  7. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  8. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  9. LG 11 月 月赛 II T4

    LG 11 月 月赛 II T4 看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子 首先看到式子可以化作, 如果 \(k = 0\) , $ f(l , ...

随机推荐

  1. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  2. 1011: [HNOI2008]遥远的行星

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2241  Solved ...

  3. RxJava 笔记

    前言 目前 RxJava 是安卓开发圈内最流行的库之一,本来准备研究研究,但看了扔物线写的<给 Android 开发者的 RxJava 详解>后,觉得生无可恋,哦不,是觉得已经写无可写. ...

  4. windows系统解决github.com访问超时

    当github无法访问时,可以尝试在hosts文件中添加下面的内容 windows:c:\windows\system32\drivers\etc 192.30.252.131 https://git ...

  5. iOS开发优秀博客和软件推荐

    iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...

  6. iOS开发之数据存储之XML属性列表(plist)归档

    1.概述 “归档”意思是持久化存储数据.plist文件是一种XML格式的文件,拓展名为plist.如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等 ...

  7. iOS开发之类扩展

    在以往写代码时,我们经常是把声明写在.h文件中,把实现写在.m文件中,但是在实际开发中,如果把声明写在.h文件中会暴露程序很多属性(成员变量.成员变量的get和set方法),为了安全考虑,引入了类扩展 ...

  8. Spring 框架原理

    [spring框架原理] Spring框架原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 写给读者的话 ------亲爱的读者感谢您对小编的支持,当我正值 ...

  9. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充

    打开Jammendo进入到首页之后,会看到这样一个界面.可以看到下左效果,我们可以看到,他是上部分的ViewFlipper模块和下半部分的listview模块构成的,今天就简单的说一下Jammendo ...

  10. Python之路-shell&计划任务

    开发脚本自动部署及监控1.编写脚本自动部署反向代理.web.nfs:要求: I.部署nginx反向代理三个web服务,调度算法使用加权轮询:           II.所有web服务使用共享存储nfs ...