今天 很不爽 昨天晚上没有睡好觉 大约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. 如何白嫖微软Azure12个月及避坑指南

    Azure是微软提供的一个云服务平台.是全球除了AWS外最大的云服务提供商.Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务.这里的Azure是Azure国际不是 ...

  2. Dynamics CRM Data Encrytion error

    Dynamics CRM有两个Database,一个Content DB——xxxx_MSCRM,一个Config DB——MSCRM_CONFIG. 当Content DB从其他环境Restore回 ...

  3. LNMP架构应用案例----WordPress

    一.环境部署 mysql        172.16.1.10                                  数据库 web01      10.0.0.11      172.1 ...

  4. python 装饰器(三):装饰器实例(一)

    示例 7-15 定义了一个装饰器,它会在每次调用被装饰的函数时计时,然后把经过的时间.传入的参数和调用的结果打印出来.示例 7-15 一个简单的装饰器,输出函数的运行时间 import time de ...

  5. 04-Python函数

    一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...

  6. python也能玩视频剪辑!moviepy操作记录总结

    前几篇文章咱们介绍了一下图片的处理方式,今天咱们说说视频的处理.python能够支持视频的处理么?当然是肯定的,人生苦读,我用python.万物皆可python. moviepy库安装 今天咱们需要使 ...

  7. Ant-Design-Vue中关于Form组件的使用

    1.创建form表单的两种方式,不同的方式在js中创建表单的方式也不同 方式1:一般使用在搜索表单中,只需要双向绑定数据即可,那就使用这种方法即可 <template> <a-for ...

  8. .NET 开源项目 StreamJsonRpc 介绍[下篇]

    阅读本文大概需要 9 分钟. 大家好,这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇.上篇介绍了一些预备知识,包括 JSON-RPC 协议介绍,StreamJsonRpc 是一个 ...

  9. Java中多线程的使用(超级超级详细)线程安全原理解析 4

    Java中多线程的使用(超级超级详细)线程安全 4 什么是线程安全? 有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样 ...

  10. 产品升级前后MD5码对比

    在做产品测试的时候,经常会需要对比升级前后的MD5码,这时可以通过终端登录设备,具体步骤如下: 1.在升级前时,将MD5码写入log1.info文件: check_md5 -d / -w log1.i ...