今天 很不爽 昨天晚上没有睡好觉 大约2点才睡着吧 反正翻来覆去睡不着 不知道为什么可能可行流 或者可行费用流并没有深刻理解 。我不会写 让我心情非常的焦躁。

大凶 顺理成章的被3位强者吊着锤(妈呀我想吊锤他们啊。。

第一题 哇 这不是求两点之间的最短路径么 ? 圆方树直接上啊 。。好像正解不需要但是多了也不多。

然后成功挂掉了 可能心情很烦躁 然后没有多想直接样例过了 丢了没管

犯得 错误是 没有输出0 直接输出换行了 然后 应该输出0再输出换行的 真菜题都没读清。

还有一点是 输出0了没输出换行 真菜这都不知道哎 结果挂掉一堆分数 要不 应该 能得到一个自己满意的成绩 第一题挂彩了。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define EPS 1e-8
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=<<,maxn=MAXN<<;
//m<=2n 且双向边 加上方边 空间8倍
int T;
int n,m,num,cnt,top,len,len1,t,h,flag;
int s[maxn],q[maxn],vis[maxn],pre[maxn];
int lin[maxn],ver[maxn],nex[maxn];
int dfn[maxn],low[maxn];
int lin1[maxn],ver1[maxn],nex1[maxn];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void add1(int x,int y)
{
ver1[++len1]=y;
nex1[len1]=lin1[x];
lin1[x]=len1;
}
inline void tarjan(int x)
{
dfn[x]=low[x]=++num;
s[++top]=x;
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(!dfn[tn])
{
tarjan(tn);
low[x]=min(low[x],low[tn]);
if(low[tn]==dfn[x])
{
++cnt;
for(int y=;y!=tn;--top)
{
y=s[top];
add1(cnt,y);
add1(y,cnt);
}
add1(x,cnt);
add1(cnt,x);
}
}
else low[x]=min(low[x],dfn[tn]);
}
}
inline void bfs()
{
t=h=;
memset(vis,,sizeof(vis));
q[++t]=n;s[t]=;
while(h++<t)
{
int x=q[h];vis[x]=;
if(x==)return;
for(int i=lin1[x];i;i=nex1[i])
{
int tn=ver1[i];
if(vis[tn])continue;
pre[tn]=x;q[++t]=tn;
s[t]=s[h]+(tn<=n?:);
}
}
}
int main()
{
//freopen("1.in","r",stdin);
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
T=read();
while(T--)
{
len=len1=top=num=cnt=flag=;
memset(lin1,,sizeof(lin1));
memset(lin,,sizeof(lin));
memset(dfn,,sizeof(dfn));
n=read();m=read();cnt=n;
for(int i=;i<=m;++i)
{
int x,y;
x=read();y=read();
if(x==y)continue;
add(x,y);add(y,x);
if(x==&&y==n)flag=;
if(y==&&x==n)flag=;
}
tarjan();
if(!dfn[n]||flag){printf("%d\n",);puts("");continue;}
bfs();--s[h];
//cout<<h<<' '<<s[h]<<endl;
printf("%d\n",s[h]);
if(!s[h]){puts("");continue;}
memset(vis,,sizeof(vis));
int x=pre[];
while(x!=n)
{
vis[x]=;
x=pre[x];
}
int last=;
for(int i=;i<n;++i)
if(vis[i])
{
if(last)printf("%d ",last);
last=i;
}
printf("%d\n",last);
}
return ;
}

第二题植物大战僵尸可还行 题目比较 复杂把模型拿出来就比较简单了 注意判环即可。没挂还好。这个不对劲的人终于获得了欣慰。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
//空间只有64MB
const int MAXN=,maxn=MAXN*MAXN*MAXN*MAXN;
int n,m,cnt,len,t,h,S,T,len1=,sum,maxflow;
int pos[MAXN][MAXN];
int a[MAXN*MAXN],vis[MAXN*MAXN];
int ru[MAXN*MAXN],q[MAXN*MAXN];
int lt[MAXN*MAXN],vt[maxn],nt[maxn];
int lin[MAXN*MAXN],ver[maxn<<],nex[maxn<<],e[maxn<<];
inline void add(int x,int y)
{
vt[++len]=y;nt[len]=lt[x];lt[x]=len;
}
inline void add(int x,int y,int z)
{
ver[++len1]=y;nex[len1]=lin[x];lin[x]=len1;e[len1]=z;
ver[++len1]=x;nex[len1]=lin[y];lin[y]=len1;e[len1]=;
}
inline void topsort()
{
t=h=;
for(int i=;i<=cnt;++i)if(ru[i]==)q[++t]=i;
while(h++<t)
{
int x=q[h];
for(int i=lt[x];i;i=nt[i])
{
int tn=vt[i];
--ru[tn];
add(tn,x,INF);
if(!ru[tn])q[++t]=tn;
}
}
for(int i=;i<=cnt;++i)
{
if(ru[i])continue;
if(a[i]<)add(i,T,-a[i]);
else add(S,i,a[i]),sum+=a[i];
}
}
inline int bfs()
{
memset(vis,,sizeof(vis));
t=h=;q[++t]=S;vis[S]=;
while(h++<t)
{
int x=q[h];
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(!e[i]||vis[tn])continue;
vis[tn]=vis[x]+;
q[++t]=tn;
if(tn==T)return ;
}
}
return ;
}
inline int dinic(int x,int flow)
{
if(x==T)return flow;
int rest=flow,k;
for(int i=lin[x];i&&rest;i=nex[i])
{
int tn=ver[i];
if(vis[tn]==vis[x]+&&e[i])
{
k=dinic(tn,min(e[i],rest));
if(!k){vis[tn]=;continue;}
e[i]-=k;e[i^]+=k;rest-=k;
}
}
return flow-rest;
}
int main()
{
//freopen("1.in","r",stdin);
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
n=read();m=read();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)pos[i][j]=++cnt;
for(int i=;i<=n;++i)
{
for(int j=;j<=m;++j)
{
a[pos[i][j]]=read();
if(j>)
{
add(pos[i][j],pos[i][j-]);
++ru[pos[i][j-]];
}
int w=read();
for(int k=;k<=w;++k)
{
int x,y;
x=read()+;y=read()+;
++ru[pos[x][y]];
add(pos[i][j],pos[x][y]);
}
}
}
S=cnt+;T=S+;
topsort();
int flow=;
while(bfs())while((flow=dinic(S,INF)))maxflow+=flow;
printf("%d\n",max(,sum-maxflow));
return ;
}

第三题 区间操作 感觉是一流对多流? 好像不太行 仔细发现还是可以差分的变成单点操作 。

发现是一张二分图 我是差分后想到了二分一个值 区间最小值 然后维护整个区间都>=二分这个值即可。

然后乱建边 最后发现好像是个单峰函数 事实上这已经是我的败笔了因为单峰函数一出现三分随之而来 且非常不好写 应该停下 但是我仍然刚了1h 然后最后无奈拿到30分的辛苦分。我服了。

因为根本不需要知道那个最小值是多少 因为第一个值好像没什么卵用。只要后面的数比这个数大就好了二分或者三分这个值意义并不大。

下面说中午我稍微思考了一下想到的正解 真的比较简单 。对于一个差分过后数列来说我想到的是每一个位置上的数字如果小于0的话一定是不和法的我们期望的是将这个序列上的所有数字都>=0这样就好了,

观察+操作 发现l+1 (r+1)-1 这样 r如果是正数 其实就是负数向正数要1 显然正数和负数形成了二分图 具体做法就是这样。显然对于一个负数是拥有下界 全部连向源点下界成功被转换了。

再跑费用流即可。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define EPS 1e-8
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const ll MAXN=,maxn=MAXN*MAXN<<;
ll n,m,minn=INF,maxx,S,T,T1,len=,h,t1,p;
ll a[MAXN],b[MAXN];
ll pre[MAXN],in[MAXN],vis[MAXN],q[maxn<<],dis[maxn];
ll lin[MAXN],ver[maxn<<],nex[maxn<<],e[maxn<<],e1[maxn<<];
struct wy
{
ll op,l,c;
}t[MAXN];
inline void add(ll x,ll y,ll z,ll z1)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;e[len]=z;e1[len]=z1;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;e[len]=;e1[len]=-z1;
}
inline ll spfa()
{
for(ll i=;i<=T;++i)dis[i]=INF;
h=t1=;
dis[S]=;vis[S]=;in[S]=INF;q[++t1]=S;
while(h++<t1)
{
ll x=q[h];vis[x]=;
for(ll i=lin[x];i;i=nex[i])
{
ll tn=ver[i];
if(!e[i])continue;
if(dis[tn]>dis[x]+e1[i])
{
dis[tn]=dis[x]+e1[i];
in[tn]=min(in[x],e[i]);
pre[tn]=i;
if(!vis[tn])q[++t1]=tn,vis[tn]=;
}
}
}
return dis[T]!=INF;
}
inline ll EK()
{
ll maxflow=,sum=;
while(spfa())
{
ll x=T,i=pre[x];
sum+=dis[x]*in[T];
maxflow+=in[T];
while(x!=S)
{
e[i]-=in[T];
e[i^]+=in[T];
x=ver[i^];i=pre[x];
}
}
if(maxflow!=p)return -;
return sum;
}
int main()
{
//freopen("1.in","r",stdin);
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
n=read();m=read();T1=n+;S=T1+;T=S+;
for(ll i=;i<=n;++i)a[i]=read();
for(ll i=;i<=m;++i)
{
char op;ll x,y;
op=getc();
while(op==' '||op=='\n')op=getc();
x=read();y=read();
t[i]=(wy){op=='-'?:,x,y};
}
if(n==){printf("%d\n",);return ;}
for(ll i=;i<=n;++i)b[i]=a[i]-a[i-];
b[T1]=INF;
for(ll i=;i<=n+;++i)
{
if(b[i]>)add(i,T,b[i],);
else add(S,i,-b[i],),p+=-b[i];
}
add(,T,INF,);
for(ll i=;i<=n;++i)
for(ll j=;j<=m;++j)
{
if(t[j].op)
{
ll l=i,r=i+t[j].l;
if(r>T1)continue;
add(l,r,INF,t[j].c);
}
else
{
ll l=i,r=l+t[j].l;
if(r>T1)continue;
add(r,l,INF,t[j].c);
}
}
printf("%lld\n",EK());
return ;
}

GG 总有一天我将会AK的 (突然WN附体嘻嘻。

2019 7 8 HL 模拟赛的更多相关文章

  1. 『2019/4/9 TGDay2模拟赛 反思与总结』

    2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...

  2. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  3. 2019.7.26 NOIP 模拟赛

    这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...

  4. 2019.03.19 ZJOI2019模拟赛 解题报告

    得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...

  5. 2019.03.13 ZJOI2019模拟赛 解题报告

    得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...

  6. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  7. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...

  8. 2019.03.16 ZJOI2019模拟赛 解题报告

    得分: \(100+27+20=147\)(\(T1\)巨水,\(T2,T3\)只能写暴力分) \(T1\):深邃 比较套路的一眼题,显然是一个二分+贪心,感觉就是\(NOIP2018Day1T3\) ...

  9. 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)

    二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...

随机推荐

  1. JSR 303 进行后台数据校验

    一.JSR 303 1.什么是 JSR 303? JSR 是 Java Specification Requests 的缩写,即 Java 规范提案. 存在各种各样的 JSR,简单的理解为 JSR 是 ...

  2. v-model修饰符

    1).lazy:取代 input 监听 change 事件. 用法: v-model.lazy="message" 效果: 在input输入框改变数据时,v-model绑定的DOM ...

  3. 数据可视化之DAX篇(十八)收藏 | DAX代码格式指南

    https://zhuanlan.zhihu.com/p/64422599 为什么要进行格式化? DAX 是一种函数式语言,正如我们已经学习的或者看到的,DAX 代码中总有一些函数带有几个参数,而参数 ...

  4. 数据可视化之PowerQuery篇(五)PowerQuery文本处理技巧:移除和提取

    https://zhuanlan.zhihu.com/p/64419762 每当拿到原始数据,不如意十有八九,快速准确的清洗数据也是必备技能,数据清洗正好是 PowerQuery 的强项,本文就来介绍 ...

  5. 网络编程-UDP、TCP

    总结

  6. 集合-ConcurrentLinkedQueue 源码解析

    问题 (1)ConcurrentLinkedQueue是阻塞队列吗? (2)ConcurrentLinkedQueue如何保证并发安全? (3)ConcurrentLinkedQueue能用于线程池吗 ...

  7. v-bind v-on 缩写

    Vue.js 为两个最为常用的指令提供了特别的缩写:

  8. 谷歌浏览器扩展 crx 下载

    下方服务可让国内成功下载谷歌浏览器.crx 扩展,如谷歌浏览器无法安装,可以使用终极解决方法,把.crx 解压缩,然后在扩展中心中开启 开发者模式然后选择加载已解压的扩展程序. 需要注意的是解压缩的文 ...

  9. C++语法小记---函数重载

    函数重载 函数重载的本质是对已有功能的扩展 构成重载的三大条件 函数名相同 参数列表不通(与返回值无关) 重载函数的作用域相同 成员函数之间可以重载,成员函数和静态成员函数之间可以构成重载,全局函数之 ...

  10. GitHub和码云gitee及远程仓库管理

    目录 备注: 知识点 GitHub 码云(gitee.com) gitee的使用 本地版本库关联多个远程库 备注: 本文参考于廖雪峰老师的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢 ...