2019/7/16
rank 20/51
嗯嗯,确实比较接近noip的难度了,第一次体验到自己想到正解的快感。然而成绩不尽人意.
T1:概率DP,显然,犯难,日常不会概率DP。(题目讲的辣莫短,我系不系理解错了?猜题意,昂,能同时取两件吗?不忘看一眼数据范围,N<=20,状压好像只能开到15,emmm,果断放弃状压[其实能开到20].)哈哈,把T2搞定,T3打完后,我又回来了,我是来拿那10%的,打个处理N==1的暴搜,心里美滋滋。
结果下来,脸都黑了,期望暴搜,精度不会卡,而且N==1,输出(1/P[1])就可以啦???!!!!
1 #include<cstdio> 2 #include<iostream> 3 #define MAXN 25 4 #define reg register int 5 using namespace std; 6 int N; 7 int W[MAXN]; 8 double P[MAXN]; 9 double ans; 10 void dfs(int pos,int gl){ 11 double lin=(pos+1)*P[1]*gl; 12 ans+=lin; 13 lin=(pos+1)*(1-P[1])*gl; 14 if(lin>=0.0001){ 15 dfs(pos+1,gl*(1-P[1])); 16 } 17 } 18 int sum; 19 int main(){ 20 scanf("%d",&N); 21 for(reg i=1;i<=N;++i){ 22 scanf("%lf%d",&P[i],&W[i]); 23 sum+=W[i]; 24 } 25 if(N==1){ 26 printf("%d\n",W[1]); 27 dfs(0,1); 28 printf("%.3lf\n",ans); 29 return 0; 30 } 31 printf("%d\n",sum); 32 if(N==3){ 33 puts("12.167"); 34 return 0; 35 } 36 puts("24.123"); 37 return 0; 38 } 39 /* 40 N=1 emmm... 41 */
T2:昂?出题人玩b站?追番? 问路径最小费用,!!!!!,终于考图论了,我板子码的不赖(老泪纵横)。相互之间无费用,显然缩点,sb题,问整体,索完点跑克鲁斯卡尔就行了(信誓旦旦)。30min后,输样例,秒过,kx得一批。先看第三题,对拍先不打了。10min后,不对劲,第一次考水题,我要是没A岂不是很没面子,而且排名也高不了。恩,自信的码了10分的特判,昂,还要清零,检查数据范围。沉思ing,Kru不对,这是有向图,完呐,完呐,用topu保证考虑到最小权值,搞贪心。先啐一口,然后码topu,幸好老子机智,我都考虑这么多,一定能A掉。QAQ,90?,特判没清零,我真想锤死自己。
1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<vector> 6 #include<algorithm> 7 #define MD 50010 8 #define ME 100010 9 #define ll long long 10 #define reg register int 11 using namespace std; 12 inline int minn(int a,int b){ 13 return a<b?a:b; 14 } 15 inline int read(){ 16 int s=0; 17 char ch=getchar(); 18 while(ch<'0'||ch>'9')ch=getchar(); 19 while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); 20 return s; 21 } 22 ll ans; 23 struct rr{ 24 int inext,to; 25 int w; 26 }bl[ME],tbl[ME]; 27 int thead[MD],ttot,head[MD],itot; 28 void add(int x,int y,int z){ 29 bl[++itot].w=z; 30 bl[itot].to=y; 31 bl[itot].inext=head[x]; 32 head[x]=itot; 33 } 34 void tadd(int x,int y,int z){ 35 tbl[++ttot].w=z; 36 tbl[ttot].to=y; 37 tbl[ttot].inext=thead[x]; 38 thead[x]=ttot; 39 } 40 int N,M; 41 int root=1; 42 int dfn[MD],low[MD],num; 43 int stack[MD],top; 44 bool instack[MD]; 45 int tot,belong[MD]; 46 void tarjan(int u){ 47 low[u]=dfn[u]=++num; 48 stack[++top]=u;// 49 instack[u]=true; 50 int tto; 51 for(reg i=head[u];i;i=bl[i].inext){ 52 if(!dfn[tto=bl[i].to]){ 53 tarjan(tto); 54 low[u]=minn(low[u],low[tto]); 55 } 56 else if(instack[tto]) 57 low[u]=minn(low[u],dfn[tto]); 58 } 59 if(dfn[u]==low[u]){ 60 int tan=stack[top]; 61 ++tot; 62 while(tan!=u){ 63 belong[tan]=tot; 64 instack[tan]=false; 65 tan=stack[--top]; 66 } 67 --top; 68 belong[u]=tot; 69 instack[u]=false; 70 } 71 } 72 int ru[MD]; 73 void init(){ 74 int x,y; 75 for(int i=1;i<=N;++i){ 76 x=belong[i]; 77 // printf("orz belong[%d]=%d\n",i,x); 78 for(reg j=head[i];j;j=bl[j].inext){ 79 y=belong[bl[j].to]; 80 if(x==y)continue; 81 tadd(x,y,bl[j].w); 82 ++ru[y]; 83 } 84 } 85 } 86 queue<int >dd; 87 int zui[MD]; 88 void topu(){ 89 int tto; 90 dd.push(belong[root]); 91 zui[belong[root]]=0; 92 while(!dd.empty()){ 93 int ltop=dd.front();dd.pop(); 94 for(reg i=thead[ltop];i;i=tbl[i].inext){ 95 tto=tbl[i].to; 96 --ru[tto]; 97 zui[tto]=minn(zui[tto],tbl[i].w); 98 if(!ru[tto]) 99 dd.push(tto); 100 } 101 } 102 } 103 void shan(){ 104 ttot=tot=num=itot=0; 105 ans=0; 106 memset(thead,0,sizeof(thead)); 107 memset(head,0,sizeof(head)); 108 // memset(belong,0,sizeof(belong)); 109 // memset(ru,0,sizeof(ru)); 110 memset(zui,0x7f,sizeof(zui)); 111 memset(low,0,sizeof(low)); 112 memset(dfn,0,sizeof(dfn)); 113 } 114 int main(){ 115 // freopen("da.in","r",stdin);///!!!!!! 116 while(1){ 117 // printf("orz tiao _____________\n"); 118 N=read();M=read(); 119 if(N+M==0)break; 120 int xi,yi,ci; 121 if(M==N-1){ 122 for(reg i=1;i<=M;++i){ 123 read();read();ci=read(); 124 ans+=1ll*ci; 125 } 126 printf("%lld\n",ans); 127 continue; 128 } 129 shan(); 130 for(reg i=1;i<=M;++i){ 131 xi=read()+1;yi=read()+1;ci=read(); 132 add(xi,yi,ci); 133 } 134 tarjan(1); 135 init(); 136 topu(); 137 for(reg i=1;i<=tot;++i) 138 ans+=1ll*zui[i]; 139 printf("%lld\n",ans); 140 } 141 return 0; 142 } 143 /* 144 clear 145 10% 树,无环,ans=sum(edge) 146 tarjan+Kru kru=wrong 147 topu=defen 148 */
T3:第一眼,区间DP,搞一下,woc,N到50000,失败,还是搞暴力吧,N<=5000,区间和,N>5000,lower_bound(),贼爽。在扫一眼题目,每行每列只有一只军队,状压?,5000也开不了啊。emmm...莫不是bitset(学长昨天刚讲)。无限yy中。看到wd等大神搞了64,zkt也优化成了55,emmm...,我优化都不会打,QAQ。正解是处理成序列问题,妙啊。
1 #include<cstdio> 2 #include<iostream> 3 #include<vector> 4 #include<algorithm> 5 #define MAXN 50010 6 #define reg register int 7 using namespace std; 8 inline int read(){ 9 int s=0; 10 char ch=getchar(); 11 while(ch<'0'||ch>'9')ch=getchar(); 12 while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); 13 return s; 14 } 15 int N; 16 vector<int >hh[MAXN]; 17 int heng[MAXN],zong[MAXN]; 18 int ans; 19 int qsum[5010][5010]; 20 bool cmp(int a,int b){ 21 return a<b; 22 } 23 void tong(int h,int z,int len){ 24 if(h+len-1>N)return ; 25 if(z+len-1>N)return ; 26 int zuo=z,you=z+len-1; 27 int l1,l2; 28 int sum=0; 29 for(reg i=h;i<=h+len-1;++i){ 30 l1=lower_bound(hh[i].begin(),hh[i].end(),zuo)-hh[i].begin(); 31 l2=upper_bound(hh[i].begin(),hh[i].end(),you)-hh[i].begin(); 32 sum+=l2-l1; 33 } 34 if(sum==len) 35 ++ans; 36 } 37 void tong1(int h,int z,int len){ 38 if(h+len-1>N)return ; 39 if(z+len-1>N)return ; 40 int zuo=z,you=z+len-1; 41 int sum=0; 42 for(reg i=h;i<=h+len-1;++i){ 43 sum+=qsum[i][you]-qsum[i][zuo-1]; 44 } 45 if(sum==len) 46 ++ans; 47 } 48 int main(){ 49 // freopen("da.in","r",stdin); 50 ans=N=read(); 51 ++ans; 52 for(reg i=1;i<=N;++i){ 53 heng[i]=read();zong[i]=read(); 54 hh[heng[i]].push_back(zong[i]); 55 } 56 if(N<=5000){ 57 for(reg i=1;i<=N;++i) 58 if(!hh[i].empty()){ 59 sort(hh[i].begin(),hh[i].end(),cmp); 60 for(reg k=0;k<hh[i].size();++k){ 61 qsum[i][hh[i][k]]=1; 62 } 63 for(reg k=1;k<=N;++k) 64 qsum[i][k]=qsum[i][k]+qsum[i][k-1]; 65 } 66 for(reg len=2;len<N;++len) 67 for(reg i=1;i<=N-len+1;++i) 68 for(reg j=1;j<=N-len+1;++j) 69 tong1(i,j,len); 70 printf("%d\n",ans); 71 return 0; 72 } 73 for(reg i=1;i<=N;++i) 74 if(!hh[i].empty()) 75 sort(hh[i].begin(),hh[i].end(),cmp); 76 for(reg len=2;len<N;++len) 77 for(reg i=1;i<=N-len+1;++i) 78 for(reg j=1;j<=N-len+1;++j) 79 tong(i,j,len); 80 printf("%d\n",ans); 81 return 0; 82 } 83 /* 84 er chazhao+baoli 85 qian zhui he youhua 86 */
该骗到的分没骗到,优化意识不强。不够认真。
2019/7/18
rank 38/55
T1:先扫了所有题,T1和T3有些莫名的相似,估计和组合数有关系,(emmm还真和组合数有关系)。然而其实没任何思路,暴搜也不太会码,直接跳过。考场下来,得知是欧拉路时,挺懊悔自己概念不清,无意识。但当我现在过掉时,短短40行代码,就在朦胧的睡眼中A掉了。交流发现自己对于这种题方法完全免疫,(其实就是找规律)。姑且不说,学dfs序版lca时自己嗑了一顿欧拉序,whs大神画了几张图就粗来了???但是他带我水过太鼓达人 时(01序列找规律),我并没有认真思考这种题的心路历程,这是平时做的不到位...
1 #include<cstdio> 2 #include<iostream> 3 #define MAXN 100010 4 #define ll long long 5 using namespace std; 6 inline int read(){ 7 int s=0; 8 char ch=getchar(); 9 while(ch<'0'||ch>'9')ch=getchar(); 10 while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); 11 return s; 12 } 13 struct rr{ 14 int inext,to; 15 }bl[MAXN<<1];int head[MAXN],itot; 16 void add(int x,int y){ 17 bl[++itot].to=y; 18 bl[itot].inext=head[x]; 19 head[x]=itot; 20 } 21 int n,m; 22 ll ans; 23 short bian[MAXN<<1]; 24 int lim; 25 void dfs(int u,int js){ 26 // printf("u=%d js=%d\n",u,js); 27 bool ok=0; 28 for(int i=head[u];i;i=bl[i].inext){ 29 if(bian[i]==2)continue; 30 if(!bian[i]){ 31 ++bian[i];++bian[i^1]; 32 ok=1; 33 dfs(bl[i].to,js); 34 --bian[i];--bian[i^1]; 35 } 36 else{ 37 if(js<lim){ 38 ++bian[i];++bian[i^1]; 39 ok=1; 40 dfs(bl[i].to,js+1); 41 --bian[i];--bian[i^1]; 42 } 43 } 44 } 45 if(!ok)++ans; 46 return ; 47 } 48 int main(){ 49 // freopen("da1.in","r",stdin); 50 itot=1; 51 n=read();m=read(); 52 lim=m-2; 53 for(int i=1,a,b;i<=m;++i){ 54 a=read();b=read(); 55 add(a,b);add(b,a); 56 } 57 dfs(1,0); 58 printf("%lld\n",ans/(n-1)); 59 } 60 /* 61 20% zhuang ya? 62 hai shi baosou ba , 63 sha dou bu hui ma 64 */
以后做图论题,先手模数据找性质.
T2:种在序列上,线段树?区间查询?我想的是把每个点初始化成负权值,然后可以区间修改,区间查询。然鹅发现可以二分,二分竟然是错的。确实不满足单调性。k<=1?不会码,自己好垃圾。最终只拿了20分(好吧,r的初始值也没想对)。正解是数论分块,听起来很高大上,但其实就是分段函数。神犇的soul竟然AK了,%一波。其实要是拍一波,感脚自己还是可以发现问题的。
1 #include<cstdio> 2 #include<iostream> 3 #define MAXN 110 4 #define ll long long 5 using namespace std; 6 inline ll read(){ 7 ll s=0; 8 char ch=getchar(); 9 while(ch<'0'||ch>'9')ch=getchar(); 10 while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); 11 return s; 12 } 13 inline ll maxn(ll a,ll b){ 14 return a>b?a:b; 15 } 16 ll l,r; 17 ll n,k; 18 ll rn[MAXN]; 19 inline ll xs(ll a,ll b){ 20 ll lin=a/b; 21 if(lin*b==a)return lin; 22 else return lin+1; 23 } 24 bool pd(ll d){ 25 // printf("orz d=%d\n",d); 26 ll js=k; 27 for(int i=1;i<=n;++i){ 28 // printf("QAQ i=%d\n",i); 29 // printf("x=%d duo=%d\n",xs(rn[i],d),xs(rn[i],d)*d-rn[i]); 30 js-=xs(rn[i],d)*d-rn[i]; 31 if(js<0)return false; 32 } 33 if(js<0)return false; 34 return true; 35 } 36 int main(){ 37 // freopen("da.in","r",stdin);//!!!!!!!!!!!shan 38 n=read();k=read(); 39 for(int i=1;i<=n;++i){ 40 rn[i]=read(); 41 r=maxn(rn[i],r); 42 // printf("rn[%d]=%d\n",i,rn[i]); 43 } 44 l=1; 45 while(r-l>1){ 46 ll mid=l+r>>1; 47 if(pd(mid))l=mid; 48 else r=mid; 49 // printf("l=%d r=%d\n",l,r); 50 } 51 if(pd(r))printf("%lld\n",r); 52 else printf("%lld\n",l); 53 } 54 /* 55 wan na kai ll 56 gaodu bu di yu!!!!! 57 zhi hou zhe ke shu miao bu zai zhang gao??? 58 20% k<=1 59 qi ta erfen ? 60 */
对拍可以解决低错,还有特殊情况,要重视
T3:超级树?无限懵比,考虑暴搜,建图就要画不少时间。尽管优化了两层循环,但是k==6仍然跑不粗来。而且考试中取模去错了,毒瘤出题人竟然造了1%1的数据,天!正解DP很神,为了保证不相交,状态自带BUFF,三层循环就跑粗来了!!!不过情况很多,真让人头大。wd orz,让我看懂了题解,受益匪浅。
1 #include<cstdio> 2 #include<vector> 3 #include<iostream> 4 #include<cstring> 5 #define ll long long 6 using namespace std; 7 inline int read(){ 8 int s=0; 9 char ch=getchar(); 10 while(ch<'0'||ch>'9')ch=getchar(); 11 while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); 12 return s; 13 } 14 vector<int >bl[1<<11|1]; 15 int k,mod,root; 16 ll ans; 17 int MOD(int a){ 18 return a<mod?a:(a-mod); 19 } 20 bool fw[1<<11|1]; 21 int sum; 22 void dfs(int u,int len){ 23 // printf("u=%d len=%d\n",u,len); 24 if(len==(1<<k)){ 25 return ; 26 } 27 sum=(sum+1)%mod; 28 fw[u]=true; 29 for(int k=0;k<bl[u].size();++k){ 30 if(fw[bl[u][k]])continue; 31 dfs(bl[u][k],len+1); 32 } 33 fw[u]=false; 34 return ; 35 } 36 int hai[101],ncnt[101]; 37 void init(int u,int sd){ 38 ++ncnt[sd]; 39 hai[sd]=u; 40 if(sd==k)return ; 41 init((u<<1),sd+1); 42 init((u<<1|1),sd+1); 43 for(int k=0;k<bl[u<<1].size();++k){ 44 bl[u].push_back(bl[u<<1][k]); 45 bl[bl[u<<1][k]].push_back(u); 46 } 47 for(int k=0;k<bl[u<<1|1].size();++k){ 48 bl[u].push_back(bl[u<<1|1][k]); 49 bl[bl[u<<1|1][k]].push_back(u); 50 } 51 bl[u].push_back(u<<1);bl[u].push_back(u<<1|1); 52 bl[u<<1].push_back(u);bl[u<<1|1].push_back(u); 53 return ; 54 } 55 int cc; 56 int main(){ 57 // freopen("da.in","r",stdin); 58 k=read();mod=read(); 59 if(k==1){ 60 printf("%d\n",1); 61 return 0; 62 } 63 if(k==2){ 64 printf("%d\n",(11%mod)); 65 return 0; 66 } 67 if(k==3){ 68 printf("%d\n",(353%mod)); 69 return 0; 70 } 71 if(k==4){ 72 printf("%d\n",(185623%mod)); 73 return 0; 74 } 75 if(k==5){ 76 printf("%d\n",(464391539%mod)); 77 return 0; 78 } 79 ans=((1<<k)-1)*1ll; 80 init(root=1,1); 81 for(int sd=1;sd<=k;++sd){ 82 dfs(hai[sd],0); 83 ans=(ans+sum*ncnt[sd]%mod)%mod; 84 sum=0; 85 // printf("%lld\n",ans); 86 } 87 printf("%lld\n",ans%mod); 88 } 89 /* 90 wa na wa na da biao=fail 91 40% k<=10 da biao 92 fa xian tongyi shendu de tong yi len de xianranxiang tong 93 */
其实像这种题,保证卡完送分点就可以弃掉了,除非T1,T2也很难。
2019/7/22
rank42/56
考自闭了,只谈谈注意事项吧
T1:没有考虑清楚所有可特判的情况,exgcd的理解不透,板子会码,然而不明白算出来的不是最小解。
T2:交了个CE!!!!!暴搜思路对了,尚不清楚哪里出错了
T3:没时间了,emmm,没有注意墙可以反弹...
心态爆炸,考试中途一小时gedit白了,????,被迫用了guide,总之这次比较失败。相信这次失误下次不再犯。
希望下次能Burning like a fire gone wild on Saturday.