各种模拟

 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 */
WA 0

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 */
WA 90

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 */
TLE 27

 该骗到的分没骗到,优化意识不强。不够认真。

 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 */
WA 10

 以后做图论题,先手模数据找性质.

 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 */
WA 20

 对拍可以解决低错,还有特殊情况,要重视

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 */
WA 0

  其实像这种题,保证卡完送分点就可以弃掉了,除非T1,T2也很难。   

2019/7/22

rank42/56   

考自闭了,只谈谈注意事项吧

T1:没有考虑清楚所有可特判的情况,exgcd的理解不透,板子会码,然而不明白算出来的不是最小解。

T2:交了个CE!!!!!暴搜思路对了,尚不清楚哪里出错了

T3:没时间了,emmm,没有注意墙可以反弹...

心态爆炸,考试中途一小时gedit白了,????,被迫用了guide,总之这次比较失败。相信这次失误下次不再犯。

希望下次能Burning like a fire gone wild on Saturday.

 

猜你喜欢

转载自www.cnblogs.com/2018hzoicyf/p/11200803.html