加载中…

返回上一页

2022NOIP A层联测35

声明:本文为博客园 1Liu 原创文章. 如果您看到此声明一般是该内容由其它网站通过脚本获取以骗取流量,为保证体验请至原文查看. 原文地址:https://www.cnblogs.com/1Liu/p/16926064.html

最后一篇正经博客了.

下发文件(密码为原 accoders 比赛密码)

弹珠游戏

发现 RGB 的个数对于每个人,选的状态一定只有选的最多的、最多和其次的、最多其次与最少的. 求一下方案数,乘一下 n! 即可(就是每个人排列).

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define rg register
#define rll rg ll
#define pll pair<ll,ll>
#define maxn 300001
#define mod 998244353
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
inline ll read()
{
	rg bool f=0;rll x=0;rg char ch=getchar();while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();return f?-x:x;
}
inline void write(rll x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10|'0'); }
ll n,tag[maxn],ans=1;
char s[maxn];
vector<ll> posr,posg,posb;
int main()
{
	freopen("A.in","r",stdin); freopen("A.out","w",stdout);
	n=read(); scanf("%s",s+1);
	for(rll i=1;i<=(n<<1)+n;i++) (s[i]=='R'?posr:s[i]=='G'?posg:posb).emplace_back(i);
	for(rll i=0;i<n;i++) tag[min({ posr[i],posg[i],posb[i] })]=-1,tag[max({ posr[i],posg[i],posb[i] })]=1;
	for(rll i=1,l=0,r=0;i<=(n<<1)+n;i++)
	{
		if(!~tag[i]) l++; else if(!tag[i]) (ans*=l--)%=mod,r++; else (ans*=r--)%=mod;
	}
	for(rll i=1;i<=n;i++) (ans*=i)%=mod; write(ans);
	return 0;
}

晚会

并查集,求最大生成树.

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define rg register
#define rll rg ll
#define pll pair<ll,ll>
#define maxn 300001
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
inline ll read()
{
	rg bool f=0;rll x=0;rg char ch=getchar();while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();return f?-x:x;
}
inline void write(rll x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10|'0'); }
struct node
{
	ll a,b,d;
	inline friend bool operator<(rg node a,rg node b) { return a.d>b.d; }
}a[maxn];
ll n,m,f[maxn],sz[maxn],tot,ans;
inline ll find(rll x) { if(x^f[x]) f[x]=find(f[x]); return f[x]; }
int main()
{
	freopen("B.in","r",stdin); freopen("B.out","w",stdout);
	n=read();m=read(); for(rll i=1;i<=m;i++) a[i]=(node){ read(),read(),read() }; sort(a+1,a+m+1);
	for(rll i=1;i<=n;i++) sz[i]=1,f[i]=i;
	for(rll i=1;i<=m;i++)
	{
		if((i^1)&&a[i].d<a[i-1].d)
			for(rll j=i;j<=m;j--) { if(a[i].d^a[j].d) break; if(find(a[j].a)==find(a[j].b)) { puts("-1");return 0; }}
		if(find(a[i].a)^find(a[i].b))
			tot+=sz[find(a[i].a)]*sz[find(a[i].b)],sz[find(a[i].a)]+=sz[find(a[i].b)],f[find(a[i].b)]=find(a[i].a);
		ans+=(a[i].d-a[i+1].d)*tot;
	}
	write(ans+=(n*(n-1)>>1)-tot);
	return 0;
}

优美的字符串

选举

莫队+线段树. 将询问按照左端点所在块分组.

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define rg register
#define rll rg ll
#define pll pair<ll,ll>
#define maxn 100001
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
inline ll read()
{
	rg bool f=0;rll x=0;rg char ch=getchar();while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();return f?-x:x;
}
inline void write(rll x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10|'0'); }
ll n,m,q,sq,a[maxn],b[maxn],mx[maxn],st[maxn],ed[maxn],bel[maxn],ans[maxn],t[maxn];
vector<pll> g[maxn];
unordered_map<ll,ll> mp;
struct node
{
	ll l,r,vl,vr,id;
	inline friend bool operator<(rg node a,rg node b) { if(bel[a.l]==bel[b.l]) return a.r<b.r; return bel[a.l]<bel[b.l]; }
}c[maxn];
class block
{
	public:
	ll sq,v[maxn],mx[maxn],st[maxn],ed[maxn],bel[maxn];
	inline void init()
	{
		sq=__builtin_sqrt(m); for(rll i=1;i<=sq;i++) st[i]=m/sq*(i-1)+1,ed[i]=m/sq*i; ed[sq]=m;
		for(rll i=1;i<=sq;i++) for(rll j=st[i];j<=ed[i];j++) bel[j]=i;
	}
	inline void clear() { for(rll i=1;i<=sq;i++) mx[i]=0; for(rll i=1;i<=m;i++) v[i]=0; }
	inline void upd(rll x,rll y) { mx[bel[x]]=max(mx[bel[x]],v[x]+=y); }
	inline ll query(rll l,rll r)
	{
		rll ans=0; if(bel[l]==bel[r]) { for(rll i=l;i<=r;i++) ans=max(ans,v[i]); return ans; }
		for(rll i=l;i<=ed[bel[l]];i++) ans=max(ans,v[i]); for(rll i=st[bel[r]];i<=r;i++) ans=max(ans,v[i]);
		for(rll i=bel[l]+1;i<bel[r];i++) ans=max(ans,mx[i]); return ans;
	}
}s;
inline void upd(rll x,rg bool mod) { s.upd(a[x],mod?b[x]:-b[x]); }
int main()
{
	freopen("D.in","r",stdin); freopen("D.out","w",stdout);
	n=read();m=read();q=read(); sq=__builtin_sqrt(n); for(rll i=1;i<=n;i++) a[i]=read(); for(rll i=1;i<=n;i++) b[i]=read();
	for(rll i=1;i<=sq;i++) st[i]=n/sq*(i-1)+1,ed[i]=n/sq*i; ed[sq]=n; for(rll i=1;i<=sq;i++) for(rll j=st[i];j<=ed[i];j++) bel[j]=i;
	for(rll i=1;i<=q;i++) c[i]=(node){ read(),read(),read(),read(),i }; sort(c+1,c+q+1); s.init();
	for(rll i=1,l,r,x=1;i<=sq;i++)
	{
		s.clear();l=ed[i]+1,r=ed[i];while(x<=q&&bel[c[x].l]<i) x++;
		while(x<=q&&bel[c[x].l]==i)
		{
			if(bel[c[x].l]==bel[c[x].r])
			{
				rll t=0;mp.clear(); for(rll j=c[x].l;j<=c[x].r;j++) { mp[a[j]]+=b[j]; if(a[j]>=c[x].vl&&a[j]<=c[x].vr) t=max(t,mp[a[j]]); }
				ans[c[x].id]=t; x++; continue;
			}
			while(r<c[x].r) upd(++r,1); for(rll j=1;j<=s.sq;j++) t[j]=s.mx[j];
			while(l>c[x].l) upd(--l,1); ans[c[x].id]=s.query(c[x].vl,c[x].vr);
			while(l<=ed[i]) upd(l++,0); for(rll j=1;j<=s.sq;j++) s.mx[j]=t[j]; x++;
		}
	}
	for(rll i=1;i<=q;i++) write(ans[i]),putn;
	return 0;
}
posted @ 2022-11-25 18:45  1Liu  阅读(53)  评论(0编辑  收藏  举报