csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解

题面:https://www.cnblogs.com/Juve/articles/11625190.html

嘟嘟噜:

约瑟夫问题

第一种递归的容易re,但复杂度较有保证

第二种适用与n大于m的情况

第三种O(n)用于n不太大或m大于n时

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long
#define re register
using namespace std;
int t,n,m;
int calc(int n,int m){
	if(n==1) return 0;
	if(n<m) return (calc(n-1,m)+m)%n;
	int s=calc(n-n/m,m)-n%m;
	return s<0?s+n:s+s/(m-1);
}
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&m);
		cout<<calc(n,m)+1<<endl;
		re int ans=0;
		int i=2;
		while(i<=n){
			int tim=(i-ans-1)/m+1;
			if(i-1+tim>=n) tim=n-(i-1);
			i+=tim,ans=(ans+tim*m)%(i-1);
		}
		cout<<ans+1<<endl;
		ans=0;
		for(re int i=2;i<=n;++i){
			ans=(ans+m)%i;
		}
		printf("%lld\n",ans+1);
	}
	return 0;
}

天才绅士少女助手克里斯蒂娜:

就是推式子:

$\sum\limits_{i=l}^{r}\sum\limits_{j=i+1}^{r}|v_i*v_j|^2=\sum\limits_{i=l}^{r}\sum\limits_{j=i+1}^{r}(x_i^2*y_j^2+y_i^2*x_j^2-2*x_i*y_i*x_j*y_j)$

我们把所有$x_i^2$和$y_i^2$和$x_i*y_i$提出来,就有了

$ans=\sum\limits_{i=l}^{r}(x_i^2*\sum\limits_{j=i+1}^{r}y_j^2+y_i^2*\sum\limits_{j=i+1}^{r}x_j^2+x_i*y_i*\sum\limits_{j=i+1}^{r}x_j*y_j)$

然后这个式子可以树状数组维护后面的sigma

但是复杂度还是不优

我们可以把i和j看成无序的,最后再除以2

所以就有了:

$\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{n}|v_i*v_j|^2=\sum\limits_{j=1}^{n}(x_j^2)*\sum\limits_{j=1}^{n}(y_j^2)-\sum\limits_{j=1}^{n}(x_j*y_j)^2$

然后就可以愉快地树状数组了

#include<iostream>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e6+5;
const int mod=20170927;
int n,m;
int read(){
    int x=0;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘) ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘){x=(x<<3)+(x<<1)+ch-‘0‘;ch=getchar();}
    return x;
}
struct node{
    int x,y,s1,s2,s3;
    inline friend int operator * (node p,node q){
        return ((p.x*q.y%mod-q.x*p.y%mod)%mod+mod)%mod;
    }
}a[MAXN];
inline int lowbit(re int x){
    return x&(-x);
}
struct BIT{
    int c[MAXN];
    inline void update(re int pos,re int val){
        for(re int i=pos;i<=n;i+=lowbit(i)){
            (c[i]+=val)%=mod;
        }
    }
    inline int query(re int pos){
        re int res=0;
        for(re int i=pos;i>0;i-=lowbit(i)){
            (res+=c[i])%=mod;
        }
        return res;
    }
    inline int ask(re int l,re int r){
        return ((query(r)-query(l-1))%mod+mod)%mod;
    }
}tr[3];
signed main(){
    n=read(),m=read();
    for(re int i=1;i<=n;++i){
        a[i].x=read(),a[i].y=read();
        a[i].s1=a[i].x*a[i].x%mod,a[i].s2=a[i].y*a[i].y%mod,a[i].s3=a[i].x*a[i].y%mod;
        tr[0].update(i,a[i].s1),tr[1].update(i,a[i].s2),tr[2].update(i,a[i].s3);
    }
    while(m--){
        re int opt=read();
        if(opt==1){
            re int p=read(),x=read(),y=read();
            tr[0].update(p,x*x%mod-a[p].s1);
            tr[1].update(p,y*y%mod-a[p].s2);
            tr[2].update(p,x*y%mod-a[p].s3);
            a[p]=(node){x%mod,y%mod,x*x%mod,y*y%mod,x*y%mod};
        }else{
            re int l=read(),r=read(),ans=0;
            ans=((tr[0].ask(l,r)*tr[1].ask(l,r)%mod-tr[2].ask(l,r)*tr[2].ask(l,r)%mod)%mod+mod)%mod;
            printf("%lld\n",ans);
        }
    }
    return 0;
}

凤凰院凶真:

求两个数列的最长公共上升子序列并输出路径

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define int long long
using namespace std;
const int MAXN=5005;
int n,a[MAXN],m,b[MAXN],f[MAXN][MAXN],pre[MAXN][MAXN],pos=1;
stack<int>sta;
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
	scanf("%lld",&m);
	for(int i=1;i<=m;++i) scanf("%lld",&b[i]);
	memset(pre,-1,sizeof(pre));
	for(int i=1;i<=n;++i){
		int v=0,k=0;
		for(int j=1;j<=m;++j){
			f[i][j]=f[i-1][j];
			if(b[j]<a[i]&&v<f[i-1][j]) v=f[i-1][j],k=j;
			if(a[i]==b[j]) f[i][j]=v+1,pre[i][j]=k;
		}
	}
	for(int i=1;i<=n;++i){
		if(f[n][pos]<f[n][i]) pos=i;
	}
	printf("%lld\n",f[n][pos]);
	if(f[n][pos]!=0){
		for(int i=n;i>=1;--i){
			if(pre[i][pos]!=-1)
				sta.push(a[i]),pos=pre[i][pos];
		}
		while(!sta.empty()){
			printf("%lld ",sta.top());
			sta.pop();
		}
		puts("");
	}
	return 0;
}

原文地址:https://www.cnblogs.com/Juve/p/11625208.html

时间: 2024-11-08 03:52:18

csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解的相关文章

10.5「嘟嘟噜」&#183;「天才绅士少女助手克里斯蒂娜」&#183;「凤凰院凶真」

又是一部番???? A. 嘟嘟噜 以为是个神仙题,就只打了个约瑟夫问题,然后QJ了M==2的分, 事实上因为M很小,可以让让轮数跳转,瞎算算就出来了. B. 天才绅士少女助手克里斯蒂娜 考试一开始看错题了,样例过不了异常崩溃........ 1h过去了,我读错题了(一脸震惊) 然后...好像是线段树,但不会维护....... 好像式子能拆开,wc这怎么维护??? after 10min 好像可以维护了... C. 凤凰院凶真 没时间想了,事实上是一个裸的最长公共上升子序列 考虑DP,f[i][j

[CSP-S模拟测试]:天才绅士少女助手克里斯蒂娜(数学+树状数组)

题目描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响. 选取显像管的任意一个平面,一开始平面内有个$n$电子,初始速度分别为$v_i$,定义飘升系数为$$\sum \limits_{1\leqslant i<j\leqslant n}|v_i\times v_j|^2$$ 由于电视会遭到大叔不同程度的暴击,电子的速度常常会发生变化.也就是说,有两种类型的操作: $\bullet 1\ p\ x\ y$将$v_p$改为$(x,y)$ $\bullet 2\ l\ r$

[CSP-S模拟测试]:凤凰院凶真(LCIS)

题目描述 $\alpha$世界线.凤凰院凶真创立了反抗$SERN$统治的组织“瓦尔基里”.为了脱离$\alpha$线,他需要制作一个世界线变动率测量仪.测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列.一个世界线的事件逻辑序列是一个正整数序列,第$k$个数表示第$k$个事件发生的时间.对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增.现在,对于两个不同的世间线$\alpha,\beta$,求出最长的一个事件序列,满足这个序

【CSP模拟赛】凤凰院凶真(最长公共上升子序列)

题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列. 一个世界线的事件逻辑序列是一个正整数序列,第k个数表示第k个事件发生的时间.对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增. 现在,对于两个不同的世间线α,β求出最长的一个事件序列,满足这个序列在α,β世界线中均是合法的.这个序列也就是之前提到过的最

csp-s模拟测试60

csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴一个不一样的毒瘤做法. 1 //ans=(ans+m)%i 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define re re

[CSP-S模拟测试60]题解

回去要补一下命运石之门了…… A.嘟嘟噜 给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$. 考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了.问题在于如何找到下一次需要取模的位置. 解不等式$ans+km \ge i+k$即可,需要处理一下边界. 据说可以证明复杂度是$O(m \log n)$的,但我不是很会. //考场代码 稍丑 #include<bits/stdc++.h> using namespace std; typedef long lon

csps模拟测试60

T1: 加个剪枝. 我忘了移项这件事. 高考大坑. 约瑟夫不多bb T2: 高考化柿子大坑. 其实我一直不太觉得两头的平方是一样的,我觉得只是他们的和很特殊. 来刚.sx,sy,sxy均为平方或乘积的前缀和. $\sum \limits_{i=1}^{n}\sum \limits_{j=i+1}^{n}(x_iy_j-x_jy_i)^2$ $\sum \limits_{i=1}^{n}\sum \limits_{j=i+1}^{n}x_i^2y_j^2+x_j^2y_i^2-2x_iy_jx_j

模拟测试60

T1: 约瑟夫问题. 经证(da)明(biao)可知,最终答案计算方法是: 答案由$1$开始,每次加$m$,若大于次数加一,就对次数加一取模. 可以$O(1)$计算每次取模的位置,取模不超过$mlogn$次,于是时间复杂度为$O(mlogn)$. T2: 普及:向量叉积:$v_1=(x_1,y_1),v_2=(x_2,y_2) \Rightarrow \vec{v_1}\times \vec{v_2}=x_1*y_2-x_2*y_1$ 然而我只会拆平方干推式子: $\large \begin{a

嘟嘟噜 解题报告

嘟嘟噜 Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有 \(n\) 个人围成一个圈, 从 \(1\) 开始顺时针报数, 报出 \(m\) 的人被机关处决. 然后下一 个人再从 \(1\) 开始报数, 直到只剩下一个人. 红莉栖: "这不就是约瑟夫问题吗..." 伦太郎: "助手你给我闭嘴!" 真由理虽然已经晕头转向了, 但听到有一车的香蕉, 两眼便放出