首页 > 其他分享 >由此开始的记录

由此开始的记录

时间:2023-07-14 23:56:02浏览次数:55  
标签:... return 记录 int 开始 rep 23 dep 由此

从现在开始做的题就往这里放放了,写不写题解,随缘。

这篇博客名来自 Charlotte 大结局的名字。

\(\text{CF149D Coloring Brackets}\)

/*
直接区间 dp,经典的,显然 f[l][r] 表示 [l,r] 的涂色方案。
f[l][r] 没法转移,因为不会判相邻颜色是否相同。
那么记一下两端颜色,因为你 r+1 不可能和 r-1 冲突。
f[l][r][x][y] 表示左端点颜色 x,右端点 y 的方案
为了方便,我们用记忆化搜索,这样可以钦定 l 处是左括号。
如果 l,r 就是匹配的括号,那么显然的 f[l][r][x][y]=sum {f[l+1][r-1][x'][y']}
如果 l,r 并不匹配,那么由于钦定过,我们可以把这个区间换成这样:
(...)(...)(...)...
然后乘法原理,方案数就是
f[ (...) ] * f[ (...)(...)... ] 
*/
#include <bits/stdc++.h>
#define rep(i,l,r) for(i=l;i<=r;++i)
using namespace std;
const int N=705,p=1e9+7;
char str[N];
long long f[N][N][3][3];
int ord[N];
inline void dfs(int l,int r)
{
	int i,j,a,b,c,d;
	if(l+1==r)
	{
		f[l][r][0][1]=f[l][r][1][0]=f[l][r][0][2]=f[l][r][2][0]=1;
		return ;
	}
	if(ord[l]==r)
	{
		dfs(l+1,r-1);
		rep(i,0,2)rep(j,0,2)
		{
			if(i!=1)(f[l][r][1][0]+=f[l+1][r-1][i][j])%=p;
			if(i!=2)(f[l][r][2][0]+=f[l+1][r-1][i][j])%=p;
			if(j!=1)(f[l][r][0][1]+=f[l+1][r-1][i][j])%=p;
			if(j!=2)(f[l][r][0][2]+=f[l+1][r-1][i][j])%=p;
		}
	}else
	{
		dfs(l,ord[l]);dfs(ord[l]+1,r);
		rep(a,0,2)rep(b,0,2)rep(c,0,2)rep(d,0,2)
		{
			if(b==c && b)break;
			(f[l][r][a][d]+=(f[l][ord[l]][a][b]*f[ord[l]+1][r][c][d]%p))%=p;
		}
	}
	return ;
}
int main()
{
	int n,i,j;
	stack<int> q;
	scanf("%s",str+1);n=strlen(str+1);
	rep(i,1,n)
	{
		if(str[i]=='(')q.push(i);
		else
		{
			ord[q.top()]=i;
			q.pop();
		}
	}
	dfs(1,n);
	long long ret=0;
	rep(i,0,2)rep(j,0,2)ret+=f[1][n][i][j];
	printf("%lld",ret%p);
	return 0;
}

upd on 23-7-10 12:01

\(\text{P4342 [IOI1998] Polygon}\)

/*
断环成链是显然的。断成 2n 之后,f[l][r] 表示合并 [l,r] 的最大值。
先考虑加法,显然 f[l][r]=max{f[l][k]+f[k+1][r]}
对于乘法,考虑到会出现傻逼的负负得正,必须存一个最小值,设这个是 g[l][r]
f[l][r]=max{mxval(l,k,r)}
g[l][r]=min{mnval(l,k,r)}
mxval(l,k,r)=max(f[l][k]*f[k+1][r],f[l][k]*g[k+1][r],g[l][k]*f[k+1][r],g[l][k]*g[k+1][r])
mnval(l,k,r)=min(f[l][k]*f[k+1][r],f[l][k]*g[k+1][r],g[l][k]*f[k+1][r],g[l][k]*g[k+1][r])
*/
#include <bits/stdc++.h>
#define rep(i,l,r) for(i=l;i<=r;++i)
template<class T> inline T max(T head) {
    return head;
}
template<class T, typename... Args>inline T max(T head, Args... args) {
    T t = max<T>(args...);
    return (head > t)?head:t;
}
template<class T> inline T min(T head) {
    return head;
}
template<class T, typename... Args>inline T min(T head, Args... args) {
    T t = min<T>(args...);
    return (head < t)?head:t;
}
const int N=105;
char op[N];
int num[N],f[N][N],g[N][N];
int n,i,le,ret,l,r,k,j,x;
char c;
const int inf=(1<<15);
int main()
{
	scanf("%d",&n);
	rep(i,1,n)
	{
		scanf(" %c %d",&c,&x);
		op[i]=op[i+n]=c;
		num[i]=num[i+n]=x;
	}
	rep(i,1,2*n)rep(j,1,2*n)f[i][j]=-inf,g[i][j]=inf;
	rep(i,1,2*n)f[i][i]=g[i][i]=num[i];
	rep(le,2,n)
		rep(l,1,2*n-le+1)
		{
			r=l+le-1;
			rep(k,l,r-1)
			{
				if(op[k+1]=='x')
				{
					f[l][r]=max(f[l][r],f[l][k]*f[k+1][r],f[l][k]*g[k+1][r],g[l][k]*f[k+1][r],g[l][k]*g[k+1][r]);
					g[l][r]=min(g[l][r],f[l][k]*f[k+1][r],f[l][k]*g[k+1][r],g[l][k]*f[k+1][r],g[l][k]*g[k+1][r]);
				}else
				{
					f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]);
					g[l][r]=min(g[l][r],g[l][k]+g[k+1][r]);
				}
			}
//			printf("%d %d %d\n",l,r,f[l][r]);
		}
	rep(i,1,n)ret=max(ret,f[i][i+n-1]);
	printf("%d\n",ret);
	rep(i,1,n)if(f[i][i+n-1]==ret)
		printf("%d ",i);
	return 0;
}

upd on 23-7-10 12:44

\(\text{P3052 [USACO12MAR] Cows in a Skyscraper G}\)

/*
直接模拟退火啊。
*/
#include <bits/stdc++.h>
#define rep(i,l,r) for(i=l;i<=r;++i)
const int N=20;
int a[N];
int n,W,x,y,m,i;
using namespace std;
const double bT=1e5, eT=1e-3, derta=0.97;
inline int cost()
{
	int i, pre=0, ret=0;
	rep(i,1,n)
	{
		if(pre+a[i]>W)
		{
			++ret;
			pre=a[i];
		}else
			pre+=a[i];
	}
	return ret+(pre>0);
}
inline int SA()
{
	int ans=cost(), mid;
	for(double T=bT; T>=eT; T*=derta)
	{
		x=rand()%n+1;y=rand()%n+1;
		swap(a[x],a[y]);
		mid=cost();
		if(mid<ans)
			ans=mid;
		else if(exp((mid-ans)/T)<1.*rand()/RAND_MAX)
			swap(a[x],a[y]);	
	}
	return ans;;
}
int main()
{
	srand(8925);
	scanf("%d %d",&n,&W);
	auto beginning=clock();
	rep(i,1,n)scanf("%d",a+i);
	int ret=SA();
	while((clock()-beginning)*1.0/CLOCKS_PER_SEC <=0.9)ret=min(ret,SA());
	printf("%d",ret);
	return 0;
}

upd on 23-7-10 15:15

\(\text{CF629C Famil Door and Brackets}\)

/*
设 f[i][j] 表示前 i 个,cnt[(]-cnt[)] 的数量为 j 的方案数。
这个可以做出 P,Q 的样子啊。
接下来枚举 P 的长度,lp+lq+ls=n
然后枚举 P 的 cnt[(]-cnt[)] 的值。
需要满足 dertap+dertaq+dertas=0
直接乘法原理即可。
比如枚举出 p[lp][dertap],那么 lq=n-ls-lp, dertaq=-dertas-dertap
*/
#include <bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(i=l;i<=r;++i)
using namespace std;
const int N=100005,p=1e9+7;
int f[2015][2015];
char str[N];
int i,j,x,mrex=p,n,m,ret;
inline void pre()
{
	f[0][0]=1;
	rep(i,1,2005)
	{
		f[i][0]=f[i-1][1];
		rep(j,1,i)f[i][j]=(f[i-1][j-1]+f[i-1][j+1])%p;//,printf("%d %d %d\n",i,j,f[i][j]);
	}
	return ;
}
inline int gmax()
{
	rep(i,1,m)
	{
		if(str[i]=='(')++x;else --x;
		mrex=min(mrex,x);
	}
	return mrex;
}
inline int solve()
{
	pre();
	gmax();
//	if(n>2000)printf("%d %d\n",x,mrex);
	rep(i,0,n-m)
		rep(j,0,i)
		{
			if(j>=-mrex && j+x<=n-m-i)
			{
//				printf("%d %d %d %d %d %d\n",i,j,f[i][j],n-m-i,j+x,f[n-m-i][j+x]);
				(ret+=(1ll*f[i][j]*f[n-m-i][j+x])%p)%=p;
			}
//			printf("%d %d %d\n", i, j, ret);
		}
	printf("%lld",ret);
	return 0;
}
signed main()
{
	scanf("%d %d %s", &n, &m, str+1);
	solve();
	return 0;
}

upd on 23-7-11 7:00

\(\text{P8675 [蓝桥杯 2018 国 B] 搭积木}\)

这题我随便写了个题解,可以去看看然后爆 down 我。

upd on 23-7-12 13:01

\(\text{P6218 [USACO06NOV] Round Numbers S}\)

#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(i=l;i<=r;++i)
int f[75][75],l,r,i,j,cnt,lg[55];
inline int dp(bool limit,bool lzero,int dep,int derta)
{
	if(dep==0)return derta>=30;
	else if(!limit && !lzero && f[dep][derta]!=-1)return f[dep][derta];
	else
	{
		int ret=0,i,nxt=limit?lg[dep]:1;
		rep(i,0,nxt)
		{
			ret+=dp(limit&&(i==lg[dep]),lzero&&(i==0),dep-1,derta+(i==1?-1:(lzero?0:1)));
		}
		if(!limit && !lzero)f[dep][derta]=ret;
		return ret;
	}
}
int solve(int x)
{
	cnt=0;while(x)
	{
		lg[++cnt]=x&1;
		x>>=1;
	}
	return dp(1,1,cnt,30);
}
int main()
{
	int l,r;scanf("%d %d",&l,&r);
	rep(i,0,31)rep(j,0,61)f[i][j]=-1;
	printf("%d\n",solve(r)-solve(l-1));
	return 0;
}

upd on 23-7-13 23:43

\(\text{UVA1640 The Counting Problem}\)

双倍经验 \(\text{ SP3928 MDIGITS - Counting Digits}\)

#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(i=l;i<=r;++i)
int f[15][15],lg[15];
int ret;
inline int dp(bool limit,bool lzero,int dep,int fl,int sum)
{
//	printf("%d %d %d %d %d\n",limit,lzero,dep,fl,sum);
	if(dep==0)
		return sum;
	if(!limit && !lzero && f[dep][sum]!=-1)return f[dep][sum];
	int ret=0,i,nxt=limit?lg[dep]:9;
	rep(i,0,nxt)ret+=dp(limit&&(i==lg[dep]),lzero&&(i==0),dep-1,fl,sum+(!(lzero&&(i==0))&&i==fl));//,printf("%d\n",i);//,printf("%d\n",ret);
	if(!limit && !lzero)f[dep][sum]=ret;
	return ret;
}
inline int solve(int v,int fl)
{int cnt,i,j;
	rep(i,0,12)rep(j,0,12)f[i][j]=-1;
	cnt=0;while(v)
	{
		lg[++cnt]=v%10;
		v/=10;
	}
	return dp(1,1,cnt,fl,0);
}
int main()
{int i,j,l,r;
//	printf("%d\n",solve(10,2));
	while(cin>>l>>r && (l||r))
	{if(l>r)swap(l,r);
		rep(i,0,8)printf("%d ",solve(r,i)-solve(l-1,i));
		printf("%d\n",solve(r,9)-solve(l-1,9));
	}
	return 0;
}

upd on 23-7-14 0:15

\(\text{CF855E Salazar Slytherin's Locket}\)

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
ll f[15][70][1<<12];
ll lg[70];
int cnt,t,b;
ll l,r;
inline ll dp(bool limit,bool lzero,int dep,int sta,int b)
{
	if(dep==0)return sta==0;
	else if(!limit && !lzero && f[b][dep][sta]!=-1)return f[b][dep][sta];
	else
	{
		ll ret=0;
		int i,nxt=limit?lg[dep]:b-1;
		for(i=0;i<=nxt;++i)
			ret+=dp(limit&&(i==nxt),lzero&&(i==0),dep-1,(lzero&&i==0)?0:(sta^(1<<i)),b);
		if(!limit && !lzero)f[b][dep][sta]=ret;
		return ret;
	}
}
inline ll solve(ll x,int b)
{
	cnt=0;while(x)
	{
		lg[++cnt]=x%b;
		x/=b;
	}
	return dp(1,1,cnt,0,b);
}
int main()
{
	memset(f,-1,sizeof f);
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %lld %lld",&b,&l,&r);
		printf("%lld\n",solve(r,b)-solve(l-1,b));
	}
}

upd on 23-7-14 12:03

SP10606 BALNUM - Balanced Numbers

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int f[20][1<<10][1<<10],lg[20];
int cnt;ll l,r;
inline bool check(int x,int y)
{
	for(int i=0;i<10;++i)
		if((x&(1<<i)) && ((i&1)==((y>>i)&1)))
				return false;
	return true;
}
inline ll dp(int limit,int lzero,int dep,int sta1,int sta2)
{
	if(dep==0)return check(sta1,sta2);
	else if(!limit && !lzero && f[dep][sta1][sta2]!=-1)return f[dep][sta1][sta2];
	else
	{
		ll ret=0;
		int i,nxt=limit?lg[dep]:9;
		for(i=0;i<=nxt;++i)
			ret+=dp(limit&&(i==nxt),lzero&&(i==0),dep-1,(lzero&&(i==0))?0:(sta1|(1<<i)),(lzero&&(i==0))?0:(sta2^(1<<i)));
		if(!limit && !lzero)f[dep][sta1][sta2]=ret;
		return ret;
	}
}
inline ll solve(ll x)
{
	cnt=0;while(x)
	{
		lg[++cnt]=x%10;
		x/=10;
	}
	return dp(1,1,cnt,0,0);
}
int main()
{
	memset(f,-1,sizeof f);
	int t;scanf("%d",&t);
	while(t--)
	{
		scanf("%lld %lld",&l,&r);
		printf("%lld\n",solve(r)-solve(l-1));
	}
	return 0;
}

upd on 23-7-14 12:25

P3810 【模板】三维偏序(陌上花开)

#include <bits/stdc++.h>
#define rep(i,l,r) for(i=l;i<=r;++i)
using namespace std;
const int N=1e5+5,V=2e5+5;
int ret[N];
int n,m,t,i,j,k;
class Eti
{
public:
	int a,b,c,cnt,res;
	inline const bool operator!=(const Eti &other)const
	{
		return a!=other.a || b!=other.b || c!=other.c;
	}
};
Eti e[N],ue[N];
class bit
{
public:
	int tr[V];
	inline void add(int x,int p)
	{
		while(x<=k)
		{
			tr[x]+=p;
			x+=(x&-x);
		}
	}
	inline int ask(int x)
	{
		int ret=0;
		while(x)
		{
			ret+=tr[x];
			x-=(x&-x);
		}
		return ret;
	}
}bit;
using cE=const Eti &;
inline const bool compareA(cE x,cE y)
{
	return x.a!=y.a?x.a<y.a:(x.b!=y.b?x.b<y.b:x.c<y.c);
}
inline const bool compareB(cE x,cE y)
{
	return x.b!=y.b?x.b<y.b:x.c<y.c;
}
inline void cdq(int l,int r)
{
	if(l==r) return ;
	int mid=l+r>>1;
	cdq(l,mid);cdq(mid+1,r);
	sort(ue+l,ue+mid+1,compareB);
	sort(ue+mid+1,ue+r+1,compareB);
	int i=l,j=mid+1;
	while(j<=r)
	{
		while(i<=mid && ue[i].b<=ue[j].b)
		{
			bit.add(ue[i].c,ue[i].cnt);
			++i;
		}
		ue[j].res+=bit.ask(ue[j].c);
		++j;
	}
	int k;
	rep(k,l,i-1)bit.add(ue[k].c,-ue[k].cnt);
}
int main()
{
	int i;
	scanf("%d %d",&n,&k);
	rep(i,1,n)scanf("%d %d %d",&e[i].a,&e[i].b,&e[i].c);
	sort(e+1,e+n+1,compareA);
	rep(i,1,n)
	{
		++t;
		if(e[i]!=e[i+1])
		{
			++m;
			ue[m]=e[i];
			ue[m].cnt=t;
			t=0;
		}
	}
	cdq(1,m);
	rep(i,1,n)ret[ue[i].res+ue[i].cnt-1]+=ue[i].cnt;
	rep(i,0,n-1)printf("%d\n",ret[i]);
	return 0;
}

upd on 23-7-14 23:41

标签:...,return,记录,int,开始,rep,23,dep,由此
From: https://www.cnblogs.com/Syara/p/17555369.html

相关文章

  • 我们开始更新啦!
     亲爱的读者们:我非常激动地宣布,我们专注于探索和分享计算机科学的广阔领域的博客将于2023年7月17日开始更新!计算机科学是一个广泛而精彩的领域,涉及到诸多知识和技术。在我的博客中,我将继续深入探索各种主题,帮助你们进一步了解和掌握计算机科学的精髓。计算机科学是一个令......
  • 做题记录
    一些自己错的题目或者难题的相关记录,有些错的很不应该.7月质数是1*pr,而非1*pr*pr*pr...线段树要可以维护当前区间没有abc的最少操作(s[x]->c)structnode{intl,r;inta,b,c;//thenumsofthemintab,bc,abc;//删除需要的操作}t......
  • 杂题记录
    随机做题过程中遇到感觉还不错的题就会记录下来,随缘更新CF360BLevkoandArray考虑二分答案\(x\)后用dp检验设\(dp_i\)为钦定\(a_i\)不会改变后,在\(i\)之前有多少数字可以不改变位置,有转移方程\[dp_i=\max\limits_{j<i\;\and\;|a_i-a_j|\leq(i-j)\times......
  • 暑期记录7
    7月13今天很热,天气预报总是不准的。我记得在早上看下午有雨,还挺开心的,结果一出门看这大太阳,怎么能下成雨。果然到了下午,还是没有雨。。关键是今天下午小区里还停电了,便更加燥热了。干脆骑着我的小电动车到处溜达,果然路上的感觉还是很凉快的。到家了,来电了。......
  • 暑期记录8
    7月18在抖音上看到中国最热的城市,好家伙,河北占了一大半。天公是不是对河北有仇,天气都这么热。我们是北方啊。北方哪有这么热的。我在石家庄,羡慕着张家口的天,听朋友说在张家口北边,到了晚上要穿棉袄,盖棉被。我去,什么逻辑。乂,万恶的河北啊.........
  • 记录--再也不用手动改package.json的版本号
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助本文的起因是有在代码仓库发包后,同事问我“为什么package.json里的版本还是原来的,有没有更新?”,这个时候我意识到,我们完全没有必要在每次发布的时候还特意去关注这个仓库的版本号,只要在发布打tag的时候同步一下即......
  • CTFer成长记录——CTF之Web专题·初识反序列化
    一、题目链接http://122.114.252.87:1110/index2.php前置知识:序列化与反序列化序列化是将变量转换成可保存或传输的字符串,实现函数是:serialize();反序列化是:将字符串转换成变量,是一个逆过程。实现的函数式:unserialize();序列化:上面的结果是对一个对象的打印,后面是序列化......
  • 三台服务器配置简易Kafka集群+debug记录
    使用了3台阿里云服务器做实验,搭建kafka集群,可以通过java程序生产消息到云服务器。中途遇到许多问题,仅在此记录一些配置信息,安装过程省略。服务器信息hostname私网IP公网IPserver001172.24.16.13260.205.217.197server002172.17.67.3859.110.155.165server0......
  • .NET6 微服务架构实战系列---记录Swaager在分层项目中实体层注释不显示的问题
    一、分层架构Swagger配置问题Dtos在Application类库中,Swagger按照正常配置,只会引用API层的XML文件这个时候我们打开Swagger是看不到实体层注释的二、分层项目Swagger配置2.1首先勾选生成API文档文件2.2然后在Program.cs文件中配置OK!重新生成下项目文件,再次启......
  • 记录下Jenkins的使用
    前言文章主要记录下自己搭建前端CI/CD的整个流程。环境搭建一台安装了centos7.x系统的主机安装Java环境//安装>sudoyuminstalljava//测试是否安装成功>java-version安装wget>sudoyuminstallwget安装jenkins//设置镜像源>sudowget-O/etc/yum.repos.d/jenkins......