[考试反思]图论专题测试:怀疑

没写完,但是好像有人需要代码,于是先发布出来。

回去之后记得贴排行榜。

0+0+55.rk11.

考场上想出了T1的三分,不确定,没有写。

写了另一个好像靠谱点的二分,但是好像写挂了。。。

T2没读题,又是没读题,又是没读题!!!!

没看到它要求的是简单路径,于是简单爆9.

T3一眼网络流,两眼不会流,三眼状压写完就走。

最后也就T3有分。靠着一个状压苟到这个名次。。?

T1:center

题目大意:选择图上(点或边)上任意一点,使所有节点到这个节点最远的距离最小。$ n \le 200$

这是一堆一次函数在取max啊,显然是单谷的。

预处理出来点对距离,然后枚举每条边在边上三分最优位置更新答案。

但是为什么会卡参啊?0.4-0.6就过不去0.3-0.7就行,求解???

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 priority_queue<pair<int,int>>q;
 4 int dt[512][512],n,m,fir[512],l[543210],to[543210],v[543210],ec=1;double ans=1e9;
 5 void link(int a,int b,int w){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;v[ec]=w;}
 6 double cal(int e,double p){
 7     e<<=1;double d=0;
 8     for(int i=1;i<=n;++i)d=max(d,min(dt[to[e]][i]+p,dt[to[e|1]][i]+v[e]-p));
 9     return d;
10 }
11 int main(){
12     scanf("%d%d",&n,&m);
13     for(int i=1,a,b,w;i<=m;++i)scanf("%d%d%d",&a,&b,&w),link(a,b,w),link(b,a,w);
14     for(int s=1;s<=n;++s){
15         for(int t=1;t<=n;++t)dt[s][t]=1000000000;dt[s][s]=0;q.push(make_pair(0,s));
16         while(!q.empty()){
17             int p=q.top().second,d=-q.top().first;q.pop();if(d!=dt[s][p])continue;
18             for(int i=fir[p];i;i=l[i])if(dt[s][to[i]]>d+v[i])q.push(make_pair(-(dt[s][to[i]]=d+v[i]),to[i]));
19         }
20     }
21     for(int i=1;i<=m;++i){
22         double l=0,r=v[i<<1];
23         while(r-l>1e-5)if(cal(i,l*0.3+r*0.7)<cal(i,l*0.7+r*0.3))l=l*0.7+r*0.3;else r=l*0.3+r*0.7;
24         ans=min(ans,cal(i,l));
25     }printf("%.2lf\n",ans);
26 }

T2:escape

题目大意:给定无向图,求严格次短简单路径且满足所有最短路上的边必须按照原方向经过。$n \le 100000,m \le 500000,w \le 1000$

次短路可以分成三部分,先从1号点沿着最短路走到A,然后再从A走非最短路走到B,在从B走最短路到n。

暴力的做法时枚举AB。复杂度不可接受。

二进制分组分为A组B组就可以做了。

细节很多,注意1到A和B到n两部分都必须沿着最短路边定向走不然的话会导致出现非简单路径。

例子:4 4 1 2 1 2 3 1 1 3 1 1 4 666

然后中间一定要走非最短路,双向都不能走,不然也会导致形成非简单路径。

在这种前提下,你走出的当然不是最短路,而又是简单路径,在考虑到所有点对后就会找到次短路。

不要忘了在二进制分组时1为A0为B以及0为A1为B的两种情况都要考虑。

然而这貌似不是正解,题解里只给了这种做法,好像比正解多了一个log导致过不去,而且常数也小不了。实测有且只有70分。

在随机数据下A和B的随机某一位不同的概率为$50%$。所以我们不必都做完,只对最低的6位做然后更新答案正确率就达到$99\%$左右了,可以AC。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define S 1000005
 4 int n,m,fir[S],l[S],to[S],w[S],ec=1,nt[S],dt[S],dp[S],al[S],D[S],ans=1234567890,Fir[S],L[S],To[S],W[S],Ec=1;
 5 priority_queue<pair<int,int>>q;
 6 void link(int a,int b,int v){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;w[ec]=v;}
 7 void Link(int a,int b,int v){if(v>ans)return;L[++Ec]=Fir[a];Fir[a]=Ec;To[Ec]=b;W[Ec]=v;}
 8 void sch(int p){
 9     if(al[p])return;al[p]=1;
10     for(int i=fir[p];i;i=l[i])if(dt[to[i]]==dt[p]-w[i])nt[i^1]=2,nt[i]=1,sch(to[i]);
11 }
12 int main(){
13     scanf("%d%d",&n,&m);
14     for(int i=1,x,y,v;i<=m;++i)scanf("%d%d%d",&x,&y,&v),link(x,y,v),link(y,x,v);
15     for(int i=1;i<=n;++i)dt[i]=dp[i]=1234567890;
16     q.push(make_pair(dt[1]=0,1));
17     while(!q.empty()){
18         int p=q.top().second,d=-q.top().first;q.pop();
19         if(d!=dt[p])continue;
20         for(int i=fir[p];i;i=l[i])if(dt[to[i]]>d+w[i])q.push(make_pair(-(dt[to[i]]=d+w[i]),to[i]));
21     }sch(n);
22     for(int i=1;i<=n;++i)dt[i]=1234567890;q.push(make_pair(dt[1]=0,1));
23     while(!q.empty()){
24         int p=q.top().second,d=-q.top().first;q.pop();
25         if(d!=dt[p])continue;
26         for(int i=fir[p];i;i=l[i])if(dt[to[i]]>d+w[i]&&nt[i]==2)q.push(make_pair(-(dt[to[i]]=d+w[i]),to[i]));
27     }q.push(make_pair(dp[n]=0,n));
28     while(!q.empty()){
29         int p=q.top().second,d=-q.top().first;q.pop();
30         if(d!=dp[p])continue;
31         for(int i=fir[p];i;i=l[i])if(dp[to[i]]>d+w[i]&&nt[i]==1)q.push(make_pair(-(dp[to[i]]=d+w[i]),to[i]));
32     }srand(time(0));
33     for(int b=0;b<=5;b++){int x=0;
34 X:      for(int i=0;i<=n+1;++i)Fir[i]=0,D[i]=1234567890;Ec=1;
35         for(int i=1;i<=n;++i)if((i&1<<b)!=0^x)Link(0,i,dt[i]);else Link(i,n+1,dp[i]);
36         for(int i=2;i<=ec;i++)if(!nt[i])Link(to[i],to[i^1],w[i]);
37         q.push(make_pair(D[0]=0,0));
38         while(!q.empty()){
39             int p=q.top().second,d=-q.top().first;q.pop();
40             if(d!=D[p])continue;
41             for(int i=Fir[p];i;i=L[i])if(D[To[i]]>d+W[i])q.push(make_pair(-(D[To[i]]=d+W[i]),To[i]));
42         }ans=min(ans,D[n+1]);
43         if(!x){x=1;goto X;}
44     }cout<<(ans==1234567890?-1:ans)<<endl;
45 }

T3:chip

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define T (n<<1|1)
 4 #define N 666666
 5 #define inf 998244353
 6 int n,a,b,pc,l[N],to[N],fir[88],ans=9999,ec,v[N],w[N],q[N],d[N],al[88],iq[88],fee,lc[66],rc[66],tot;char s[44][44];
 7 void link(int a,int b,int V,int W){
 8     l[++ec]=fir[a];fir[a]=ec;to[ec]=b;v[ec]=V;w[ec]=+W;
 9     l[++ec]=fir[b];fir[b]=ec;to[ec]=a;v[ec]=0;w[ec]=-W;
10 }
11 bool SPFA(){
12     for(int i=1;i<=T;++i)d[i]=inf,al[i]=0;
13     for(int h=1,t=1;h<=t;iq[q[h]]=0,++h)for(int i=fir[q[h]];i;i=l[i])if(d[to[i]]>d[q[h]]+w[i]&&v[i]){
14         if(!iq[to[i]])q[++t]=to[i],iq[to[i]]=1;
15         d[to[i]]=d[q[h]]+w[i];
16     }return d[T]!=inf;
17 }
18 int dfs(int p,int flow){
19     if(p==T)return flow;
20     int r=flow;al[p]=1;
21     for(int i=fir[p];i&&r;i=l[i])if(!al[to[i]]&&d[to[i]]==d[p]+w[i]&&v[i]){
22         int x=dfs(to[i],min(v[i],r));
23         if(!x)d[to[i]]=inf;
24         v[i]-=x;v[i^1]+=x;r-=x;fee+=x*w[i];
25     }return flow-r;
26 }
27 int main(){
28     scanf("%d%d%d",&n,&a,&b);
29     for(int i=1;i<=n;++i)scanf("%s",s[i]+1);
30     for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(s[i][j]!=‘/‘)lc[i]++,rc[j]++,tot++,pc+=s[i][j]==‘C‘;
31     for(int x=0;x<=n;++x){
32         ec=1;for(int i=0;i<=T;++i)fir[i]=0;
33         for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(s[i][j]==‘.‘)link(i,j+n,1,1);
34         for(int i=1;i<=n;++i)link(0,i,lc[i],0),link(i+n,T,rc[i],0),link(i,i+n,x,0);
35         int fl=0;fee=0;
36         while(SPFA())fl+=dfs(0,inf);
37         if(x*b<=(fl-fee)*a&&fl==tot)ans=min(ans,fee);
38     }if(ans==9999)puts("impossible");else cout<<tot-pc-ans<<endl;
39 }

原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/12234343.html

时间: 2024-10-13 17:22:33

[考试反思]图论专题测试:怀疑的相关文章

[考试反思]数学专题测试4:深度

高斯消元专题测试 联赛后第一次爆零???我也不知道发生了什么 感觉和放假的关系不大啊... 虽说题比平时难而且数据范围出了一点锅,但是爆零有点过了?? 一眼看T3,MatrixTree啊肯定的,然后想到之前做的那个不等式的那道题直觉是容斥. 结果又想到了那个专题里幻想乡的那道题,于是更加笃定是容斥,结果思路就阻塞了. 20分的部分分好像很难写,就往后放了放,结果最后并没有时间写. 然后看起来比较简单的是T2,直到看到数据范围之前我都认为应该不会太难. 基础式子都会写,然后组合数忘记特判不合法的0

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

[考试反思]1002csp-s模拟测试57:平庸

一天两场,感觉要完. 不粘排行榜,太壮观了. #1:190 #2:180 #4:160 #35:150 #37:140 #39:120 #kx:20呃... 最后一个是考试结束后了. 又是CE盖40分.其实离#2不远... 调试语句没删干净,开O2编译出一条编译错误,没看,以为是那条关于scanf的warning. 然而并不是. 一定要仔细检查编译信息!!!交代码前一定要编译!!! 还有其实T1险些出锅,看错了题. 考试结束前7分钟重新看了一遍发现不对劲,+100pts. 看题!!! 要检查!!

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

[考试反思]1004csp-s模拟测试59:惊醒

一句话:我看错考试时间了,我以为11:30结束,T2T3暴力没来得及交. 为什么考试的时间忽然变了啊...没转过来 一定要看清考试的起止时间! 虽说T2T3连爆搜都没打,只打特殊性质只有32分.爆搜分还挺高的. 当特殊性质不好扩展时,记得把爆搜打上. 本来是想T1先送上暴力,然后尝试肝T2,然后是T3暴力,有时间再回来优化T1. 但是整场考试时间是崩的,也没回T1...然而T2T3 注意分数与时间的权衡. T1: BFS. 二营长打法极其简单.因为是BFS所以一个点不会被多次更新. 那么一次更新

[考试反思]1010csp-s模拟测试65:突袭

博客园挂了,不让粘图. 写的朴素一点. #1:100+100+25=225 #2:100+70+35=205 #2:100+60+45=205(我) 回到第一机房还算不错的第一仗. 考完之后我以为我AK了然而T2被卡常打成暴力,T3贪心伪证了(虽说是全场最高分) 全程在思考.很好啊. 继续保持. 注意常数,在卡常题上要花些时间优化打法卡常. T1:Simple 做法比较傻逼. 互质下才好做,所以把nm都干掉gcd,把这样贡献的答案先算上. 我们考虑列出一个表,每n个一行(n<=m). 这样如果某

[考试反思]1010csp-s模拟测试67:摸索

嗯...所谓RP守恒? 仍然延续着好一场烂一场的规律. 虽说我也想打破这个规律,但是并不想在考烂之后打破这个规律.(因为下一场要考好???) 我也不知道我现在是什么状态,相较于前一阶段有所提升(第一鸡房的buff?) 但是明显还有提升空间.也可以看到离上面的差距有多大. (在去食堂的路上一顿爆捶捶傻skyh就能进步一名了hhh) 这场考试呢,T1正路是推式子然而我又开始疯狂打表找规律,最后得到了一个和正解没什么关系但是能拿到80分的式子. 也肝了一个小时,然后就停止在80分了. 并不是没有在化式

[考试反思]1012csp-s模拟测试70:盘旋

这套题比较烂... 上来看到T2是原题,一想上一次考试遇到原题就不换,这次应该也是,于是直接开始码,码了一半然后换题了 T1打表找规律或者推式子都不难... T2水的一匹暴力剪枝即可,但是我并不知道数据那么那么水所以还花了很多时间优化 T3神奇的大模拟,挺有意思但是考场上不可能有人能拿到20+ 所以因为题比较烂,所以我就上去了? 隔了一场之后RP守恒又恢复了? 啊啊不要乱说啊再过十几分钟就又要考一场了啊... T1:木板 具体化式子也就是个初中数学,结论就是(最大平方因子的平方根-1)<<3,