留坑....

改完题再说吧。

留坑....

最近考得什么鬼??
模拟53
T1 u(差分)


一道差分题????
然而考场没有想到如何维护斜率上的差分,事后经miemeng和cyf的生(xuan)动(xue)讲解大概是懂了
联想如何维护一个矩形的差分??
假设我们区间修改为L1,R1,L2,R2,
我们在L2+1,R2+1处+1,在L1,R1处+1,在L2+1,R1处-1,在L1,R2+1处-1,然后画图发现从左向右递推时
我们维护的二维前缀和中有+1的部分恰好是区间修改的部分
同理,我们现在维护出一个三角形
首先考虑斜率,假设L1,R1左上角,len为直角边长度,在L1,R1加一,在L1+len,R1+len处-1我们按斜率递推一下就得到斜线上的贡献,然后在考虑直线上的贡献,我们在维护列上的前缀和,然后再按行递推一下就可以画出三角形

 1 #include<bits/stdc++.h>
2 #define MAXN 2101
3 #define int long long
4 using namespace std;
5 int hang[MAXN][MAXN];int lie[MAXN][MAXN];int sum[MAXN][MAXN];
6 int n,q;
7 int read(){
8 int x=0;char c=getchar();
9 while(c<'0'||c>'9')c=getchar();
10 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
11 return x;
12 }
13 int ans=0;
14 signed main(){
15 n=read();q=read();
16 for(int i=1;i<=q;++i){
17 int l=read();int r=read();int len=read();int s=read();
18 lie[l][r-1]-=s;
19 lie[l+len][r-1]+=s;
20 sum[l][r]+=s;
21 sum[l+len][r+len]-=s;
22 }
23 for(int i=1;i<=2*n;++i){
24 for(int j=1;j<=2*n;++j){
25 sum[i][j]=sum[i][j]+sum[i-1][j-1];
26 }
27 }
28 for(int j=1;j<=2*n;++j){
29 for(int i=1;i<=2*n;++i){
30 lie[i][j]=lie[i][j]+lie[i-1][j];
31 }
32 }
33 for(int j=2*n;j>=1;--j){
34 for(int i=1;i<=n*2;++i){
35 hang[i][j]=sum[i][j]+lie[i][j];
36 hang[i][j]+=hang[i][j+1];
37 }
38 }
39 for(int i=1;i<=n;++i){
40 for(int j=1;j<=n;++j)
41 ans^=hang[i][j];
42 }
43 printf("%lld\n",ans);
44 }


T2 v(哈希表,记忆化搜索)


第一学了哈系表,因为当前决策不明,而且n的范围很小,所以就记忆化搜索了????

 1 #include<bits/stdc++.h>
2 #define MAXN 31000001
3 #define int long long
4 using namespace std;
5 int read(){
6 int x=0;char c=getchar();
7 while(c<'0'||c>'9')c=getchar();
8 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
9 return x;
10 }
11 int k;int n;
12 const int mod=30000001;
13 struct map_hash{
14 struct node{int to,n;double val;int len;}e[31000001];
15 int tot=0;
16 int head[MAXN];int len=0;
17 double &operator[](int state){
18 int st=state*len%mod+1;
19 for(int i=head[st];i;i=e[i].n){
20 if(e[i].to==state&&e[i].len==len)
21 return e[i].val;
22 }
23 e[++tot].to=state;
24 e[tot].val=-1.0;
25 e[tot].len=len;
26 e[tot].n=head[st];
27 head[st]=tot;
28 return e[tot].val;
29 }
30 }f;
31 int base[MAXN];
32 int getnum(int state,int k){
33 if(k==0)return (state>>1);
34 int kx=(state>>(k+1));
35 return (kx<<(k))|(state&base[k-1]);
36 }
37 double DFS(int state,int len){
38 if(len==n-k)return 0;
39 f.len=len;
40 if(f[state]!=-1.0)return f[state];
41 double sum=0;
42 for(int i=1;i<=len/2;++i){
43 int ok1=(state>>(i-1))&1;
44 int find1=getnum(state,i-1);
45 int ok2=(state>>(len-i))&1;
46 int find2=getnum(state,len-i);
47 sum+=2*max(DFS(find1,len-1)+ok1,DFS(find2,len-1)+ok2);
48 }
49 if(len&1){
50 int kx=len/2+1;
51 int ok1=(state>>(kx-1))&1;
52 int find1=getnum(state,kx-1);
53 sum+=DFS(find1,len-1)+ok1;
54 }
55 sum=sum/len;
56 f.len=len;
57 return f[state]=sum;
58 }
59 int st=0;
60 signed main(){
61 n=read();k=read();
62 base[0]=1;
63 for(int i=1;i<=n;++i)base[i]=base[i-1]|(1<<i);
64 for(int i=1;i<=n;++i){
65 char x=getchar();
66 if(x=='W')st|=1<<(i-1);
67 }
68 double ans=DFS(st,n);
69 printf("%.7lf\n",ans);
70 }

T3 w(神仙DP)


第一次作二元组DP很神仙。

性质:1.遇到需要反的边一定要反,遇到不能反的边一定不能反

2.任何操作数其实等于树中翻过的奇数点数/2

所以DP[1/0].fir表示是当前节点是/否向上反边时的计数点个数,sec表示最小路径长度

所以转移时w1,w0分别表示子树贡献,定义同上

转载校外大佬博客(实际是因为自己懒得写了QAQ)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define min(a,b) (a)<(b)?(a):(b)
4 #define inf 0x7ffffff
5 #define MAXN 1000000
6 #define int long long
7 int read(){
8 int x=0;char c=getchar();
9 while(c<'0'||c>'9')c=getchar();
10 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
11 return x;
12 }
13 struct node{
14 int fir;int sec;
15 friend node operator +(node a,node b){
16 return (node){a.fir+b.fir,a.sec+b.sec};
17 }
18 };
19 inline node minn(node a,node b){
20 if(a.fir==b.fir)return a.sec<b.sec?a:b;
21 return a.fir<b.fir?a:b;
22 }
23 struct no{
24 int n,to,w;
25 }e[MAXN];
26 int n;
27 int head[MAXN],tot;
28 void add(int u,int v,int w){
29 e[++tot].n=head[u];e[tot].to=v;e[tot].w=w;head[u]=tot;
30 }
31 node dp[MAXN][2];int fa[MAXN];
32 void DP(int x,int faa){
33 node w0=(node){0,0},w1=(node){inf,inf};
34 node t0=(node){0,0},t1=(node){inf,inf};
35 for(int i=head[x];i;i=e[i].n){
36 int to=e[i].to;
37 if(to==faa)continue;
38 DP(to,x);
39 t0=w0,t1=w1;
40 w0=minn(t0+dp[to][0],t1+dp[to][1]);
41 w1=minn(t0+dp[to][1],t1+dp[to][0]);
42 }
43 dp[x][0]=minn((node){w0.fir,w0.sec},(node){w1.fir+1,w1.sec});
44 dp[x][1]=minn((node){w0.fir+1,w0.sec+1},(node){w1.fir,w1.sec+1});
45 if(fa[x]==0){
46 dp[x][1]=(node){inf,inf};
47 }
48 else if(fa[x]==1){
49 dp[x][0]=(node){inf,inf};
50 }
51 }
52 void DFS(int x,int faa){
53 for(int i=head[x];i;i=e[i].n){
54 int to=e[i].to;
55 if(to==faa)continue;
56 int w=e[i].w;
57 fa[to]=w;
58 DFS(to,x);
59 }
60 }
61 signed main(){
62 n=read();
63 for(int i=1;i<=n-1;++i){
64 int u,v,a,b;
65 u=read();v=read();a=read();b=read();
66 if(b!=2){add(u,v,a^b);add(v,u,a^b);}
67 else add(u,v,b),add(v,u,b);
68 }
69 DFS(1,0);
70 DP(1,0);
71 printf("%lld %lld\n",dp[1][0].fir/2,dp[1][0].sec);
72 }

模拟52

T1平均数(归并排序+二分)


发现自己一个小时没有思路,放弃........

一直以为是神仙数据结构.....

其实只要二分平均值后将所有值减去该值,查找和<0的区间个数,

怎么求,归并排序就好了.....

 1 #include<bits/stdc++.h>
2 #define MAXN 101000
3 #define int long long
4 #define inf 0.00001
5 using namespace std;
6 double sum[MAXN],kx[MAXN];double zzn[MAXN];double maxn;
7 int read(){
8 int x=0;char c=getchar();
9 while(c<'0'||c>'9')c=getchar();
10 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
11 return x;
12 }
13 int anss=0;int n;int a[MAXN];int k;
14 void guibing(int l,int r){
15 if(l==r){kx[l]=sum[l];return ;}
16 int mid=(l+r)>>1;
17 guibing(l,mid);guibing(mid+1,r);
18 int le=l;int re=mid+1;int mm=0;
19 while(le<=mid&&re<=r){
20 if(kx[re]<kx[le]){zzn[++mm]=kx[le];le++;}
21 else{
22 zzn[++mm]=kx[re];
23 anss+=(le-l);
24 re++;
25 }
26 }
27 while(le<=mid){
28 zzn[++mm]=kx[le];le++;
29 }
30 while(re<=r){
31 zzn[++mm]=kx[re];anss+=(le-l);
32 re++;
33 }
34 for(int i=l;i<=r;++i){
35 kx[i]=zzn[i-l+1];
36 }
37 }
38 int work(double len){
39 anss=0;
40 for(int i=1;i<=n;++i){
41 sum[i]=sum[i-1]+((double)a[i]-len);
42 if(sum[i]<0)anss++;
43 kx[i]=0.0;
44 }
45 guibing(1,n);
46 return anss;
47 }
48 void second_divied(){
49 double l=0;double r=maxn;
50 while(l+inf<r){
51 double mid=(l+r)/2.000;
52 if(work(mid)<k)l=mid;
53 else r=mid;
54 }
55 if(work(l)==k)printf("%.4lf\n",l);
56 else printf("%.4lf\n",r);
57 }
58 signed main(){
59 n=read();k=read();
60 for(int i=1;i<=n;++i)a[i]=read(),maxn=max(maxn,(double)a[i]);
61 second_divied();
62 }

***********************

思路积累:

1.求排名第k小转化为有k个比他小的序列

2.平均数可以二分后,让所有数减去该值。

T2涂色游戏(组合数学)


考场死刚.....

最后式子推的基本对了,但是还是有点问题,快速幂打错怒丢30!!!

首先要处理好j,k两列颜色种类有x个颜色交集时的方案数

还要与处理出在n行放k种颜色的方案数

然后转移时发现对于该列有j种颜色,我们先乘f[n][j]/C(p,j)表明我们并不知道所放颜色的具体颜色,只知道一个排列顺序,

对于每一个上一列的状态我们可以转移到该列,

然后乘上相应组合数求出上一列颜色固定时下一列的颜色种类的方案,再乘上排列方式即可

  1 #include<bits/stdc++.h>
2 #define int long long
3 #define MAXN 1100
4 using namespace std;
5 int read(){
6 int x=0;char c=getchar();
7 while(c<'0'||c>'9')c=getchar();
8 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
9 return x;
10 }
11 int n,m,p,q;
12 int dp[MAXN][MAXN];
13 int jie[MAXN],ni[MAXN],ni_c[MAXN];
14 const int mod=998244353ll;
15 int C(int x,int y){
16 if(y>x)return 0;
17 if(y==0)return 1;
18 return jie[x]*ni_c[y]%mod*ni_c[x-y]%mod;
19 }
20 int poww(int x,int y){
21 int ans=1ll;
22 while(y){
23 if(y&1)ans=(ans*x)%mod;
24 x=(x*x)%mod;
25 y>>=1;
26 }
27 return ans%mod;
28 }
29 int ans=0;int kx[MAXN][MAXN];
30 int fir[MAXN][MAXN];int f[2][MAXN];int c[MAXN][MAXN];
31 void work1(){
32 memset(c,0,sizeof(c));
33 for(int k=1;k<=min(n,p);++k){
34 for(int i=1;i<=min(n,p);++i){
35 for(int j=1;j<=min(n,p);++j){
36 c[i][j]=(c[i][j]+fir[i][k]*kx[k][j]%mod)%mod;
37 }
38 }
39 }
40 for(int i=1;i<=min(n,p);++i){
41 for(int j=1;j<=min(n,p);++j)
42 fir[i][j]=c[i][j]%mod;
43 }
44 }
45 void work2(){
46 memset(c,0,sizeof(c));
47 for(int k=1;k<=min(n,p);++k){
48 for(int i=1;i<=min(n,p);++i){
49 for(int j=1;j<=min(n,p);++j){
50 c[i][j]=(c[i][j]+kx[i][k]*kx[k][j]%mod)%mod;
51 }
52 }
53 }
54 for(int i=1;i<=min(n,p);++i){
55 for(int j=1;j<=min(n,p);++j)
56 kx[i][j]=c[i][j];
57 }
58 }
59 void ju_poww(int y){
60 for(int i=1;i<=min(n,p);++i)fir[i][i]=1;
61 while(y){
62 if(y&1){work1();}
63 work2();
64 y>>=1;
65 }
66 }
67 signed main(){
68 n=read();m=read();p=read();q=read();
69 dp[0][0]=1;
70 for(int i=1;i<=n;++i){
71 for(int j=1;j<=min(p,i);++j){
72 dp[i][j]=(dp[i-1][j-1]*(p-(j-1)+mod)%mod+dp[i-1][j]*j%mod)%mod;
73 }
74 }
75 jie[0]=jie[1]=1;ni[1]=1;ni_c[0]=ni_c[1]=1;
76 for(int i=2;i<=p;++i){
77 jie[i]=(jie[i-1]*i)%mod;
78 ni[i]=((mod-mod/i)*ni[mod%i])%mod;
79 ni_c[i]=(ni[i]*ni_c[i-1])%mod;
80 }
81 for(int j=1;j<=p;++j){
82 f[0][j]=dp[n][j]%mod;
83 }
84 for(int j=1;j<=min(n,p);++j){
85 for(int k=1;k<=min(n,p);++k){
86 if(j+k<q)continue;
87 for(int x=max(j,max(q,k));x<=min(p,j+k);++x){
88 kx[j][k]=(kx[j][k]+C(p-j,x-j)%mod*C(j,k+j-x)%mod)%mod;
89 }
90 kx[j][k]%=mod;
91 kx[j][k]=kx[j][k]*poww(C(p,k)%mod,mod-2)%mod*dp[n][k]%mod;
92 kx[j][k]%=mod;
93 }
94 }
95 ju_poww(m-1);
96 for(int j=1;j<=p;++j){
97 for(int k=1;k<=p;++k){
98 f[1][j]=(f[1][j]+f[0][k]*fir[k][j]%mod)%mod;
99 }
100 }
101 int ans=0;
102 for(int j=1;j<=p;++j)ans=(ans+f[1][j])%mod;
103 printf("%lld\n",ans);
104 }

T3序列(数据结构乱搞)


好像是这套题里最简单的......

直接在树状数组里开vector每次查询时就lowerbound查出贡献

对于查询覆盖了一段区间的查询,我们在L,R+1处用两个树状数组标记后缀

然后对于询问覆盖x位置的值就用L的(1-x)的L贡献-(1-x)的R的贡献

 1 #include<bits/stdc++.h>
2 #define MAXN 410000
3 #define int long long
4 using namespace std;
5 vector<int>v[MAXN];vector<int>v1[MAXN];
6 int lowbit(int x){return x&(-x);}
7 int m,q,n,a[MAXN];
8 void add(int x,int k){
9 for(int i=x;i>=1;i-=lowbit(i)){
10 v[i].push_back(k);//printf("ps=%lld i=%lld\n",i,k);
11 }
12 }
13 void add1(int x,int k){
14 for(int i=x;i>=1;i-=lowbit(i)){
15 v1[i].push_back(k);//printf("ps=%lld i=%lld\n",i,k);
16 }
17 }
18 int anss[MAXN];
19 void pt(int x){
20 for(int i=0;i<v[x].size();++i){
21 printf("%lld ",v[x][i]);
22 }cout<<endl;
23 }
24 int query(int x,int k){
25 int ans=0;
26 for(int i=x;i<=n+1;i+=lowbit(i)){
27 int kx=upper_bound(v[i].begin(),v[i].end(),k)-v[i].begin()-1;
28 ans+=kx;
29 }
30 return ans;
31 }
32 int query1(int x,int k){
33 int ans=0;
34 for(int i=x;i<=n+1;i+=lowbit(i)){
35 int kx=upper_bound(v1[i].begin(),v1[i].end(),k)-v1[i].begin()-1;
36 ans+=kx;
37 }
38 return ans;
39 }
40 int read(){
41 int x=0;char c=getchar();
42 while(c<'0'||c>'9')c=getchar();
43 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
44 return x;
45 }
46 int sum=0;
47 signed main(){
48 n=read();m=read();q=read();
49 for(int i=1;i<=n+1;++i){v[i].push_back(0);v[i].push_back(0x7fffffffffff);v1[i].push_back(0);v1[i].push_back(0x7fffffffffff);}
50 for(int i=1;i<=n;++i){
51 a[i]=read();
52 }
53 for(int i=1;i<=m;++i){
54 int l=read();int r=read();int xx=read();
55 add(l,xx);
56 add1(r+1,xx);
57 }
58 for(int i=1;i<=n+1;++i)sort(v[i].begin(),v[i].end()),sort(v1[i].begin(),v1[i].end());
59 for(int i=1;i<=n;++i){
60 anss[i]=(query(1,a[i])-query(i+1,a[i]));
61 anss[i]-=(query1(1,a[i])-query1(i+1,a[i]));
62 sum+=anss[i];
63 }
64 printf("%lld\n",sum);
65 for(int i=1;i<=q;++i){
66 int u=read();int v=read();
67 u^=sum;v^=sum;
68 sum-=anss[u];
69 anss[u]=query(1,v)-query(u+1,v);
70 anss[u]-=(query1(1,v)-query1(u+1,v));
71 sum+=anss[u];
72 a[u]=v;
73 printf("%lld\n",sum);
74 }
75 }
76 /*
77 4 2 2
78 1 4 2 3
79 2 4 3
80 1 3 2
81 6 6
82 2 7
83 */

csp-s模拟测试52-53的更多相关文章

  1. [考试反思]0926csp-s模拟测试52:审判

    也好. 该来的迟早会来. 反思再说吧. 向下跳过直到另一条分界线 %%%cbx也拿到了他的第一个AK了呢. 我的还是遥不可及. 我恨你,DeepinC. 我恨透你了.你亲手埋葬所有希望,令我无比气愤. ...

  2. [CSP-S模拟测试52]题解

    A.平均数 看到第K小,又确定跟平衡树/主席树没有关系,可以把问题转化为有K-1个答案比它小再考虑二分. 二分平均值x,之后将原序列统一减去x.这时序列中区间和<0的区间个数就是原序列中平均值小 ...

  3. csp-s模拟测试52平均数,序列题解

    题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...

  4. 2019.9.26 csp-s模拟测试52 反思总结

    刚刚写了一个小时的博客没了,浏览器自动刷新. 一!个!小!时! 鼠标键盘电脑哪个都不能摔,气死我了. 垃圾选手T1T2没思路,T3倒是想出来得比较早,靠T3撑着分数. 数据结构学傻选手,属实垃圾. T ...

  5. noip模拟测试52

    这套题总体来说比较简单,但是有一些分数我没有拿到,先说T1,我10分钟左右打完了60分的暴力,然后就开始打表找规律,好像只有我去找了循环节,找规律找了一个多小时,到八点四十的时候我还没有正解做法,就直 ...

  6. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

  7. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  8. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  9. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

随机推荐

  1. 修改composer配置(以修改cache-files-maxsize为例)修改composer拉取包出现"Content-Length mismatch"的问题

    1.composer config -l -g查看composer配置信息 2.修改配置:composer config --global cache-files-maxsize 1024MiB

  2. 一些代码小技巧&经典代码

    请说明逻辑与(&&)在下边表达式中起到的重要作用 count != 0 && sum/count 答:该表达式使用逻辑与(&&)来确保 sum/coun ...

  3. 使用find_if算法搜寻map的value

    // // main.cpp // map_find // // Created by PKU on 14-9-8. // Copyright (c) 2014年 PKU. All rights re ...

  4. Spring Cloud Alibaba Nacos Discovery 实战

    Nacos 作为服务注册中心,可以快速简单的将服务自动注册到 Nacos 服务端,并且能够动态无感知的刷新某个服务实例的服务列表,为分布式系统提供服务注册与发现功能 一.创建服务 1.创建项目 pom ...

  5. Deepin深度应用商店和系统更新不正常的解决方法

    Deepin深度应用商店和系统更新不正常的解决方法 2020-02-04 10:25:09作者:i8520稿源:深度站 如果你的Deepin深度应用商店和系统更新不正常,可采用以下方法来解决问题. 解 ...

  6. X Sever —— Xorg

    X Sever -- Xorg  发表于 2020-03-20 分类于 系统服务 , Xorg 阅读次数:39 阅读次数:48 本文字数: 7k 阅读时长 ≈ 6 分钟 Xorg:基于X11协议的服务 ...

  7. 寻找CPU使用率高的进程方法

    寻找CPU使用率高的进程方法 发布时间:  2017-07-13 浏览次数:  1362 下载次数:  0 问题描述 节点报CPU使用率高,甚至出现"ALM-12016 CPU使用率超过阈值 ...

  8. mysql3_pymysql

    python数据库编程 1.pyshon数据库接口(python DB-API) 1.为开发人员提供的数据库应用编程接口 2.python支持的数据库服务软件 mysql,oracle,sql_ser ...

  9. Linux服务之DNS服务篇

    一.DNS服务概述 DNS(Domain Name System)域名系统,在TCP/IP 网络中有非常重要的地位,能够提供域名与IP地址的解析服务. DNS 是一个分布式数据库,命名系统采用层次的逻 ...

  10. WPF 2D图形 Shape入门(一)--Shape

    本文是篇WPF Shape的入门文章 Shape 首先看看shape的继承链关系: 一个Shape具有哪些重要属性: 属性 说明 DefiningGeometry 默认的几何形状 RenderedGe ...